From d5664a7d4493833b8ddb34d17ce7b7906f31d5a8 Mon Sep 17 00:00:00 2001 From: zjli2019 Date: Fri, 13 Oct 2023 09:45:40 +0800 Subject: [PATCH 01/10] rebuild 916 mini: 32k share memory always usable. --- bundles/mini/ING9168xx/meta.json | 2 +- bundles/mini/ING9168xx/platform.bin | Bin 155584 -> 155584 bytes bundles/noos_mini/ING9168xx/meta.json | 2 +- bundles/noos_mini/ING9168xx/platform.bin | Bin 144688 -> 144688 bytes examples/peripheral_console/src/main_shared.c | 2 +- 5 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bundles/mini/ING9168xx/meta.json b/bundles/mini/ING9168xx/meta.json index b595ff0dd..e6c6f6360 100644 --- a/bundles/mini/ING9168xx/meta.json +++ b/bundles/mini/ING9168xx/meta.json @@ -13,6 +13,6 @@ "version": [ 2, 2, - 50 + 51 ] } \ No newline at end of file diff --git a/bundles/mini/ING9168xx/platform.bin b/bundles/mini/ING9168xx/platform.bin index a0618f0cb523392a8145cd698a933e2b3da02dd0..d161cda1189c8e875fa8ba6d3b2ca16b2f3b9770 100644 GIT binary patch delta 33 pcmX@GpYyKS2ms!)3x5Cr delta 33 pcmX@GpYylbVT9>KS2msyA3uFKQ diff --git a/bundles/noos_mini/ING9168xx/meta.json b/bundles/noos_mini/ING9168xx/meta.json index 04ae13476..a44197ace 100644 --- a/bundles/noos_mini/ING9168xx/meta.json +++ b/bundles/noos_mini/ING9168xx/meta.json @@ -13,6 +13,6 @@ "version": [ 2, 2, - 50 + 51 ] } \ No newline at end of file diff --git a/bundles/noos_mini/ING9168xx/platform.bin b/bundles/noos_mini/ING9168xx/platform.bin index 52b01d3d516eb5a598b5e7c43650150a60920c20..6fa312dfcfd0f7fa6fda5d554a26b53fc62efe16 100644 GIT binary patch delta 33 pcmdn+ietkojtT!6jW;o_F=1?LUTeC2ttq4ESw@BJhnbjijR5@94M6|^ delta 33 pcmdn+ietkojtT!6jW#i^F=1?JUTeC2ttq4ESw@cShnbjijR5=a4JH5p diff --git a/examples/peripheral_console/src/main_shared.c b/examples/peripheral_console/src/main_shared.c index 8945f7a75..5c7db9e76 100644 --- a/examples/peripheral_console/src/main_shared.c +++ b/examples/peripheral_console/src/main_shared.c @@ -154,7 +154,7 @@ uint32_t query_deep_sleep_allowed(void *dummy, void *user_data) return PLATFORM_ALLOW_DEEP_SLEEP; #elif (INGCHIPS_FAMILY == INGCHIPS_FAMILY_916) GIO_EnableRetentionGroupA(1); - return PLATFORM_ALLOW_DEEP_SLEEP | PLATFORM_ALLOW_BLE_ONLY_SLEEP; + return PLATFORM_ALLOW_DEEP_SLEEP; #endif } From ef58385c35fc094dd8bd3f4713f0ab9f57a7c225 Mon Sep 17 00:00:00 2001 From: zjli2019 Date: Tue, 17 Oct 2023 12:56:50 +0800 Subject: [PATCH 02/10] update SBC codec. --- examples/voice_remote_ctrl/doc/index.md | 8 +- examples/voice_remote_ctrl/flash_download.ini | 7 +- examples/voice_remote_ctrl/libsbc/LICENSE | 202 +++ .../voice_remote_ctrl/libsbc/include/sbc.h | 217 +++ .../libsbc/src/arm-v7em/sbc.s | 572 ++++++ examples/voice_remote_ctrl/libsbc/src/bits.c | 192 ++ examples/voice_remote_ctrl/libsbc/src/bits.h | 238 +++ examples/voice_remote_ctrl/libsbc/src/sbc.c | 1563 +++++++++++++++++ examples/voice_remote_ctrl/src/audio_adpcm.c | 8 +- examples/voice_remote_ctrl/src/audio_adpcm.h | 6 +- .../voice_remote_ctrl/src/audio_encoder.h | 9 +- .../voice_remote_ctrl/src/audio_input_sim.c | 16 +- examples/voice_remote_ctrl/src/audio_sbc.c | 1065 +---------- examples/voice_remote_ctrl/src/audio_sbc.h | 88 +- .../voice_remote_ctrl/src/audio_sbc_math.h | 72 - .../voice_remote_ctrl/src/audio_sbc_tables.h | 119 -- .../voice_remote_ctrl/src/audio_sbc_types.h | 76 - .../voice_remote_ctrl/src/audio_service.c | 79 +- examples/voice_remote_ctrl/src/profile.c | 30 +- .../voice_remote_ctrl/voice_remote_ctrl.uvopt | 18 +- .../voice_remote_ctrl.uvproj | 120 +- .../voice_remote_ctrl.uvprojx | 109 +- 22 files changed, 3252 insertions(+), 1562 deletions(-) create mode 100644 examples/voice_remote_ctrl/libsbc/LICENSE create mode 100644 examples/voice_remote_ctrl/libsbc/include/sbc.h create mode 100644 examples/voice_remote_ctrl/libsbc/src/arm-v7em/sbc.s create mode 100644 examples/voice_remote_ctrl/libsbc/src/bits.c create mode 100644 examples/voice_remote_ctrl/libsbc/src/bits.h create mode 100644 examples/voice_remote_ctrl/libsbc/src/sbc.c delete mode 100644 examples/voice_remote_ctrl/src/audio_sbc_math.h delete mode 100644 examples/voice_remote_ctrl/src/audio_sbc_tables.h delete mode 100644 examples/voice_remote_ctrl/src/audio_sbc_types.h diff --git a/examples/voice_remote_ctrl/doc/index.md b/examples/voice_remote_ctrl/doc/index.md index 3e564657f..79c365ace 100644 --- a/examples/voice_remote_ctrl/doc/index.md +++ b/examples/voice_remote_ctrl/doc/index.md @@ -18,6 +18,8 @@ Below table shows how to connect the microphone to the Dev-Board for each input |3 | PDM | Not available | MCLK(28),IN(29) | MP34DT01: | Note: for type `0`, audio is playback from a data file (ITU standard testing data), and no microphone is used. +The [data file](../data/itu_female_16k.bin) containing raw PCM samples needs to be downloaded to +[`SAMPLES_LOCATION`](../src/audio_input_sim.c). ## Audio Codec @@ -25,11 +27,13 @@ Supported codecs: | Name | Identifier | Note | | :-----------: | :------------------- | :------------------- | -| 4-bit ADPCM | `AUDIO_CODEC_ALG_ADPCM` | **default** | -| SBC | `AUDIO_CODEC_ALG_SBC` | _experimental_ | +| 4-bit ADPCM | `AUDIO_CODEC_ALG_ADPCM` | | +| SBC | `AUDIO_CODEC_ALG_SBC` | | Audio codec can be configured by defining `AUDIO_CODEC_ALG` to the corresponding codec identifier. +SBC codec implementation used in this project is [libsbc](https://github.com/google/libsbc). + ## Test Download this example to a Dev-Board, use _ING BLE_ to connect to it. Keep the "Capture" button pressed diff --git a/examples/voice_remote_ctrl/flash_download.ini b/examples/voice_remote_ctrl/flash_download.ini index 56f586ed3..36867ca9a 100644 --- a/examples/voice_remote_ctrl/flash_download.ini +++ b/examples/voice_remote_ctrl/flash_download.ini @@ -13,6 +13,7 @@ protection.unlock=1 UseScript=0 script= ResetReservedFlash=0 +writeprotection.enabled=0 [bin-0] Name=Burn Bin #1 @@ -44,9 +45,9 @@ family=ing916 [bin-2] Name=Burn Bin #3 -Checked=0 -FileName= -Address=16384 +Checked=1 +FileName=.\data\itu_female_16k.bin +Address=33820672 [bin-3] Name=Burn Bin #4 diff --git a/examples/voice_remote_ctrl/libsbc/LICENSE b/examples/voice_remote_ctrl/libsbc/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/examples/voice_remote_ctrl/libsbc/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. diff --git a/examples/voice_remote_ctrl/libsbc/include/sbc.h b/examples/voice_remote_ctrl/libsbc/include/sbc.h new file mode 100644 index 000000000..fd7c3862e --- /dev/null +++ b/examples/voice_remote_ctrl/libsbc/include/sbc.h @@ -0,0 +1,217 @@ +/****************************************************************************** + * + * Copyright 2022 Google LLC + * + * Licensed 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. + * + ******************************************************************************/ + +/** + * Subband Codec (SBC) + * + * This implementation conforms to : + * Advanced Audio Distribution v1.3.2 - Appendix B + * Hands-Free Profile v1.8 - Appendix A + * Bluetooth Profile Specification + * + * --- + * + * Antoine SOULIER, Tempow / Google LLC + * + */ + +#ifndef __SBC_H +#define __SBC_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + + +/** + * Normative SBC Constants / Limits + */ + +#define SBC_HEADER_SIZE ( 4) +#define SBC_PROBE_SIZE SBC_HEADER_SIZE + +#define SBC_MAX_SUBBANDS ( 8) +#define SBC_MAX_BLOCKS (16) +#define SBC_MAX_SAMPLES (SBC_MAX_BLOCKS * SBC_MAX_SUBBANDS) + +#define SBC_MSBC_SAMPLES (120) +#define SBC_MSBC_SIZE ( 57) + + +/** + * SBC Frame description, include : + * - The sampling frequency + * - The channel mode + * - The number of blocks, subbands encoded + * - The bit allocation method and bitpool selected + */ + +enum sbc_freq +{ + SBC_FREQ_16K, + SBC_FREQ_32K, + SBC_FREQ_44K1, + SBC_FREQ_48K, + + SBC_NUM_FREQ +}; + +enum sbc_mode +{ + SBC_MODE_MONO, + SBC_MODE_DUAL_CHANNEL, + SBC_MODE_STEREO, + SBC_MODE_JOINT_STEREO, + + SBC_NUM_MODE +}; + +enum sbc_bam +{ + SBC_BAM_LOUDNESS, + SBC_BAM_SNR, + + SBC_NUM_BAM +}; + +struct sbc_frame +{ + bool msbc; + enum sbc_freq freq; + enum sbc_mode mode; + enum sbc_bam bam; + int nblocks, nsubbands; + int bitpool; +}; + + +/** + * Algorithmic codec delay (Encoding + Decoding) + * From number of subbands or frame configuration + */ + +#define SBC_DELAY_SUBBANDS(nsubbands) \ + (10 * (nsubbands)) + +#define SBC_DELAY(frame) \ + SBC_DELAY_SUBBANDS((frame)->nsubbands) + + +/** + * Private context + */ + +struct sbc_dstate +{ + int idx; + int16_t alignas(sizeof(int)) v[2][SBC_MAX_SUBBANDS][10]; +}; + +struct sbc_estate +{ + int idx; + int16_t alignas(sizeof(int)) x[2][SBC_MAX_SUBBANDS][5]; + int32_t y[4]; +}; + +typedef struct sbc +{ + int nchannels; + int nblocks, nsubbands; + + union { + struct sbc_dstate dstates[2]; + struct sbc_estate estates[2]; + }; + +} sbc_t; + + +/** + * Return the sampling frequency in Hz + * freq The frequency enum value + * return The Hz frequency value + */ +int sbc_get_freq_hz(enum sbc_freq freq); + +/** + * Return the frame size from a frame description + * frame The frame description + * return The size of the frame, 0 on error + */ +unsigned sbc_get_frame_size(const struct sbc_frame *frame); + +/** + * Return the bitrate from a frame description + * frame The frame description + * return The bitrate in bps, 0 on error + */ +unsigned sbc_get_frame_bitrate(const struct sbc_frame *frame); + +/** + * Reset of the context + * sbc Context to reset + */ +void sbc_reset(sbc_t *sbc); + +/** + * Probe the data and return frame description + * data Data pointer with at least ̀`SBC_PROBE_SIZE` bytes + * frame Frame description + * return 0 on success, -1 otherwise + */ +int sbc_probe(const void *data, struct sbc_frame *frame); + +/** + * Decode a frame + * sbc Decoding context + * data, size Frame data, and maximum readable size + * frame Return of frame description + * pcmx Output PCM buffer for channel L/R + * pitchx Number of samples between two consecutives + * return 0 on success, -1 otherwise + * + * `data` can be NULL to enable PLC emulation + */ +int sbc_decode(sbc_t *sbc, + const void *data, unsigned size, struct sbc_frame *frame, + int16_t *pcml, int pitchl, int16_t *pcmr, int pitchr); + +/** + * Encode a frame + * sbc Encoding context + * pcmx Input PCM buffer for channel L/R + * pitchx Number of samples between two consecutives + * frame Frame description as encoding parameters + * data, size Output frame data, and maximum writable size + * return 0 on success, -1 otherwise + */ +int sbc_encode(sbc_t *sbc, + const int16_t *pcml, int pitchl, const int16_t *pcmr, int pitchr, + const struct sbc_frame *frame, void *data, unsigned size); + + +#ifdef __cplusplus +} +#endif + +#endif /* !__SBC_H */ diff --git a/examples/voice_remote_ctrl/libsbc/src/arm-v7em/sbc.s b/examples/voice_remote_ctrl/libsbc/src/arm-v7em/sbc.s new file mode 100644 index 000000000..a8dd34e83 --- /dev/null +++ b/examples/voice_remote_ctrl/libsbc/src/arm-v7em/sbc.s @@ -0,0 +1,572 @@ +/****************************************************************************** + * + * Copyright 2022 Google LLC + * + * Licensed 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. + * + ******************************************************************************/ + + .syntax unified + .thumb + + +/** + * Synthesize samples of a 4 subbands block + * state Previous transformed samples of the channel + * in Sub-band input samples + * scale Scale factor of samples + * out Output adress of PCM samples + * pitch Number of PCM samples between two consecutive + */ + + .text + + .align 4 + +cos_table_4: + .short 5793, 5793, -8192, -8192, 3135, -7568 + +win_table_4_0: + .short 0, -126, -358, -848, -4443, -9644, 4443, -848, 358, -126 + .short 0, -126, -358, -848, -4443, -9644, 4443, -848 + .short + .short -18, -128, -670, -201, -6389, -9235, 2544, -1055, 100, -90 + .short -18, -128, -670, -201, -6389, -9235, 2544, -1055 + .short + .short -49, -61, -946, 944, -8082, -8082, 944, -946, -61, -49 + .short -49, -61, -946, 944, -8082, -8082, 944, -946 + .short + .short -90, 100, -1055, 2544, -9235, -6389, -201, -670, -128, -18 + .short -90, 100, -1055, 2544, -9235, -6389, -201, -670 + +win_table_4_1: + .short -126, -358, -848, -4443, -9644, 4443, -848, 358, -126 + .short 0, -126, -358, -848, -4443, -9644, 4443, -848, 358 + .short + .short -128, -670, -201, -6389, -9235, 2544, -1055, 100, -90 + .short -18, -128, -670, -201, -6389, -9235, 2544, -1055, 100 + .short + .short -61, -946, 944, -8082, -8082, 944, -946, -61, -49 + .short -49, -61, -946, 944, -8082, -8082, 944, -946, -61 + .short + .short 100, -1055, 2544, -9235, -6389, -201, -670, -128, -18 + .short -90, 100, -1055, 2544, -9235, -6389, -201, -670, -128 + + .thumb_func + .global sbc_synthesize_4 + +sbc_synthesize_4: + + push { r3-r11, lr } /* Push registers */ + + /* DCT of subbands samples .............................................. */ + + ldm r1 , { r6-r7 } /* r6-7 = s[0-3] */ + + shasx r5 , r6 , r7 /* r5 = s12 : d03 */ + shsax r6 , r6 , r7 /* r6 = d12 : s03 */ + + pkhtb r4 , r5 , r6 /* r4 = s12 : s03 */ + pkhtb r5 , r6 , r5 /* r5 = d12 : d03 */ + + ldr r1 , [r0], #4 /* r1 = state->idx */ + mov r11 , r0 /* r11 = &state->v[0] */ + mov r12 , r0 /* r12 = &state->v[0] */ + ands r10 , r1 , #1 /* r10 = state->idx & 1, Z = r10 EQ 0 */ + ite ne /* If-Then-Else ... */ + addne r11 , r11 , #160 /* ... r11 = &state->v[1] */ + addeq r12 , r12 , #160 /* ... r12 = &state->v[1] */ + + cmp r1 , #0 /* Compare state->idx */ + ite ne /* If-Then-Else ... */ + rsbne r1 , r1 , #10 /* ... r1 = state->idx ? */ + moveq r1 , #0 /* ... 10 - state->idx : 0 */ + add r11 , r11 , r1 , LSL #1 /* r11 = &state->v[ odd][0][idx] */ + add r12 , r12 , r1 , LSL #1 /* r12 = &state->v[!odd][0][idx] */ + + adr r14 , cos_table_4 /* r14 = &cos_table */ + + add r2 , r2 , #12 /* r2 = scale + 12 = shr */ + mov r1 , #1 /* r1 = 1 */ + sub r8 , r2 , #1 /* r8 = shr - 1 */ + lsl r1 , r1 , r8 /* r1 = 1 << (shr - 1) */ + + ldm r14!, { r7-r9 } /* r7-r10 = cos( 2,2, -0,-0, 3,-1 ) */ + + smlsd r6 , r4 , r7 , r1 /* r6 += s03 cos(2) - s12 cos(2) */ + asr r6 , r2 /* r6 = a0 */ + rsb r3 , r6 , #0 /* r3 = -a0 */ + + ssat r6 , #16 , r6 /* r6 = sat( a0) */ + strh r6 , [r11, #0] /* Store v0[0] */ + + ssat r6 , #16 , r3 /* r6 = sat(-a0) */ + strh r6 , [r12, #0] /* Store v1[0] */ + + smlad r6 , r4 , r8 , r1 /* r6 += -s03 cos(0) + -s12 cos(0) */ + asr r6 , r2 /* r6 = b1 */ + ssat r6 , #16 , r6 /* r6 = sat(b1) */ + strh r6 , [r12, #40] /* Store v1[2] */ + + smlad r6 , r5 , r9 , r1 /* r6 += d03 cos(3) + -d12 cos(1) */ + asr r6 , r2 /* r6 = a1 */ + rsb r3 , r6 , #0 /* r6 = -a1 */ + + ssat r6 , #16 , r6 /* r6 = sat(a1) */ + strh r6 , [r11, #20] /* Store v0[1] */ + + ssat r6 , #16 , r3 /* r6 = sat(-a1) */ + strh r6 , [r11, #60] /* Store v0[3] */ + + smlsdx r6 , r5 , r9 , r1 /* r6 += -d03 cos(3) - -d12 cos(3) */ + asr r6 , r2 /* r6 = b0 */ + ssat r6 , #16 , r6 /* r6 = sat(b0) */ + strh r6 , [r12, #20] /* Store v1[1] */ + strh r6 , [r12, #60] /* Store v1[3] */ + + /* Update state index ................................................... */ + + ldr r1 , [r0, #-4] /* r1 = state->idx */ + cmp r1 , #9 /* Compare state->idx */ + ite lt /* If-Then-Else ... */ + addlt r2 , r1 , #1 /* ... r2 = state->idx < 9 ? */ + movge r2 , #0 /* ... state->idx + 1 : 0 */ + str r2 , [r0, #-4] /* state->idx = r2 */ + + /* Window and output samples ............................................ */ + + mov r12 , r0 /* r12 = &state->v[0] */ + ands r11 , r1 , #1 /* r11 = state->idx & 1, Z = r11 EQ 0 */ + itte ne /* If-Then-Then-Else ... */ + addne r12 , r12 , #160 /* ... r12 = &state->v[1] */ + adrne r14 , win_table_4_1 /* ... r14 = &win_table_0 */ + adreq r14 , win_table_4_0 /* ... r14 = &win_table_1 */ + + sub r1 , r1 , r11 /* r1 = state->idx &~ 1 */ + add r14 , r14 , r1 , LSL 1 /* r14 = &window + state->idx */ + + pop { r1 } /* r1 = out_ptr */ + ldr r2 , [sp, #36] /* r2 = pitch */ + + mov r0 , #0x1000 /* r0 = 1 << 12 */ + + ldm r12!, { r4-r7 } /* r4-r7 = u[0][0-7] */ + ldm r14!, { r8-r11 } /* r8-r11 = w[0][0-7] */ + + smlad r3 , r4 , r8 , r0 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r5 , r9 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r6 , r10 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r7 , r11 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ldm r12!, { r4-r7 } /* r4-r7 = u[0][8-9], u[1][0-5] */ + ldr r8 , [r14], #20 /* r8 = w[0][8-9], r14 = &w[1] */ + ldm r14!, { r9-r11 } /* r9-r11 = w[1][0-5] */ + + smlad r3 , r4 , r8 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ssat r3 , #16 , r3 , ASR #13 /* r3 = s[0] */ + strh r3 , [r1] /* *out = s[0] */ + add r1 , r1 , r2 , LSL #1 /* out += pitch */ + + smlad r3 , r5 , r9 , r0 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r6 , r10 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r7 , r11 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ldm r12!, { r4-r7 } /* r4-r7 = u[1][6-9], u[2][0-3] */ + ldrd r8 , r9 , [r14], #24 /* r10-r11 = w[1][6-9], r14 = &w[2] */ + ldm r14!, { r10-r11 } /* r9-r11 = w[2][0-3] */ + + smlad r3 , r4 , r8 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r5 , r9 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ssat r3 , #16 , r3 , ASR #13 /* r3 = s[1] */ + strh r3 , [r1] /* *out = s[1] */ + add r1 , r1 , r2 , LSL #1 /* out += pitch */ + + smlad r3 , r6 , r10 , r0 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r7 , r11 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ldm r12!, { r4-r7 } /* r4-r7 = u[2][4-9], u[3][0-1] */ + ldm r14!, { r8-r9 } /* r8-r9 = w[2][4-7] */ + ldr r10 , [r14], #20 /* r10 = w[2][8-9], r14 = &w[3] */ + ldr r11 , [r14], #4 /* r11 = w[3][0-1] */ + + smlad r3 , r4 , r8 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r5 , r9 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r6 , r10 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ssat r3 , #16 , r3 , ASR #13 /* r3 = s[2] */ + strh r3 , [r1] /* *out = s[2] */ + add r1 , r1 , r2 , LSL #1 /* out += pitch */ + + smlad r3 , r7 , r11 , r0 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ldm r12!, { r4-r7 } /* r4-r7 = u[3][2-9] */ + ldm r14!, { r8-r10 } /* r9-r11 = w[3][2-7] */ + ldr r11 , [r14] /* r10 = w[3][8-9], r14 = &w[4] */ + + smlad r3 , r4 , r8 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r5 , r9 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r6 , r10 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r7 , r11 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ssat r3 , #16 , r3 , ASR #13 /* r3 = s[3] */ + strh r3 , [r1] /* *out = s[3] */ + + pop { r4-r11, pc } /* Pop registers and return */ + + +/** + * Synthesize samples of a 8 subbands block + * state Previous transformed samples of the channel + * in Sub-band input samples + * scale Scale factor of samples + * out Output adress of PCM samples + * pitch Number of PCM samples between two consecutive + */ + + .text + + .align 4 + +cos_table_8: + .short 5793, -5793, -8192, -8192 + .short 7568, -7568, 3135, -3135 + .short 4551, -6811, 1598, -8035 + +win_table_8_0: + .short 0, -132, -371, -848, -4456, -9631, 4456, -848, 371, -132 + .short 0, -132, -371, -848, -4456, -9631, 4456, -848 + + .short -10, -138, -526, -580, -5438, -9528, 3486, -1004, 229, -117 + .short -10, -138, -526, -580, -5438, -9528, 3486, -1004 + + .short -22, -131, -685, -192, -6395, -9224, 2561, -1063, 108, -97 + .short -22, -131, -685, -192, -6395, -9224, 2561, -1063 + + .short -36, -106, -835, 322, -7287, -8734, 1711, -1042, 12, -75 + .short -36, -106, -835, 322, -7287, -8734, 1711, -1042 + + .short -54, -59, -960, 959, -8078, -8078, 959, -960, -59, -54 + .short -54, -59, -960, 959, -8078, -8078, 959, -960 + + .short -75, 12, -1042, 1711, -8734, -7287, 322, -835, -106, -36 + .short -75, 12, -1042, 1711, -8734, -7287, 322, -835 + + .short -97, 108, -1063, 2561, -9224, -6395, -192, -685, -131, -22 + .short -97, 108, -1063, 2561, -9224, -6395, -192, -685 + + .short -117, 229, -1004, 3486, -9528, -5438, -580, -526, -138, -10 + .short -117, 229, -1004, 3486, -9528, -5438, -580, -526 + +win_table_8_1: + .short -132, -371, -848, -4456, -9631, 4456, -848, 371, -132 + .short 0, -132, -371, -848, -4456, -9631, 4456, -848, 371 + + .short -138, -526, -580, -5438, -9528, 3486, -1004, 229, -117 + .short -10, -138, -526, -580, -5438, -9528, 3486, -1004, 229 + + .short -131, -685, -192, -6395, -9224, 2561, -1063, 108, -97 + .short -22, -131, -685, -192, -6395, -9224, 2561, -1063, 108 + + .short -106, -835, 322, -7287, -8734, 1711, -1042, 12, -75 + .short -36, -106, -835, 322, -7287, -8734, 1711, -1042, 12 + + .short -59, -960, 959, -8078, -8078, 959, -960, -59, -54 + .short -54, -59, -960, 959, -8078, -8078, 959, -960, -59 + + .short 12, -1042, 1711, -8734, -7287, 322, -835, -106, -36 + .short -75, 12, -1042, 1711, -8734, -7287, 322, -835, -106 + + .short 108, -1063, 2561, -9224, -6395, -192, -685, -131, -22 + .short -97, 108, -1063, 2561, -9224, -6395, -192, -685, -131 + + .short 229, -1004, 3486, -9528, -5438, -580, -526, -138, -10 + .short -117, 229, -1004, 3486, -9528, -5438, -580, -526, -138 + + .thumb_func + .global sbc_synthesize_8 + +sbc_synthesize_8: + + push { r3-r11, lr } /* Push registers */ + + /* DCT of subbands samples .............................................. */ + + ldm r1 , { r8-r11 } /* r8-11 = s[0-7] */ + + shasx r6 , r8 , r11 /* r6 = s16 : d07 */ + shasx r7 , r9 , r10 /* r7 = s34 : d25 */ + shsax r8 , r8 , r11 /* r8 = d16 : s07 */ + shsax r9 , r9 , r10 /* r9 = d34 : s25 */ + + pkhtb r4 , r7 , r8 /* r4 = s34 : s07 */ + pkhtb r5 , r6 , r9 /* r5 = s16 : s25 */ + pkhtb r6 , r9 , r6 /* r6 = d34 : d07 */ + pkhtb r7 , r8 , r7 /* r7 = d16 : d25 */ + + ldr r1 , [r0], #4 /* r1 = state->idx */ + mov r11 , r0 /* r11 = &state->v[0] */ + mov r12 , r0 /* r12 = &state->v[0] */ + ands r10 , r1 , #1 /* r10 = state->idx & 1, Z = r10 EQ 0 */ + ite ne /* If-Then-Else ... */ + addne r11 , r11 , #160 /* ... r11 = &state->v[1] */ + addeq r12 , r12 , #160 /* ... r12 = &state->v[1] */ + + cmp r1 , #0 /* Compare state->idx */ + ite ne /* If-Then-Else ... */ + rsbne r1 , r1 , #10 /* ... r1 = state->idx ? */ + moveq r1 , #0 /* ... 10 - state->idx : 0 */ + add r11 , r11 , r1 , LSL #1 /* r11 = &state->v[ odd][0][idx] */ + add r12 , r12 , r1 , LSL #1 /* r12 = &state->v[!odd][0][idx] */ + + adr r14 , cos_table_8 /* r14 = &cos_table */ + + add r2 , r2 , #12 /* r2 = scale + 12 = shr */ + mov r1 , #1 /* r1 = 1 */ + sub r8 , r2 , #1 /* r8 = shr - 1 */ + lsl r1 , r1 , r8 /* r1 = 1 << (shr - 1) */ + + ldm r14!, { r9-r10 } /* r9-r10 = cos( 4, -4, -0, -0 ) */ + + smlsd r8 , r4 , r9 , r1 /* r8 += s07 cos(4) - -s34 cos(4) */ + smlsdx r8 , r5 , r9 , r8 /* r8 += -s25 cos(4) - s16 cos(4) */ + asr r8 , r2 /* r8 = a0 */ + rsb r3 , r8 , #0 /* r3 = -a0 */ + + ssat r8 , #16 , r8 /* r8 = sat( a0) */ + strh r8 , [r11, #0] /* Store v0[0] */ + + ssat r8 , #16 , r3 /* r8 = sat(-a0) */ + strh r8 , [r12, #0] /* Store v1[0] */ + + smlad r8 , r4 , r10 , r1 /* r8 += -s07 cos(0) + -s16 cos(0) */ + smlad r8 , r5 , r10 , r8 /* r8 += -s25 cos(0) + -s34 cos(0) */ + asr r8 , r2 /* r8 = b3 */ + ssat r8 , #16 , r8 /* r8 = sat(b3) */ + strh r8 , [r12, #80] /* Store v1[4] */ + + ldm r14!, { r9-r10 } /* r9-r10 = cos16( 2, -2, 6, -6 ) */ + + smlad r8 , r4 , r10 , r1 /* r8 += s07 cos(6) + -s34 cos(6) */ + smlad r8 , r5 , r9 , r8 /* r8 += s25 cos(2) + -s16 cos(2) */ + asr r8 , r2 /* r8 = a2 */ + rsb r3 , r8 , #0 /* r3 = -a2 */ + + ssat r8 , #16 , r8 /* r8 = sat(a2) */ + strh r8 , [r11, #40] /* Store v0[2] */ + + ssat r8 , #16 , r3 /* r8 = sat(-a2) */ + strh r8 , [r11, #120] /* Store v0[6] */ + + smladx r8 , r4 , r9 , r1 /* r8 += -s07 cos(2) + s34 cos(2) */ + smlad r8 , r5 , r10 , r8 /* r8 += s25 cos(6) - s16 cos(6) */ + asr r8 , r2 /* r8 = b1 */ + ssat r8 , #16 , r8 /* r8 = sat(b1) */ + strh r8 , [r12, #40] /* Store v1[2] */ + strh r8 , [r12, #120] /* Store v1[6] */ + + ldm r14!, { r9-r10 } /* r9-r10 = cos( 5, -3, 7, -1 ) */ + + smlsd r8 , r6 , r9 , r1 /* r8 += d07 cos(5) - -d34 cos(3) */ + smlad r8 , r7 , r10 , r8 /* r8 += d25 cos(7) + -d16 cos(1) */ + asr r8 , r2 /* r8 = a1 */ + rsb r3 , r8 , #0 /* r3 = -a1 */ + + ssat r8 , #16 , r8 /* r8 = sat(a1) */ + strh r8 , [r11, #20] /* Store v0[1] */ + + ssat r8 , #16 , r3 /* r8 = sat(-a1) */ + strh r8 , [r11, #140] /* Store v0[7] */ + + smladx r8 , r6 , r9 , r1 /* r8 += -d07 cos(3) + d34 cos(5) */ + smlsdx r8 , r10 , r7 , r8 /* r8 += d16 cos(7) - -d25 cos(1) */ + asr r8 , r2 /* r8 = b0 */ + ssat r8 , #16 , r8 /* r8 = sat(b0) */ + strh r8 , [r12, #20] /* Store v1[1] */ + strh r8 , [r12, #140] /* Store v1[7] */ + + mov r8 , #0 /* r14 = 0 */ + ssub16 r9 , r8 , r9 /* r9 = cos( -5, 3 ) */ + + smlad r8 , r6 , r10 , r1 /* r8 += d07 cos(7) + -d34 cos(1) */ + smladx r8 , r7 , r9 , r8 /* r8 += d25 cos(3) + -d16 cos(5) */ + asr r8 , r2 /* r8 = a3 */ + rsb r3 , r8 , #0 /* r3 = -a3 */ + + ssat r8 , #16 , r8 /* r8 = sat(a3) */ + strh r8 , [r11, #60] /* Store v0[3] */ + + ssat r8 , #16 , r3 /* r8 = sat(-a3) */ + strh r8 , [r11, #100] /* Store v0[5] */ + + smlsdx r8 , r6 , r10 , r1 /* r8 += -d07 cos(1) - d34 cos(7) */ + smlsd r8 , r7 , r9 , r8 /* r8 += -d25 cos(5) - d16 cos(3) */ + asr r8 , r2 /* r8 = b2 */ + ssat r8 , #16 , r8 /* r8 = sat(b2) */ + strh r8 , [r12, #60] /* Store v1[3] */ + strh r8 , [r12, #100] /* Store v1[5] */ + + /* Update state index ................................................... */ + + ldr r1 , [r0, #-4] /* r1 = state->idx */ + cmp r1 , #9 /* Compare state->idx */ + ite lt /* If-Then-Else ... */ + addlt r2 , r1 , #1 /* ... r2 = state->idx < 9 ? */ + movge r2 , #0 /* ... state->idx + 1 : 0 */ + str r2 , [r0, #-4] /* state->idx = r2 */ + + /* Window and output samples ............................................ */ + + mov r12 , r0 /* r12 = &state->v[0] */ + ands r11 , r1 , #1 /* r11 = state->idx & 1, Z = r11 EQ 0 */ + itte ne /* If-Then-Then-Else ... */ + addne r12 , r12 , #160 /* ... r12 = &state->v[1] */ + adrne r14 , win_table_8_1 /* ... r14 = &win_table_0 */ + adreq r14 , win_table_8_0 /* ... r14 = &win_table_1 */ + + sub r1 , r1 , r11 /* r1 = state->idx &~ 1 */ + add r14 , r14 , r1 , LSL 1 /* r14 = &window + state->idx */ + + pop { r1 } /* r1 = out_ptr */ + ldr r2 , [sp, #36] /* r2 = pitch */ + + mov r0 , #0x1000 /* r0 = 1 << 12 */ + + ldm r12!, { r4-r7 } /* r4-r7 = u[0][0-7] */ + ldm r14!, { r8-r11 } /* r8-r11 = w[0][0-7] */ + + smlad r3 , r4 , r8 , r0 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r5 , r9 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r6 , r10 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r7 , r11 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ldm r12!, { r4-r7 } /* r4-r7 = u[0][8-9], u[1][0-5] */ + ldr r8 , [r14], #20 /* r8 = w[0][8-9], r14 = &w[1] */ + ldm r14!, { r9-r11 } /* r9-r11 = w[1][0-5] */ + + smlad r3 , r4 , r8 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ssat r3 , #16 , r3 , ASR #13 /* r3 = s[0] */ + strh r3 , [r1] /* *out = s[0] */ + add r1 , r1 , r2 , LSL #1 /* out += pitch */ + + smlad r3 , r5 , r9 , r0 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r6 , r10 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r7 , r11 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ldm r12!, { r4-r7 } /* r4-r7 = u[1][6-9], u[2][0-3] */ + ldrd r8 , r9 , [r14], #24 /* r10-r11 = w[1][6-9], r14 = &w[2] */ + ldm r14!, { r10-r11 } /* r9-r11 = w[2][0-3] */ + + smlad r3 , r4 , r8 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r5 , r9 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ssat r3 , #16 , r3 , ASR #13 /* r3 = s[1] */ + strh r3 , [r1] /* *out = s[1] */ + add r1 , r1 , r2 , LSL #1 /* out += pitch */ + + smlad r3 , r6 , r10 , r0 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r7 , r11 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ldm r12!, { r4-r7 } /* r4-r7 = u[2][4-9], u[3][0-1] */ + ldm r14!, { r8-r9 } /* r8-r9 = w[2][4-7] */ + ldr r10 , [r14], #20 /* r10 = w[2][8-9], r14 = &w[3] */ + ldr r11 , [r14], #4 /* r11 = w[3][0-1] */ + + smlad r3 , r4 , r8 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r5 , r9 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r6 , r10 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ssat r3 , #16 , r3 , ASR #13 /* r3 = s[2] */ + strh r3 , [r1] /* *out = s[2] */ + add r1 , r1 , r2 , LSL #1 /* out += pitch */ + + smlad r3 , r7 , r11 , r0 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ldm r12!, { r4-r7 } /* r4-r7 = u[3][2-9] */ + ldm r14!, { r8-r10 } /* r9-r11 = w[3][2-7] */ + ldr r11 , [r14], #20 /* r10 = w[3][8-9], r14 = &w[4] */ + + smlad r3 , r4 , r8 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r5 , r9 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r6 , r10 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r7 , r11 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ssat r3 , #16 , r3 , ASR #13 /* r3 = s[3] */ + strh r3 , [r1] /* *out = s[3] */ + add r1 , r1 , r2 , LSL #1 /* out += pitch */ + + ldm r12!, { r4-r7 } /* r4-r7 = u[4][0-7] */ + ldm r14!, { r8-r11 } /* r8-r11 = w[4][0-7] */ + + smlad r3 , r4 , r8 , r0 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r5 , r9 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r6 , r10 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r7 , r11 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ldm r12!, { r4-r7 } /* r4-r7 = u[4][8-9], u[5][0-5] */ + ldr r8 , [r14], #20 /* r8 = w[4][8-9], r14 = &w[5] */ + ldm r14!, { r9-r11 } /* r9-r11 = w[5][0-5] */ + + smlad r3 , r4 , r8 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ssat r3 , #16 , r3 , ASR #13 /* r3 = s[4] */ + strh r3 , [r1] /* *out = s[4] */ + add r1 , r1 , r2 , LSL #1 /* out += pitch */ + + smlad r3 , r5 , r9 , r0 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r6 , r10 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r7 , r11 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ldm r12!, { r4-r7 } /* r4-r7 = u[5][6-9], u[6][0-3] */ + ldrd r8 , r9 , [r14], #24 /* r10-r11 = w[5][6-9], r14 = &w[6] */ + ldm r14!, { r10-r11 } /* r9-r11 = w[6][0-3] */ + + smlad r3 , r4 , r8 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r5 , r9 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ssat r3 , #16 , r3 , ASR #13 /* r3 = s[5] */ + strh r3 , [r1] /* *out = s[5] */ + add r1 , r1 , r2 , LSL #1 /* out += pitch */ + + smlad r3 , r6 , r10 , r0 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r7 , r11 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ldm r12!, { r4-r7 } /* r4-r7 = u[6][4-9], u[7][0-1] */ + ldm r14!, { r8-r9 } /* r8-r9 = w[6][4-7] */ + ldr r10 , [r14], #20 /* r10 = w[6][8-9], r14 = &w[7] */ + ldr r11 , [r14], #4 /* r11 = w[7][0-1] */ + + smlad r3 , r4 , r8 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r5 , r9 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r6 , r10 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ssat r3 , #16 , r3 , ASR #13 /* r3 = s[6] */ + strh r3 , [r1] /* *out = s[6] */ + add r1 , r1 , r2 , LSL #1 /* out += pitch */ + + smlad r3 , r7 , r11 , r0 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ldm r12!, { r4-r7 } /* r4-r7 = u[7][2-9] */ + ldm r14!, { r8-r11 } /* r9-r11 = w[7][2-9] */ + + smlad r3 , r4 , r8 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r5 , r9 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r6 , r10 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + smlad r3 , r7 , r11 , r3 /* r3 += *(u++) *(w++) + *(u++) *(w++) */ + + ssat r3 , #16 , r3 , ASR #13 /* r3 = s[7] */ + strh r3 , [r1] /* *out = s[7] */ + + pop { r4-r11, pc } /* Pop registers and return */ diff --git a/examples/voice_remote_ctrl/libsbc/src/bits.c b/examples/voice_remote_ctrl/libsbc/src/bits.c new file mode 100644 index 000000000..bf8dc0d95 --- /dev/null +++ b/examples/voice_remote_ctrl/libsbc/src/bits.c @@ -0,0 +1,192 @@ +/****************************************************************************** + * + * Copyright 2022 Google LLC + * + * Licensed 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. + * + ******************************************************************************/ + +#include "bits.h" + + +/** + * Accumulator bit size + */ + +#define ACCU_NBITS (8 * sizeof(bits_accu_t)) + + +/** + * Bits extraction : + * MASK Mask of less-significant `n` bits + * EXT Extract the value `v` from bits `b(s+n-1)..b(s)` + */ + +#define MASK(n) ( (1U << (n)) - 1 ) +#define EXT(v, s, n) ( ((v) >> (s)) & MASK(n) ) + + +/** + * Sub-function of "load_accu()", general way loading + * bits Bitsream context + */ +static void load_accu_slow(struct sbc_bits *bits) +{ + while (bits->accu.nleft < ACCU_NBITS - 7 && bits->data.nleft) { + bits->accu.v = (bits->accu.v << 8) | *(bits->data.p++); + bits->accu.nleft += 8; + bits->data.nleft--; + } + + if (bits->accu.nleft < ACCU_NBITS - 7) + { + unsigned nover = ((ACCU_NBITS - bits->accu.nleft) >> 3) << 3; + + if (bits->accu.nleft >= bits->accu.nover) + bits->accu.nover += nover; + else + bits->accu.nover = UINT_MAX; + + if (nover < ACCU_NBITS) + bits->accu.v <<= nover; + else + bits->accu.v = 0; + + bits->accu.nleft += nover; + } +} + +/** + * Load the accumulator + * bits Bitsream context + * + * On return `8 * sizeof(bits_accu_t) - (accu.nleft % 8)` are available + */ +static inline void load_accu(struct sbc_bits *bits) +{ + unsigned nbytes = sizeof(bits_accu_t) - ((bits->accu.nleft + 7) >> 3); + + if (nbytes > bits->data.nleft) { + load_accu_slow(bits); + return; + } + + bits->accu.nleft += nbytes << 3; + bits->data.nleft -= nbytes; + while (nbytes--) + bits->accu.v = (bits->accu.v << 8) | *(bits->data.p++); +} + +/** + * Flush the accumulator + * bits Bitsream context + * + * On return `8 * sizeof(bits_accu_t) - (accu.nleft % 8)` are available + */ +static inline void flush_accu(struct sbc_bits *bits) +{ + unsigned nbytes = sizeof(bits_accu_t) - ((bits->accu.nleft + 7) >> 3); + + unsigned nflush = nbytes < bits->data.nleft ? nbytes : bits->data.nleft; + bits->data.nleft -= nflush; + + for (int shr = (ACCU_NBITS - 8) - bits->accu.nleft; nflush--; shr -= 8) + *(bits->data.p++) = bits->accu.v >> shr; + + bits->accu.v &= (1 << bits->accu.nleft) - 1; + bits->accu.nleft += nbytes << 3; +} + +/** + * Setup bitstream reader context + */ +void sbc_setup_bits(struct sbc_bits *bits, + enum sbc_bits_mode mode, void *data, unsigned size) +{ + *bits = (struct sbc_bits){ + .mode = mode, + .accu.nleft = mode == SBC_BITS_READ ? 0 : 8*sizeof(bits_accu_t), + .data.p = data, .data.nbytes = size, .data.nleft = size, + }; +} + +/** + * Return the bit position in the stream + * bits Bitstream context + */ +unsigned sbc_tell_bits(sbc_bits_t *bits) +{ + unsigned nbytes = bits->data.nbytes - bits->data.nleft; + if (bits->mode == SBC_BITS_WRITE) + nbytes += sizeof(bits_accu_t); + + return 8 * nbytes - ( bits->accu.nleft < bits->accu.nover ? 0 : + bits->accu.nleft - bits->accu.nover ); +} + +/** + * Get from 1 to 32 bits + */ +unsigned __sbc_get_bits(struct sbc_bits *bits, unsigned n) +{ + if (n > 32) n = 32; + + if (!bits->accu.nleft) + load_accu(bits); + + if (bits->accu.nleft >= n) + return (bits->accu.nleft -= n), + EXT(bits->accu.v, bits->accu.nleft, n); + + n -= bits->accu.nleft; + unsigned v = bits->accu.v & MASK(bits->accu.nleft); + bits->accu.nleft = 0; + + load_accu(bits); + + return (bits->accu.nleft -= n), + ((v << n) | EXT(bits->accu.v, bits->accu.nleft, n)); +} + +/** + * Put from 1 to 32 bits + */ +void __sbc_put_bits(struct sbc_bits *bits, unsigned v, unsigned n) +{ + if (n > 32) n = 32; + + if (!bits->accu.nleft) + flush_accu(bits); + + int m = bits->accu.nleft < n ? bits->accu.nleft : n; + n -= m; + + bits->accu.nleft -= m; + bits->accu.v = (bits->accu.v << m) | ((v >> n) & ((1U << m) - 1)); + + if (n <= 0) + return; + + flush_accu(bits); + + bits->accu.nleft -= n; + bits->accu.v = (bits->accu.v << n) | (v & ((1U << n) - 1)); +} + +/** + * Flush pending bytes + */ +void sbc_flush_bits(struct sbc_bits *bits) +{ + flush_accu(bits); +} diff --git a/examples/voice_remote_ctrl/libsbc/src/bits.h b/examples/voice_remote_ctrl/libsbc/src/bits.h new file mode 100644 index 000000000..c687bc496 --- /dev/null +++ b/examples/voice_remote_ctrl/libsbc/src/bits.h @@ -0,0 +1,238 @@ +/****************************************************************************** + * + * Copyright 2022 Google LLC + * + * Licensed 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 __SBC_BITS_H +#define __SBC_BITS_H + +#include +#include +#include + + +/** + * Bitstream mode + */ +enum sbc_bits_mode +{ + SBC_BITS_READ = 0, + SBC_BITS_WRITE, +}; + + +/** + * Private context + */ + +typedef unsigned bits_accu_t; + +typedef struct sbc_bits +{ + enum sbc_bits_mode mode; + + struct { + uint8_t *p; + unsigned nbytes; + unsigned nleft; + } data; + + struct { + bits_accu_t v; + unsigned nleft; + unsigned nover; + } accu; + + bool error; + +} sbc_bits_t; + + +/** + * Debug trace procedure, enable with `SBC_BITS_TRACE` + */ + +#ifdef SBC_BITS_TRACE + +#include + +#define sbc_trace(pos, name, val) \ + fprintf(stderr, "|%5u| %-32s : %4d\n", pos, name, val) + +#endif /* SBC_BITS_TRACE */ + + +/** + * Helper macros on bitstream reading + */ + +#define SBC_WITH_BITS(bits) \ + do { \ + sbc_bits_t *__bits = bits + +#ifndef SBC_BITS_TRACE + +#define SBC_GET_BITS(name, n) sbc_get_bits(__bits, n) +#define SBC_GET_FIXED(name, n, v) sbc_get_fixed(__bits, n, v) + +#define SBC_PUT_BITS(name, v, n) sbc_put_bits(__bits, v, n) + +#else + +#define SBC_GET_BITS(name, n) sbc_get_named_bits(__bits, name, n) +#define SBC_GET_FIXED(name, n, v) sbc_get_named_fixed(__bits, name, n, v) + +#define SBC_PUT_BITS(name, v, n) sbc_put_named_bits(__bits, name, v, n) + +#endif + +#define SBC_END_WITH_BITS() \ + } while(0) + +/** + * Setup bitstream context + * bits Context to setup + * mode Bitstream mode "read or write" + * data Data buffer to read or write + * size Number of bytes available + */ +void sbc_setup_bits(sbc_bits_t *bits, + enum sbc_bits_mode mode, void *data, unsigned size); + +/** + * Return the bit position in the stream + * bits Bitstream context + */ +unsigned sbc_tell_bits(sbc_bits_t *bits); + + +/* ---------------------------------------------------------------------------- + * Reading + * ------------------------------------------------------------------------- */ + +/** + * Return true when a reading error is detected + * return True whenever an error has been detected + */ +static inline bool sbc_bits_error(sbc_bits_t *bits); + +/** + * Get from 0 to 32 bits + * bits Bitsream context + * n Number of bits to read (0 to 32) + * + * For 0 bit reading, the value 0 is returned + * If there is no more data to read from the bistsream, + * the missing bits are emulated with bits of value 0. + */ +static inline unsigned sbc_get_bits(sbc_bits_t *bits, unsigned n); + +/** + * Get from 1 to 32 bits, whose value is a constant + * bits Bitsream context + * n Number of bits to read (1 to 32) + * val Fixed value to check + */ +static inline void sbc_get_fixed(struct sbc_bits *bits, unsigned n, unsigned v); + + +/* ---------------------------------------------------------------------------- + * Writing + * ------------------------------------------------------------------------- */ + +/** + * Put from 0 to 32 bits + * bits Bitsream context + * n Number of bits to write (0 to 32) + */ +static inline void sbc_put_bits(sbc_bits_t *bits, unsigned v, unsigned n); + +/** + * Flush pending bytes + * bits Bitsream context + */ +void sbc_flush_bits(sbc_bits_t *bits); + + +/* ---------------------------------------------------------------------------- + * Inline implementations + * ------------------------------------------------------------------------- */ + +static inline bool sbc_bits_error(struct sbc_bits *bits) +{ + return bits->error; +} + +extern unsigned __sbc_get_bits(sbc_bits_t *, unsigned); +extern void __sbc_put_bits(sbc_bits_t *, unsigned, unsigned); + +static inline unsigned sbc_get_bits(struct sbc_bits *bits, unsigned n) +{ + if (bits->accu.nleft < n) + return __sbc_get_bits(bits, n); + + bits->accu.nleft -= n; + return (bits->accu.v >> bits->accu.nleft) & ((1U << n) - 1); +} + +static inline void sbc_put_bits(struct sbc_bits *bits, unsigned v, unsigned n) +{ + if (bits->accu.nleft < n) + __sbc_put_bits(bits, v, n); + else { + bits->accu.nleft -= n; + bits->accu.v = (bits->accu.v << n) | (v & ((1U << n) - 1)); + } +} + +static inline void sbc_get_fixed(struct sbc_bits *bits, unsigned n, unsigned v) +{ + if (sbc_get_bits(bits, n) != v) + bits->error = true; +} + +#ifdef SBC_BITS_TRACE + +static inline unsigned sbc_get_named_bits( + struct sbc_bits *bits, const char *name, unsigned n) +{ + unsigned off = sbc_tell_bits(bits); + unsigned val = sbc_get_bits(bits, n); + return sbc_trace(off, name, val), val; +} + +static inline void sbc_put_named_bits( + struct sbc_bits *bits, const char *name, unsigned v, unsigned n) +{ + sbc_trace(sbc_tell_bits(bits), name, v); + sbc_put_bits(bits, v, n); +} + +static inline void sbc_get_named_fixed(struct sbc_bits *bits, + const char *name, unsigned n, unsigned fixed_value) +{ + unsigned off = sbc_tell_bits(bits); + unsigned val = sbc_get_bits(bits, n); + + if (val != fixed_value) + bits->error = true; + + sbc_trace(off, name, val); +} + +#endif /* SBC_BITS_TRACE */ + +#endif /* __SBC_BITS_H */ diff --git a/examples/voice_remote_ctrl/libsbc/src/sbc.c b/examples/voice_remote_ctrl/libsbc/src/sbc.c new file mode 100644 index 000000000..c23fff500 --- /dev/null +++ b/examples/voice_remote_ctrl/libsbc/src/sbc.c @@ -0,0 +1,1563 @@ +/****************************************************************************** + * + * Copyright 2022 Google LLC + * + * Licensed 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. + * + ******************************************************************************/ + +#include +#include + +#undef SBC_BITS_TRACE +#include "bits.h" + + +/** + * SBC Frame header size + */ + +#define SBC_HEADER_SIZE ( 4) + + +/** + * Assembly declaration + */ + +void sbc_synthesize_4(struct sbc_dstate *state, + const int16_t *in, int scale, int16_t *out, int pitch); + +void sbc_synthesize_8(struct sbc_dstate *state, + const int16_t *in, int scale, int16_t *out, int pitch); + +#ifndef SBC_ASM +#define ASM(fn) (fn##_c) +#else +#define ASM(fn) (fn) +#endif + + +/** + * Macros + * MIN/MAX Minimum and maximum between 2 values + * SAT16 Signed saturation on 16 bits + * Saturate on 16 bits + */ + +#define SBC_MIN(a, b) ( (a) < (b) ? (a) : (b) ) +#define SBC_MAX(a, b) ( (a) > (b) ? (a) : (b) ) + +#define SBC_SAT16(v) (int16_t)\ + ( (v) > INT16_MAX ? INT16_MAX : \ + (v) < INT16_MIN ? INT16_MIN : (v) ) + + +/** + * Count number of leading zero bits + */ + +#define SBC_CLZ(n) __builtin_clz(n) + + +/** + * mSBC constant frame description + */ +static const struct sbc_frame msbc_frame = { + .msbc = true, + .mode = SBC_MODE_MONO, + .freq = SBC_FREQ_16K, + .bam = SBC_BAM_LOUDNESS, + .nsubbands = 8, .nblocks = 15, + .bitpool = 26 +}; + + +/* ---------------------------------------------------------------------------- + * Common + * ------------------------------------------------------------------------- */ + +/** + * Compute CRC of frame + * frame La description de frame + * data, size Frame data, and maximum readable size + * return The CRC-8 value, -1: size too small + */ +static int compute_crc( + const struct sbc_frame *frame, const uint8_t *data, unsigned size) +{ + /* Look-up table par 8 bits + * Generator polynomial G(X) = X^8 + X^4 + X^3 + X^2 + 1 (0x1d) */ + + static const uint8_t t[] = { + 0x00, 0x1d, 0x3a, 0x27, 0x74, 0x69, 0x4e, 0x53, + 0xe8, 0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb, + 0xcd, 0xd0, 0xf7, 0xea, 0xb9, 0xa4, 0x83, 0x9e, + 0x25, 0x38, 0x1f, 0x02, 0x51, 0x4c, 0x6b, 0x76, + 0x87, 0x9a, 0xbd, 0xa0, 0xf3, 0xee, 0xc9, 0xd4, + 0x6f, 0x72, 0x55, 0x48, 0x1b, 0x06, 0x21, 0x3c, + 0x4a, 0x57, 0x70, 0x6d, 0x3e, 0x23, 0x04, 0x19, + 0xa2, 0xbf, 0x98, 0x85, 0xd6, 0xcb, 0xec, 0xf1, + 0x13, 0x0e, 0x29, 0x34, 0x67, 0x7a, 0x5d, 0x40, + 0xfb, 0xe6, 0xc1, 0xdc, 0x8f, 0x92, 0xb5, 0xa8, + 0xde, 0xc3, 0xe4, 0xf9, 0xaa, 0xb7, 0x90, 0x8d, + 0x36, 0x2b, 0x0c, 0x11, 0x42, 0x5f, 0x78, 0x65, + 0x94, 0x89, 0xae, 0xb3, 0xe0, 0xfd, 0xda, 0xc7, + 0x7c, 0x61, 0x46, 0x5b, 0x08, 0x15, 0x32, 0x2f, + 0x59, 0x44, 0x63, 0x7e, 0x2d, 0x30, 0x17, 0x0a, + 0xb1, 0xac, 0x8b, 0x96, 0xc5, 0xd8, 0xff, 0xe2, + 0x26, 0x3b, 0x1c, 0x01, 0x52, 0x4f, 0x68, 0x75, + 0xce, 0xd3, 0xf4, 0xe9, 0xba, 0xa7, 0x80, 0x9d, + 0xeb, 0xf6, 0xd1, 0xcc, 0x9f, 0x82, 0xa5, 0xb8, + 0x03, 0x1e, 0x39, 0x24, 0x77, 0x6a, 0x4d, 0x50, + 0xa1, 0xbc, 0x9b, 0x86, 0xd5, 0xc8, 0xef, 0xf2, + 0x49, 0x54, 0x73, 0x6e, 0x3d, 0x20, 0x07, 0x1a, + 0x6c, 0x71, 0x56, 0x4b, 0x18, 0x05, 0x22, 0x3f, + 0x84, 0x99, 0xbe, 0xa3, 0xf0, 0xed, 0xca, 0xd7, + 0x35, 0x28, 0x0f, 0x12, 0x41, 0x5c, 0x7b, 0x66, + 0xdd, 0xc0, 0xe7, 0xfa, 0xa9, 0xb4, 0x93, 0x8e, + 0xf8, 0xe5, 0xc2, 0xdf, 0x8c, 0x91, 0xb6, 0xab, + 0x10, 0x0d, 0x2a, 0x37, 0x64, 0x79, 0x5e, 0x43, + 0xb2, 0xaf, 0x88, 0x95, 0xc6, 0xdb, 0xfc, 0xe1, + 0x5a, 0x47, 0x60, 0x7d, 0x2e, 0x33, 0x14, 0x09, + 0x7f, 0x62, 0x45, 0x58, 0x0b, 0x16, 0x31, 0x2c, + 0x97, 0x8a, 0xad, 0xb0, 0xe3, 0xfe, 0xd9, 0xc4, + }; + + /* The CRC cover the syntax indicated with "[]" : + * + * Header() + * | syncword 8 + * | [ desc ] 16 + * | crc 8 + * Data() + * | SI mode `Join-Stereo` + * | | [ joint ] nsb x 1 + * | [ scale-factors ] nch x nsb x 4 + * | ... */ + + int nch = 1 + (frame->mode != SBC_MODE_MONO); + int nsb = frame->nsubbands; + unsigned i, nbit = nch*nsb*4 + + (frame->mode == SBC_MODE_JOINT_STEREO ? nsb : 0); + + if (size < ((SBC_HEADER_SIZE*8 + nbit + 7) >> 3)) + return -1; + + uint8_t crc = 0x0f; + crc = t[crc ^ data[1]]; + crc = t[crc ^ data[2]]; + + for (i = 4; i < 4 + nbit/8; i++) + crc = t[crc ^ data[i]]; + + if (nbit % 8) + crc = (crc << 4) ^ t[(crc >> 4) ^ (data[i] >> 4)]; + + return crc; +} + +/** + * Check a frame description + * frame The frame description to check + * return True when valid, False otherwise + */ +static bool check_frame(const struct sbc_frame *frame) +{ + /* --- Check number of sub-blocks and sub-bands --- */ + + if ((unsigned)(frame->nblocks - 4) > 12 || + (!frame->msbc && frame->nblocks % 4 != 0)) + return false; + + if ((unsigned)(frame->nsubbands - 4) > 4 || frame->nsubbands % 4 != 0) + return false; + + /* --- Validate the bitpool value --- */ + + bool two_channels = (frame->mode != SBC_MODE_MONO); + bool dual_mode = (frame->mode == SBC_MODE_DUAL_CHANNEL); + bool joint_mode = (frame->mode == SBC_MODE_JOINT_STEREO); + bool stereo_mode = joint_mode || (frame->mode == SBC_MODE_STEREO); + + int max_bits = + ((16 * frame->nsubbands * frame->nblocks) << two_channels) - + (SBC_HEADER_SIZE * 8) - + ((4 * frame->nsubbands) << two_channels) - + (joint_mode ? frame->nsubbands : 0); + + int max_bitpool = SBC_MIN( max_bits / (frame->nblocks << dual_mode), + (16 << stereo_mode) * frame->nsubbands ); + + return frame->bitpool <= max_bitpool; +} + +/** + * Compute the bit distribution for Independent or Stereo Channel + * frame Frame description + * scale_factors Scale-factor values + * nbits Return of allocated bits for each channels / subbands + */ +static void compute_nbits(const struct sbc_frame *frame, + const int (*scale_factors)[SBC_MAX_SUBBANDS], + int (*nbits)[SBC_MAX_SUBBANDS]) +{ + /* --- Offsets of "Loudness" bit allocation --- */ + + static const int loudness_offset_4[SBC_NUM_FREQ][4] = { + [SBC_FREQ_16K ] = { -1, 0, 0, 0 }, + [SBC_FREQ_32K ] = { -2, 0, 0, 1 }, + [SBC_FREQ_44K1] = { -2, 0, 0, 1 }, + [SBC_FREQ_48K ] = { -2, 0, 0, 1 }, + }; + + static const int loudness_offset_8[SBC_NUM_FREQ][8] = { + [SBC_FREQ_16K ] = { -2, 0, 0, 0, 0, 0, 0, 1 }, + [SBC_FREQ_32K ] = { -3, 0, 0, 0, 0, 0, 1, 2 }, + [SBC_FREQ_44K1] = { -4, 0, 0, 0, 0, 0, 1, 2 }, + [SBC_FREQ_48K ] = { -4, 0, 0, 0, 0, 0, 1, 2 }, + }; + + /* --- Compute the number of bits needed --- */ + + const int *loudness_offset = frame->nsubbands == 4 ? + loudness_offset_4[frame->freq] : loudness_offset_8[frame->freq]; + + bool stereo_mode = frame->mode == SBC_MODE_STEREO || + frame->mode == SBC_MODE_JOINT_STEREO; + + int nsubbands = frame->nsubbands; + int nchannels = 1 + stereo_mode; + + int bitneeds[2][SBC_MAX_SUBBANDS]; + int max_bitneed = 0; + + for (int ich = 0; ich < nchannels; ich++) + for (int isb = 0; isb < nsubbands; isb++) { + int bitneed, scf = scale_factors[ich][isb]; + + if (frame->bam == SBC_BAM_LOUDNESS) { + bitneed = scf ? scf - loudness_offset[isb] : -5; + bitneed >>= (bitneed > 0); + } else { + bitneed = scf; + } + + if (bitneed > max_bitneed) + max_bitneed = bitneed; + + bitneeds[ich][isb] = bitneed; + } + + /* --- Loop over the bit distribution, until reaching the bitpool --- */ + + int bitpool = frame->bitpool; + + int bitcount = 0; + int bitslice = max_bitneed + 1; + + for (int bc = 0; bc < bitpool; ) { + + int bs = bitslice--; + bitcount = bc; + if (bitcount == bitpool) + break; + + for (int ich = 0; ich < nchannels; ich++) + for (int isb = 0; isb < nsubbands; isb++) { + int bn = bitneeds[ich][isb]; + bc += (bn >= bs && bn < bs + 15) + (bn == bs); + } + } + + /* --- Bits distribution --- */ + + for (int ich = 0; ich < nchannels; ich++) + for (int isb = 0; isb < nsubbands; isb++) { + int nbit = bitneeds[ich][isb] - bitslice; + nbits[ich][isb] = nbit < 2 ? 0 : nbit > 16 ? 16 : nbit; + } + + /* --- Allocate remaining bits --- */ + + for (int isb = 0; isb < nsubbands && bitcount < bitpool; isb++) + for (int ich = 0; ich < nchannels && bitcount < bitpool; ich++) { + + int n = nbits[ich][isb] && nbits[ich][isb] < 16 ? 1 : + bitneeds[ich][isb] == bitslice + 1 && + bitpool > bitcount + 1 ? 2 : 0; + + nbits[ich][isb] += n; + bitcount += n; + } + + for (int isb = 0; isb < nsubbands && bitcount < bitpool; isb++) + for (int ich = 0; ich < nchannels && bitcount < bitpool; ich++) { + + int n = (nbits[ich][isb] < 16); + nbits[ich][isb] += n; + bitcount += n; + } +} + +/** + * Return the sampling frequency in Hz + */ +int sbc_get_freq_hz(enum sbc_freq freq) +{ + static const int freq_hz[SBC_NUM_FREQ] = { + [SBC_FREQ_16K ] = 16000, [SBC_FREQ_32K ] = 32000, + [SBC_FREQ_44K1] = 44100, [SBC_FREQ_48K ] = 48000, + }; + + return freq_hz[freq]; +} + +/** + * Return the frame size from a frame description + */ +unsigned sbc_get_frame_size(const struct sbc_frame *frame) +{ + if (!check_frame(frame)) + return 0; + + bool two_channels = (frame->mode != SBC_MODE_MONO); + bool dual_mode = (frame->mode == SBC_MODE_DUAL_CHANNEL); + bool joint_mode = (frame->mode == SBC_MODE_JOINT_STEREO); + + unsigned nbits = + ((4 * frame->nsubbands) << two_channels) + + ((frame->nblocks * frame->bitpool) << dual_mode) + + ((joint_mode ? frame->nsubbands : 0)); + + return SBC_HEADER_SIZE + ((nbits + 7) >> 3); +} + +/** + * Return the bitrate from a frame description + */ +unsigned sbc_get_frame_bitrate(const struct sbc_frame *frame) +{ + if (!check_frame(frame)) + return 0; + + unsigned nsamples = frame->nblocks * frame->nsubbands; + unsigned nbits = 8 * sbc_get_frame_size(frame); + + return (nbits * sbc_get_freq_hz(frame->freq)) / nsamples; +} + +/** + * Return the bitrate from a frame description + */ +int sbc_get_frame_bps(enum sbc_freq freq) +{ + static const int freq_hz[SBC_NUM_FREQ] = { + [SBC_FREQ_16K ] = 16000, [SBC_FREQ_32K ] = 32000, + [SBC_FREQ_44K1] = 44100, [SBC_FREQ_48K ] = 48000, + }; + + return freq_hz[freq]; +} + +/** + * Reset of the context + */ +void sbc_reset(struct sbc *sbc) +{ + *sbc = (struct sbc){ }; +} + + +/* ---------------------------------------------------------------------------- + * Decoding + * ------------------------------------------------------------------------- */ + +/** + * Decode the 4 bytes frame header + * bits Bitstream reader + * frame Return the frame description + * crc Return the CRC validating the stream, or NULL + * return True on success, False otherwise + */ +static bool decode_header(sbc_bits_t *bits, struct sbc_frame *frame, int *crc) +{ + static const enum sbc_freq dec_freq[] = + { SBC_FREQ_16K, SBC_FREQ_32K, SBC_FREQ_44K1, SBC_FREQ_48K }; + + static const enum sbc_mode dec_mode[] = + { SBC_MODE_MONO, SBC_MODE_DUAL_CHANNEL, + SBC_MODE_STEREO, SBC_MODE_JOINT_STEREO }; + + static const enum sbc_bam dec_bam[] = + { SBC_BAM_LOUDNESS, SBC_BAM_SNR }; + + /* --- Decode header --- + * + * Two possible headers : + * - Header, with syncword 0x9c (A2DP) + * - mSBC header, with syncword 0xad (HFP) */ + + SBC_WITH_BITS(bits); + + int syncword = SBC_GET_BITS("syncword", 8); + frame->msbc = (syncword == 0xad); + if (frame->msbc) { + SBC_GET_BITS("reserved", 16); + *frame = msbc_frame; + } + + else if (syncword == 0x9c) { + frame->freq = dec_freq[SBC_GET_BITS("sampling_frequency", 2)]; + frame->nblocks = (1 + SBC_GET_BITS("blocks", 2)) << 2; + frame->mode = dec_mode[SBC_GET_BITS("channel_mode", 2)]; + frame->bam = dec_bam[SBC_GET_BITS("allocation_method", 1)]; + frame->nsubbands = (1 + SBC_GET_BITS("subbands", 1)) << 2; + frame->bitpool = SBC_GET_BITS("bitpool", 8); + + } else + return false; + + if (crc) + *crc = SBC_GET_BITS("crc_check", 8); + + SBC_END_WITH_BITS(); + + /* --- Check bitpool value and return --- */ + + return check_frame(frame); +} + +/** + * Decode frame data + * bits Bitstream reader + * frame Frame description + * sb_samples Return the sub-band samples, by channels + * sb_scale Return the sample scaler, by track (indep. channels) + */ +static void decode_frame(sbc_bits_t *bits, const struct sbc_frame *frame, + int16_t (*sb_samples)[SBC_MAX_SAMPLES], int *sb_scale) +{ + static const int range_scale[] = { + 0xFFFFFFF, 0x5555556, 0x2492492, 0x1111111, + 0x0842108, 0x0410410, 0x0204081, 0x0101010, + 0x0080402, 0x0040100, 0x0020040, 0x0010010, + 0x0008004, 0x0004001, 0x0002000, 0x0001000 + }; + + /* --- Decode joint bands indications --- */ + + SBC_WITH_BITS(bits); + + unsigned mjoint = 0; + + if (frame->mode == SBC_MODE_JOINT_STEREO && frame->nsubbands == 4) + { + unsigned v = SBC_GET_BITS("join[]", 4); + mjoint = (( 0x00) << 3) | ((v & 0x02) << 1) | + ((v & 0x04) >> 1) | ((v & 0x08) >> 3) ; + + } else if (frame->mode == SBC_MODE_JOINT_STEREO) { + unsigned v = SBC_GET_BITS("join[]", 8); + + mjoint = (( 0x00) << 7) | ((v & 0x02) << 5) | + ((v & 0x04) << 3) | ((v & 0x08) << 1) | + ((v & 0x10) >> 1) | ((v & 0x20) >> 3) | + ((v & 0x40) >> 5) | ((v & 0x80) >> 7) ; + } + + /* --- Decode scale factors --- */ + + int nchannels = 1 + (frame->mode != SBC_MODE_MONO); + int nsubbands = frame->nsubbands; + + int scale_factors[2][SBC_MAX_SUBBANDS]; + int nbits[2][SBC_MAX_SUBBANDS]; + + for (int ich = 0; ich < nchannels; ich++) + for (int isb = 0; isb < nsubbands; isb++) + scale_factors[ich][isb] = SBC_GET_BITS("scale_factor", 4); + + compute_nbits(frame, scale_factors, nbits); + if (frame->mode == SBC_MODE_DUAL_CHANNEL) + compute_nbits(frame, scale_factors + 1, nbits + 1); + + /* --- Decode samples --- + * + * They are unquantized according : + * + * 2 sample + 1 + * sb_sample = ( -------------- - 1 ) 2^(scf + 1) + * 2^nbit - 1 + * + * A sample is coded on maximum 16 bits, and the scale factor is limited + * to 15 bits. Thus the dynamic of sub-bands samples are 17 bits. + * Regarding "Joint-Stereo" sub-bands, uncoupling increase the dynamic + * to 18 bits. + * + * The `1 / (2^nbit - 1)` values are precalculated on 1.28 : + * + * sb_sample = ((2 sample + 1) * range_scale - 2^28) / 2^shr + * + * with shr = 28 - ((scf + 1) + sb_scale) + * sb_scale = (15 - max(scale_factor[])) - (18 - 16) + * + * We introduce `sb_scale`, to limit the range on 16 bits, or increase + * precision when the scale-factor of the frame is below 13. */ + + for (int ich = 0; ich < nchannels; ich++) { + int max_scf = 0; + + for (int isb = 0; isb < nsubbands; isb++) { + int scf = scale_factors[ich][isb] + ((mjoint >> isb) & 1); + if (scf > max_scf) max_scf = scf; + } + + sb_scale[ich] = (15 - max_scf) - (17 - 16); + } + + if (frame->mode == SBC_MODE_JOINT_STEREO) + sb_scale[0] = sb_scale[1] = + sb_scale[0] < sb_scale[1] ? sb_scale[0] : sb_scale[1]; + + for (int iblk = 0; iblk < frame->nblocks; iblk++) + for (int ich = 0; ich < nchannels; ich++) { + int16_t *p_sb_samples = sb_samples[ich] + iblk*nsubbands; + + for (int isb = 0; isb < nsubbands; isb++) { + int nbit = nbits[ich][isb]; + int scf = scale_factors[ich][isb]; + + if (!nbit) { *(p_sb_samples++) = 0; continue; } + + int s = SBC_GET_BITS("audio_sample", nbit); + s = ((s << 1) | 1) * range_scale[nbit-1]; + + *(p_sb_samples++) = + (s - (1 << 28)) >> (28 - ((scf + 1) + sb_scale[ich])); + } + } + + /* --- Uncoupling "Joint-Stereo" --- + * + * The `Left/Right` samples are coded as : + * `sb_sample(left ) = sb_sample(ch 0) + sb_sample(ch 1)` + * `sb_sample(right) = sb_sample(ch 0) - sb_sample(ch 1)` */ + + for (int isb = 0; isb < nsubbands; isb++) { + + if (((mjoint >> isb) & 1) == 0) + continue; + + for (int iblk = 0; iblk < frame->nblocks; iblk++) { + int16_t s0 = sb_samples[0][iblk*nsubbands + isb]; + int16_t s1 = sb_samples[1][iblk*nsubbands + isb]; + + sb_samples[0][iblk*nsubbands + isb] = s0 + s1; + sb_samples[1][iblk*nsubbands + isb] = s0 - s1; + } + } + + /* --- Remove padding --- */ + + int padding_nbits = 8 - (sbc_tell_bits(bits) % 8); + if (padding_nbits < 8) + SBC_GET_FIXED("padding_bits", padding_nbits, 0); + + SBC_END_WITH_BITS(); +} + +/** + * Perform a DCT on 4 samples + * in Subbands input samples + * scale Scale factor of input samples (-2 to 14) + * out0 Output of 1st half samples + * out1 Output of 2nd half samples + * idx Index of transformed samples + */ +static inline void dct4(const int16_t *in, int scale, + int16_t (*out0)[10], int16_t (*out1)[10], int idx) +{ + /* cos(i*pi/8) for i = [0;3], in fixed 0.13 */ + + static const int16_t cos8[] = { 8192, 7568, 5793, 3135 }; + + /* --- DCT of subbands samples --- + * ___ + * \ + * u[k] = /__ h(k,i) * s(i) , i = [0;n-1] k = [0;2n-1] + * i + * + * With n the number of subbands (4) + * h(k,i) = cos( (i + 1/2) (k + n/2) pi/n ) + * + * Note : + * + * h( 2, i) = 0 et h( n-k,i) = -h(k,i) , k = [0;n/2-1] + * h(12, i) = -1 et h(2n-k,i) = h(n+k,i) , k = [1;n/2-1] + * + * To assist the windowing step, the 2 halves are stored in 2 buffers. + * After scaling of coefficients, the result is saturated on 16 bits. */ + + int16_t s03 = (in[0] + in[3]) >> 1, d03 = (in[0] - in[3]) >> 1; + int16_t s12 = (in[1] + in[2]) >> 1, d12 = (in[1] - in[2]) >> 1; + + int a0 = ( (s03 - s12 ) * cos8[2] ); + int b1 = (-(s03 + s12 ) ) << 13; + int a1 = ( d03*cos8[3] - d12 * cos8[1] ); + int b0 = (-d03*cos8[1] - d12 * cos8[3] ); + + int shr = 12 + scale; + + a0 = (a0 + (1 << (shr-1))) >> shr; b0 = (b0 + (1 << (shr-1))) >> shr; + a1 = (a1 + (1 << (shr-1))) >> shr; b1 = (b1 + (1 << (shr-1))) >> shr; + + out0[0][idx] = SBC_SAT16( a0); out0[3][idx] = SBC_SAT16(-a1); + out0[1][idx] = SBC_SAT16( a1); out0[2][idx] = SBC_SAT16( 0); + + out1[0][idx] = SBC_SAT16(-a0); out1[3][idx] = SBC_SAT16( b0); + out1[1][idx] = SBC_SAT16( b0); out1[2][idx] = SBC_SAT16( b1); +} + +/** + * Perform a DCT on 8 samples + * in Subbands input samples + * scale Scale factor of input samples (-2 to 14) + * out0 Output of 1st half samples + * out1 Output of 2nd half samples + * idx Index of transformed samples + */ +static inline void dct8(const int16_t *in, int scale, + int16_t (*out0)[10], int16_t (*out1)[10], int idx) +{ + /* cos(i*pi/16) for i = [0;7], in fixed 0.13 */ + + static const int16_t cos16[] = + { 8192, 8035, 7568, 6811, 5793, 4551, 3135, 1598 }; + + /* --- DCT of subbands samples --- + * ___ + * \ + * u[k] = /__ h(k,i) * s(i) , i = [0;n-1] k = [0;2n-1] + * i + * + * With n the number of subbands (8) + * h(k,i) = cos( (i + 1/2) (k + n/2) pi/n ) + * + * + * + * Note : + * + * h( 4, i) = 0 et h( n-k,i) = -h(k,i) , k = [0;n/2-1] + * h(12, i) = -1 et h(2n-k,i) = h(n+k,i) , k = [1;n/2-1] + * + * To assist the windowing step, the 2 halves are stored in 2 buffers. + * After scaling of coefficients, the result is saturated on 16 bits. */ + + int16_t s07 = (in[0] + in[7]) >> 1, d07 = (in[0] - in[7]) >> 1; + int16_t s16 = (in[1] + in[6]) >> 1, d16 = (in[1] - in[6]) >> 1; + int16_t s25 = (in[2] + in[5]) >> 1, d25 = (in[2] - in[5]) >> 1; + int16_t s34 = (in[3] + in[4]) >> 1, d34 = (in[3] - in[4]) >> 1; + + int a0 = ( (s07 + s34) - (s25 + s16) ) * cos16[4]; + int b3 = (-(s07 + s34) - (s25 + s16) ) << 13; + int a2 = ( (s07 - s34) * cos16[6] + (s25 - s16) * cos16[2] ); + int b1 = ( (s34 - s07) * cos16[2] + (s25 - s16) * cos16[6] ); + int a1 = ( d07*cos16[5] - d16*cos16[1] + d25*cos16[7] + d34*cos16[3] ); + int b2 = (-d07*cos16[1] - d16*cos16[3] - d25*cos16[5] - d34*cos16[7] ); + int a3 = ( d07*cos16[7] - d16*cos16[5] + d25*cos16[3] - d34*cos16[1] ); + int b0 = (-d07*cos16[3] + d16*cos16[7] + d25*cos16[1] + d34*cos16[5] ); + + int shr = 12 + scale; + + a0 = (a0 + (1 << (shr-1))) >> shr; b0 = (b0 + (1 << (shr-1))) >> shr; + a1 = (a1 + (1 << (shr-1))) >> shr; b1 = (b1 + (1 << (shr-1))) >> shr; + a2 = (a2 + (1 << (shr-1))) >> shr; b2 = (b2 + (1 << (shr-1))) >> shr; + a3 = (a3 + (1 << (shr-1))) >> shr; b3 = (b3 + (1 << (shr-1))) >> shr; + + out0[0][idx] = SBC_SAT16( a0); out0[7][idx] = SBC_SAT16(-a1); + out0[1][idx] = SBC_SAT16( a1); out0[6][idx] = SBC_SAT16(-a2); + out0[2][idx] = SBC_SAT16( a2); out0[5][idx] = SBC_SAT16(-a3); + out0[3][idx] = SBC_SAT16( a3); out0[4][idx] = SBC_SAT16( 0); + + out1[0][idx] = SBC_SAT16(-a0); out1[7][idx] = SBC_SAT16( b0); + out1[1][idx] = SBC_SAT16( b0); out1[6][idx] = SBC_SAT16( b1); + out1[2][idx] = SBC_SAT16( b1); out1[5][idx] = SBC_SAT16( b2); + out1[3][idx] = SBC_SAT16( b2); out1[4][idx] = SBC_SAT16( b3); +} + +/** + * Apply window on reconstructed samples + * in, n Reconstructed samples and number of subbands + * window Window coefficients + * offset Offset of coefficients for each samples + * out Output adress of PCM samples + * pitch Number of PCM samples between two consecutive + */ +static inline void apply_window(const int16_t (*in)[10], int n, + const int16_t (*window)[2*10], int offset, int16_t *out, int pitch) +{ + const int16_t *u = (const int16_t *)in; + + for (int i = 0; i < n; i++) { + const int16_t *w = window[i] + offset; + int s; + + s = *(u++) * *(w++); s += *(u++) * *(w++); + s += *(u++) * *(w++); s += *(u++) * *(w++); + s += *(u++) * *(w++); s += *(u++) * *(w++); + s += *(u++) * *(w++); s += *(u++) * *(w++); + s += *(u++) * *(w++); s += *(u++) * *(w++); + + *out = SBC_SAT16((s + (1 << 12)) >> 13); out += pitch; + } +} + +/** + * Synthesize samples of a 4 subbands block + * state Previous transformed samples of the channel + * in Sub-band samples + * scale Scale factor of samples + * out Output adress of PCM samples + * pitch Number of samples between two consecutive + */ +void sbc_synthesize_4_c(struct sbc_dstate *state, + const int16_t *in, int scale, int16_t *out, int pitch) +{ + /* --- Windowing coefficients (fixed 2.13) --- + * + * The table is duplicated and transposed to fit the circular + * buffer of reconstructed samples */ + + static const int16_t window[4][2*10] = { + { 0, -126, -358, -848, -4443, -9644, 4443, -848, 358, -126, + 0, -126, -358, -848, -4443, -9644, 4443, -848, 358, -126 }, + + { -18, -128, -670, -201, -6389, -9235, 2544, -1055, 100, -90, + -18, -128, -670, -201, -6389, -9235, 2544, -1055, 100, -90 }, + + { -49, -61, -946, 944, -8082, -8082, 944, -946, -61, -49, + -49, -61, -946, 944, -8082, -8082, 944, -946, -61, -49 }, + + { -90, 100, -1055, 2544, -9235, -6389, -201, -670, -128, -18, + -90, 100, -1055, 2544, -9235, -6389, -201, -670, -128, -18 } + }; + + /* --- IDCT and windowing --- */ + + int dct_idx = state->idx ? 10 - state->idx : 0, odd = dct_idx & 1; + + dct4(in, scale, state->v[odd], state->v[!odd], dct_idx); + apply_window(state->v[odd], 4, window, state->idx, out, pitch); + + state->idx = state->idx < 9 ? state->idx + 1 : 0; +} + +/** + * Synthesize samples of a 8 subbands block + * state Previous transformed samples of the channel + * sb_samples Sub-band samples + * sb_scale Scale factor of samples (-2 to 14) + * out Output adress of PCM samples + * pitch Number of PCM samples between two consecutive + */ +void sbc_synthesize_8_c(struct sbc_dstate *state, + const int16_t *in, int scale, int16_t *out, int pitch) +{ + /* --- Windowing coefficients (fixed 2.13) --- + * + * The table is duplicated and transposed to fit the circular + * buffer of reconstructed samples */ + + static const int16_t window[8][2*10] = { + { 0, -132, -371, -848, -4456, -9631, 4456, -848, 371, -132, + 0, -132, -371, -848, -4456, -9631, 4456, -848, 371, -132 }, + + { -10, -138, -526, -580, -5438, -9528, 3486, -1004, 229, -117, + -10, -138, -526, -580, -5438, -9528, 3486, -1004, 229, -117 }, + + { -22, -131, -685, -192, -6395, -9224, 2561, -1063, 108, -97, + -22, -131, -685, -192, -6395, -9224, 2561, -1063, 108, -97 }, + + { -36, -106, -835, 322, -7287, -8734, 1711, -1042, 12, -75, + -36, -106, -835, 322, -7287, -8734, 1711, -1042, 12, -75 }, + + { -54, -59, -960, 959, -8078, -8078, 959, -960, -59, -54, + -54, -59, -960, 959, -8078, -8078, 959, -960, -59, -54 }, + + { -75, 12, -1042, 1711, -8734, -7287, 322, -835, -106, -36, + -75, 12, -1042, 1711, -8734, -7287, 322, -835, -106, -36 }, + + { -97, 108, -1063, 2561, -9224, -6395, -192, -685, -131, -22, + -97, 108, -1063, 2561, -9224, -6395, -192, -685, -131, -22 }, + + { -117, 229, -1004, 3486, -9528, -5438, -580, -526, -138, -10, + -117, 229, -1004, 3486, -9528, -5438, -580, -526, -138, -10 } + }; + + /* --- IDCT and windowing --- */ + + int dct_idx = state->idx ? 10 - state->idx : 0, odd = dct_idx & 1; + + dct8(in, scale, state->v[odd], state->v[!odd], dct_idx); + apply_window(state->v[odd], 8, window, state->idx, out, pitch); + + state->idx = state->idx < 9 ? state->idx + 1 : 0; +} + +/** + * Synthesize samples of a channel + * state Previous transformed samples of the channel + * nblocks Number of blocks (4, 8, 12 or 16) + * nsubbands Number of subbands (4 or 8) + * in Sub-band input samples + * scale Scale factor of samples + * out Output adress of PCM samples + * pitch Number of PCM samples between two consecutive + */ +static inline void synthesize( + struct sbc_dstate *state, int nblocks, int nsubbands, + const int16_t *in, int scale, int16_t *out, int pitch) +{ + for (int iblk = 0; iblk < nblocks; iblk++) { + + if (nsubbands == 4) + ASM(sbc_synthesize_4)(state, in, scale, out, pitch); + else + ASM(sbc_synthesize_8)(state, in, scale, out, pitch); + + in += nsubbands; + out += nsubbands * pitch; + } +} + +/** + * Probe data and return frame description + */ +int sbc_probe(const void *data, struct sbc_frame *frame) +{ + sbc_bits_t bits; + + sbc_setup_bits(&bits, SBC_BITS_READ, (void *)data, SBC_HEADER_SIZE); + return !decode_header(&bits, frame, NULL) || + sbc_bits_error(&bits) ? -1 : 0; +} + +/** + * Decode a frame + */ +int sbc_decode(struct sbc *sbc, + const void *data, unsigned size, struct sbc_frame *frame, + int16_t *pcml, int pitchl, int16_t *pcmr, int pitchr) +{ + sbc_bits_t bits; + int crc; + + /* --- Decode the frame header --- */ + + if (data) { + + if (size < SBC_HEADER_SIZE) + return -1; + + sbc_setup_bits(&bits, SBC_BITS_READ, (void *)data, SBC_HEADER_SIZE); + if (!decode_header(&bits, frame, &crc) || sbc_bits_error(&bits)) + return -1; + + if (size < sbc_get_frame_size(frame) || + compute_crc(frame, data, size) != crc) + return -1; + } + + /* --- Decode the frame data --- */ + + int16_t alignas(sizeof(int)) sb_samples[2][SBC_MAX_SAMPLES]; + int sb_scale[2]; + + if (data) { + + sbc_setup_bits(&bits, SBC_BITS_READ, + (void *)((uintptr_t)data + SBC_HEADER_SIZE), + sbc_get_frame_size(frame) - SBC_HEADER_SIZE); + + decode_frame(&bits, frame, sb_samples, sb_scale); + + sbc->nchannels = 1 + (frame->mode != SBC_MODE_MONO); + sbc->nblocks = frame->nblocks; + sbc->nsubbands = frame->nsubbands; + + } else { + + int nsamples = sbc->nblocks * sbc->nsubbands; + + for (int ich = 0; ich < sbc->nchannels; ich++) { + memset(sb_samples[ich], 0, nsamples * sizeof(int16_t)); + sb_scale[ich] = 0; + } + } + + synthesize(&sbc->dstates[0], sbc->nblocks, sbc->nsubbands, + sb_samples[0], sb_scale[0], pcml, pitchl); + + if (frame->mode != SBC_MODE_MONO) + synthesize(&sbc->dstates[1], sbc->nblocks, sbc->nsubbands, + sb_samples[1], sb_scale[1], pcmr, pitchr); + + return 0; +} + + +/* ---------------------------------------------------------------------------- + * Encoding + * ------------------------------------------------------------------------- */ + +/** + * Compute the scale factors and joint-stereo mask from sub-band samples + * frame Frame description + * sb_samples Sub-band samples (fixed 17.14) + * scale_factors Output of sub-bands scale-factors + * mjoint Masque of joint sub-bands + */ +static void compute_scale_factors_js(const struct sbc_frame *frame, + const int16_t (*sb_samples)[SBC_MAX_SAMPLES], + int (*scale_factors)[SBC_MAX_SUBBANDS], unsigned *mjoint) +{ + /* As long as coding L+R / 2, L-R / 2 result at smaller + * scale-factors, the bands are joint. */ + + *mjoint = 0; + + for (int isb = 0; isb < frame->nsubbands; isb++) { + unsigned m[2] = { }, mj[2] = { }; + + for (int iblk = 0; iblk < frame->nblocks; iblk++) { + int s0 = sb_samples[0][iblk * frame->nsubbands + isb]; + int s1 = sb_samples[1][iblk * frame->nsubbands + isb]; + + m[0] |= s0 < 0 ? ~s0 : s0; + m[1] |= s1 < 0 ? ~s1 : s1; + + mj[0] |= s0 + s1 < 0 ? ~(s0 + s1) : s0 + s1; + mj[1] |= s0 - s1 < 0 ? ~(s0 - s1) : s0 - s1; + } + + int scf0 = m[0] ? (8*sizeof(unsigned) - 1) - SBC_CLZ(m[0]) : 0; + int scf1 = m[1] ? (8*sizeof(unsigned) - 1) - SBC_CLZ(m[1]) : 0; + + int js0 = mj[0] ? (8*sizeof(unsigned) - 1) - SBC_CLZ(mj[0]) : 0; + int js1 = mj[1] ? (8*sizeof(unsigned) - 1) - SBC_CLZ(mj[1]) : 0; + + if (isb < frame->nsubbands-1 && js0 + js1 < scf0 + scf1) { + *mjoint |= 1 << isb; + scf0 = js0, scf1 = js1; + } + + scale_factors[0][isb] = scf0; + scale_factors[1][isb] = scf1; + } +} + +/** + * Compute the scale factors from sub-band samples + * frame Frame description + * sb_samples Sub-band samples + * scale_factors Output of sub-bands scale-factors + * mjoint Masque of joint sub-bands (Joint-Stereo mode) + */ +static void compute_scale_factors(const struct sbc_frame *frame, + const int16_t (*sb_samples)[SBC_MAX_SAMPLES], + int (*scale_factors)[SBC_MAX_SUBBANDS]) +{ + for (int ich = 0; ich < 1 + (frame->mode != SBC_MODE_MONO); ich++) + for (int isb = 0; isb < frame->nsubbands; isb++) { + unsigned m = 0; + + for (int iblk = 0; iblk < frame->nblocks; iblk++) { + int s = sb_samples[ich][iblk * frame->nsubbands + isb]; + + m |= s < 0 ? ~s : s; + } + + int scf = m ? (8*sizeof(unsigned) - 1) - SBC_CLZ(m) : 0; + scale_factors[ich][isb] = scf; + } +} + +/** + * Encode the 4 bytes frame header + * bits Bitstream writer + * frame Frame description to encode + */ +static void encode_header(sbc_bits_t *bits, const struct sbc_frame *frame) +{ + static const int enc_freq[SBC_NUM_FREQ] = { + /* SBC_FREQ_16K */ 0, /* SBC_FREQ_32K */ 1, + /* SBC_FREQ_44K1 */ 2, /* SBC_FREQ_48K */ 3 + }; + + static const int enc_mode[SBC_NUM_MODE] = { + /* SBC_MODE_MONO */ 0, /* SBC_MODE_DUAL_CHANNEL */ 1, + /* SBC_MODE_STEREO */ 2, /* SBC_MODE_JOINT_STEREO */ 3 }; + + static const int enc_bam[SBC_NUM_BAM] = { + /* SBC_BAM_LOUDNESS */ 0, /* SBC_BAM_SNR */ 1 }; + + /* Two possible headers : + * - Header, with syncword 0x9c (A2DP) + * - mSBC header, with syncword 0xad (HFP) */ + + SBC_WITH_BITS(bits); + + SBC_PUT_BITS("syncword", frame->msbc ? 0xad : 0x9c, 8); + + if (!frame->msbc) { + SBC_PUT_BITS("sampling_frequency", enc_freq[frame->freq], 2); + SBC_PUT_BITS("blocks", (frame->nblocks >> 2) - 1, 2); + SBC_PUT_BITS("channel_mode", enc_mode[frame->mode], 2); + SBC_PUT_BITS("allocation_method", enc_bam[frame->bam], 1); + SBC_PUT_BITS("subbands", (frame->nsubbands >> 2) - 1, 1); + SBC_PUT_BITS("bitpool", frame->bitpool, 8); + } else + SBC_PUT_BITS("reserved", 0, 16); + + SBC_PUT_BITS("crc_check", 0, 8); + + SBC_END_WITH_BITS(); +} + +/** + * Put the CRC of the frame + * frame Frame description + * data, size Frame data, and maximum writable size + * return 0: On success -1: size too small + */ +static int put_crc(const struct sbc_frame *frame, void *data, unsigned size) +{ + int crc = compute_crc(frame, data, size); + return crc < 0 ? -1 : (((uint8_t *)data)[3] = crc), 0; +} + +/** + * Encode frame data + * bits Bitstream writer + * frame Frame description + * sb_samples Sub-band samples, by channels + */ +static void encode_frame(sbc_bits_t *bits, + const struct sbc_frame *frame, int16_t (*sb_samples)[SBC_MAX_SAMPLES] ) +{ + SBC_WITH_BITS(bits); + + /* --- Compute Scale Factors --- */ + + int scale_factors[2][SBC_MAX_SUBBANDS]; + unsigned mjoint = 0; + + if (frame->mode == SBC_MODE_JOINT_STEREO) + compute_scale_factors_js(frame, sb_samples, scale_factors, &mjoint); + else + compute_scale_factors(frame, sb_samples, scale_factors); + + if (frame->mode == SBC_MODE_DUAL_CHANNEL) + compute_scale_factors(frame, sb_samples + 1, scale_factors + 1); + + /* --- Joint-Stereo mask --- */ + + if (frame->mode == SBC_MODE_JOINT_STEREO && frame->nsubbands == 4) + SBC_PUT_BITS("join[]", + ((mjoint & 0x01) << 3) | ((mjoint & 0x02) << 1) | + ((mjoint & 0x04) >> 1) | (( 0x00) >> 3) , 4); + + else if (frame->mode == SBC_MODE_JOINT_STEREO) + SBC_PUT_BITS("join[]", + ((mjoint & 0x01) << 7) | ((mjoint & 0x02) << 5) | + ((mjoint & 0x04) << 3) | ((mjoint & 0x08) << 1) | + ((mjoint & 0x10) >> 1) | ((mjoint & 0x20) >> 3) | + ((mjoint & 0x40) >> 5) | (( 0x00) >> 7) , 8); + + /* --- Encode Scale Factors --- */ + + int nchannels = 1 + (frame->mode != SBC_MODE_MONO); + int nsubbands = frame->nsubbands; + int nbits[2][SBC_MAX_SUBBANDS]; + + for (int ich = 0; ich < nchannels; ich++) + for (int isb = 0; isb < nsubbands; isb++) + SBC_PUT_BITS("scale_factor", scale_factors[ich][isb], 4); + + compute_nbits(frame, scale_factors, nbits); + if (frame->mode == SBC_MODE_DUAL_CHANNEL) + compute_nbits(frame, scale_factors + 1, nbits + 1); + + /* --- Coupling Joint-Stereo --- */ + + for (int isb = 0; isb < nsubbands; isb++) { + + if (((mjoint >> isb) & 1) == 0) + continue; + + for (int iblk = 0; iblk < frame->nblocks; iblk++) { + int16_t s0 = sb_samples[0][iblk*nsubbands + isb]; + int16_t s1 = sb_samples[1][iblk*nsubbands + isb]; + + sb_samples[0][iblk*nsubbands + isb] = (s0 + s1) >> 1; + sb_samples[1][iblk*nsubbands + isb] = (s0 - s1) >> 1; + } + } + + /* --- Quantization --- + * + * The quantization is given by : + * + * sb_sample + * sb_sample = ( ( ------------- + 1 ) (2^nbit - 1) ) >> 1 + * 2^(scf + 1) + * + * The number of bits coding a sample is limited to 16 bits, + * thus the unquantized sub-bands samples cannot overflow */ + + for (int iblk = 0; iblk < frame->nblocks; iblk++) + for (int ich = 0; ich < nchannels; ich++) + for (int isb = 0; isb < nsubbands; isb++) { + int nbit = nbits[ich][isb]; + int scf = scale_factors[ich][isb]; + + if (!nbit) continue; + + int s = sb_samples[ich][iblk*nsubbands + isb] ; + int range = ~(UINT_MAX << nbit); + + SBC_PUT_BITS("audio_sample", + (((s * range) >> (scf + 1)) + range) >> 1, nbit); + } + + + /* --- Padding --- */ + + int padding_nbits = 8 - (sbc_tell_bits(bits) % 8); + SBC_PUT_BITS("padding_bits", 0, padding_nbits < 8 ? padding_nbits : 0); + + SBC_END_WITH_BITS(); +} + +/** + * Tranform 4 PCM samples into 4 sub-bands samples of a channel + * state Previous PCM samples of the channel + * in PCM input samples + * pitch Number of PCM samples betwwen two consecutive + * out Output address of sub-band samples + */ +static void analyze_4( + struct sbc_estate *state, const int16_t *in, int pitch, int16_t *out) +{ + /* --- Windowing coefficients (fixed 2.13) --- + * + * The table is duplicated and transposed to fit the circular + * buffer of PCM samples, and DCT symmetry. */ + + static const int16_t window[2][4][5*2] = { + + { /* 0 1 2 3 4 0 1 2 3 4 */ + /* 0 */ { 0, 358, 4443,-4443, -358, 0, 358, 4443,-4443, -358 }, + /* 2 */ { 49, 946, 8082, -944, 61, 49, 946, 8082, -944, 61 }, + /* 1 */ { 18, 670, 6389,-2544, -100, 18, 670, 6389,-2544, -100 }, + /* 3 */ { 90, 1055, 9235, 201, 128, 90, 1055, 9235, 201, 128 }, + }, /* ---------------------------------------------------------- */ + + { /* 0 1 2 3 4 0 1 2 3 4 */ + /* 0 */ { 126, 848, 9644, 848, 126, 126, 848, 9644, 848, 126 }, + /* 2 */ { 61, -944, 8082, 946, 49, 61, -944, 8082, 946, 49 }, + /* 1 */ { 128, 201, 9235, 1055, 90, 128, 201, 9235, 1055, 90 }, + /* 3 */ { -100,-2544, 6389, 670, 18, -100,-2544, 6389, 670, 18 }, + }, /* ---------------------------------------------------------- */ + + }; + + /* --- Load PCM samples --- + * + * - To assist the windowing step, which is done by halves, + * the odd and even blocks of samples are separated + * + * - Rely on DCT symmetry : + * + * h(k,i) = cos( (i + 1/2) (k - n/2) pi/n ) , n = 4 + * + * h( n-k,i) = h( k,i) , k = [0;n/2-1] + * h(2n-k,i) = -h(n+k,i) , k = [1;n/2-1] + * + * The "symmetric" samples are stored closer, thus we arite samples + * in the order : [ 0, 2, (1, 3) ] */ + + int idx = state->idx >> 1, odd = state->idx & 1; + + int16_t (*x)[5] = state->x[odd]; + int in_idx = idx ? 5 - idx : 0; + + x[0][in_idx] = in[(3-0) * pitch]; x[1][in_idx] = in[(3-2) * pitch]; + x[2][in_idx] = in[(3-1) * pitch]; x[3][in_idx] = in[(3-3) * pitch]; + + /* --- Process and window --- + * ___ + * \ + * y(i) = /__ x0[i + k*4] * w0[i + k*4] , i = [0;3] , k = [0;4] + * k + * ___ + * \ + * y(i) = /__ x1[i + k*4] * w1[i + k*4] , i = [4;7] , k = [0;4] + * k + * + * x0()/w0() Blcoks, windowing coefficients + * x1()/w1() Blocks, windowing coefficients with inverse + * parity, starting the previous block. + * + * Symmetry of cosinus function : + * + * h(0,i) = h(4,i) = +/- pi/4 , h(2,i) = 1 , h(6,i) = 0 + * h(1,i) = h(3,i) , h( 5,i) = -h(7,i) + * + * Thus, we do : + * y'(0) = y(0) + y(4) y'(2) = y(5) - y(7) + * y'(1) = y(1) + y(3) y'(3) = y(2) */ + + const int16_t (*w0)[10] = (const int16_t (*)[10])(window[0][0] + idx); + const int16_t (*w1)[10] = (const int16_t (*)[10])(window[1][0] + idx); + int y0, y1, y2, y3; int16_t y[4]; + + y0 = x[0][0] * w0[0][0] + x[0][1] * w0[0][1] + + x[0][2] * w0[0][2] + x[0][3] * w0[0][3] + + x[0][4] * w0[0][4] + state->y[0]; + + state->y[0] = + x[0][0] * w1[0][0] + x[0][1] * w1[0][1] + + x[0][2] * w1[0][2] + x[0][3] * w1[0][3] + + x[0][4] * w1[0][4] ; + + y1 = x[2][0] * w0[2][0] + x[2][1] * w0[2][1] + + x[2][2] * w0[2][2] + x[2][3] * w0[2][3] + + x[2][4] * w0[2][4] + x[3][0] * w0[3][0] + + x[3][1] * w0[3][1] + x[3][2] * w0[3][2] + + x[3][3] * w0[3][3] + x[3][4] * w0[3][4] ; + + y2 = state->y[1]; + state->y[1] = + x[2][0] * w1[2][0] + x[2][1] * w1[2][1] + + x[2][2] * w1[2][2] + x[2][3] * w1[2][3] + + x[2][4] * w1[2][4] - x[3][0] * w1[3][0] - + x[3][1] * w1[3][1] - x[3][2] * w1[3][2] - + x[3][3] * w1[3][3] - x[3][4] * w1[3][4] ; + + y3 = x[1][0] * w0[1][0] + x[1][1] * w0[1][1] + + x[1][2] * w0[1][2] + x[1][3] * w0[1][3] + + x[1][4] * w0[1][4] ; + + y[0] = SBC_SAT16((y0 + (1 << 14)) >> 15); + y[1] = SBC_SAT16((y1 + (1 << 14)) >> 15); + y[2] = SBC_SAT16((y2 + (1 << 14)) >> 15); + y[3] = SBC_SAT16((y3 + (1 << 14)) >> 15); + + state->idx = state->idx < 9 ? state->idx + 1 : 0; + + /* --- Output subbands coefficients --- + * + * With H(k,i) = sign(x(k,i)) cos(abs(x(k,i)) * pi/8), + * x(i,k) = + * + * k\i | 0 1 2 3 + * -----|---------------- + * 0 | 2 -2 -2 2 = h(0,i) = h(4,i) + * 1 | 1 3 -3 -1 = h(1,i) = h(3,i) + * 2 | 3 -1 1 -3 = h(5,i) = -h(7,i) + * 3 | 0 0 0 0 = h(2,i) + * + * h(k,i) = cos( (i + 1/2) (k - 4/2) pi/8 ) */ + + static const int16_t cos8[4] = { 8192, 7568, 5793, 3135 }; + int s0, s1, s2, s3; + + s0 = y[0] * cos8[2] + y[1] * cos8[1] + y[2] * cos8[3] + (y[3] << 13); + s1 = -y[0] * cos8[2] + y[1] * cos8[3] - y[2] * cos8[1] + (y[3] << 13); + s2 = -y[0] * cos8[2] - y[1] * cos8[3] + y[2] * cos8[1] + (y[3] << 13); + s3 = y[0] * cos8[2] - y[1] * cos8[1] - y[2] * cos8[3] + (y[3] << 13); + + *(out++) = SBC_SAT16((s0 + (1 << 12)) >> 13); + *(out++) = SBC_SAT16((s1 + (1 << 12)) >> 13); + *(out++) = SBC_SAT16((s2 + (1 << 12)) >> 13); + *(out++) = SBC_SAT16((s3 + (1 << 12)) >> 13); +} + +/** + * Tranform 8 PCM samples into 8 sub-bands samples of a channel + * state Previous PCM samples of the channel + * in PCM input samples + * pitch Number of PCM samples betwwen two consecutive + * out Output address of sub-band samples + */ +static void analyze_8( + struct sbc_estate *state, const int16_t *in, int pitch, int16_t *out) +{ + /* --- Windowing coefficients (fixed 2.13) --- + * + * The table is transposed and "scrambled" to fit the circular + * buffer of PCM samples, and DCT symmetry. */ + + static const int16_t window[2][8][5*2] = { + + { /* 0 1 2 3 4 0 1 2 3 4 */ + /* 0 */ { 0, 185, 2228,-2228, -185, 0, 185, 2228,-2228, -185 }, + /* 4 */ { 27, 480, 4039, -480, 30, 27, 480, 4039, -480, 30 }, + /* 1 */ { 5, 263, 2719,-1743, -115, 5, 263, 2719,-1743, -115 }, + /* 7 */ { 58, 502, 4764, 290, 69, 58, 502, 4764, 290, 69 }, + /* 2 */ { 11, 343, 3197,-1280, -54, 11, 343, 3197,-1280, -54 }, + /* 6 */ { 48, 532, 4612, 96, 65, 48, 532, 4612, 96, 65 }, + /* 3 */ { 18, 418, 3644, -856, -6, 18, 418, 3644, -856, -6 }, + /* 5 */ { 37, 521, 4367, -161, 53, 37, 521, 4367, -161, 53 }, + }, /* ---------------------------------------------------------- */ + + { /* 0 1 2 3 4 0 1 2 3 4 */ + /* 0 */ { 66, 424, 4815, 424, 66, 66, 424, 4815, 424, 66 }, + /* 4 */ { 30, -480, 4039, 480, 27, 30, -480, 4039, 480, 27 }, + /* 1 */ { 69, 290, 4764, 502, 58, 69, 290, 4764, 502, 58 }, + /* 7 */ { -115,-1743, 2719, 263, 5, -115,-1743, 2719, 263, 5 }, + /* 2 */ { 65, 96, 4612, 532, 48, 65, 96, 4612, 532, 48 }, + /* 6 */ { -54,-1280, 3197, 343, 11, -54,-1280, 3197, 343, 11 }, + /* 3 */ { 53, -161, 4367, 521, 37, 53, -161, 4367, 521, 37 }, + /* 5 */ { -6, -856, 3644, 418, 18, -6, -856, 3644, 418, 18 }, + }, /* ---------------------------------------------------------- */ + + }; + + /* --- Load PCM samples --- + * + * - To assist the windowing step, which is done by halves, + * the odd and even blocks of samples are separated + * + * - Rely on DCT symmetry : + * + * h(k,i) = cos( (i + 1/2) (k - n/2) pi/n ) , n = 8 + * + * h( n-k,i) = h( k,i) , k = [0;n/2-1] + * h(2n-k,i) = -h(n+k,i) , k = [1;n/2-1] + * + * The "symmetric" samples are stored closer, thus we arite samples + * in the order : [ 0, 4, (1, 7), (2, 6), (3, 5) ] */ + + int idx = state->idx >> 1, odd = state->idx & 1; + + int16_t (*x)[5] = state->x[odd]; + int in_idx = idx ? 5 - idx : 0; + + x[0][in_idx] = in[(7-0) * pitch]; x[1][in_idx] = in[(7-4) * pitch]; + x[2][in_idx] = in[(7-1) * pitch]; x[3][in_idx] = in[(7-7) * pitch]; + x[4][in_idx] = in[(7-2) * pitch]; x[5][in_idx] = in[(7-6) * pitch]; + x[6][in_idx] = in[(7-3) * pitch]; x[7][in_idx] = in[(7-5) * pitch]; + + /* --- Process and window --- + * ___ + * \ + * y(i) = /__ x0[i + k*8] * w0[i + k*8] , i = [0; 7] , k = [0;4] + * k + * ___ + * \ + * y(i) = /__ x1[i + k*8] * w1[i + k*8] , i = [8;15] , k = [0;4] + * k + * + * x0()/w0() Blocks, windowing coefficients + * x1()/w1() Blocks, windowing coefficients with inverse + * parity, starting the previous block. + * + * Symmetry of cosinus function : + * + * h( 0,i) = h( 8,i) = +/- pi/4 , h( 4,i) = 1 , h(12,i) = 0 + * h( 1,i) = h( 7,i) , h( 2,i) = h( 6,i) , h( 3,i) = h( 5,i) + * h( 9,i) = -h(15,i) , h(10,i) = -h(14,i) , h(12,i) = -h(13,i) + * + * Thus, we do : + * y'(0) = y(0) + y(8) y'(4) = y( 9) - y(15) + * y'(1) = y(1) + y(7) y'(5) = y(10) - y(14) + * y'(2) = y(2) + y(6) y'(6) = y(11) - y(13) + * y'(3) = y(3) + y(5) y'(7) = y( 4) */ + + const int16_t (*w0)[10] = (const int16_t (*)[10])(window[0][0] + idx); + const int16_t (*w1)[10] = (const int16_t (*)[10])(window[1][0] + idx); + int y0, y1, y2, y3, y4, y5, y6, y7; int16_t y[8]; + + y0 = x[0][0] * w0[0][0] + x[0][1] * w0[0][1] + + x[0][2] * w0[0][2] + x[0][3] * w0[0][3] + + x[0][4] * w0[0][4] + state->y[0]; + + state->y[0] = + x[0][0] * w1[0][0] + x[0][1] * w1[0][1] + + x[0][2] * w1[0][2] + x[0][3] * w1[0][3] + + x[0][4] * w1[0][4] ; + + y1 = x[2][0] * w0[2][0] + x[2][1] * w0[2][1] + + x[2][2] * w0[2][2] + x[2][3] * w0[2][3] + + x[2][4] * w0[2][4] + x[3][0] * w0[3][0] + + x[3][1] * w0[3][1] + x[3][2] * w0[3][2] + + x[3][3] * w0[3][3] + x[3][4] * w0[3][4] ; + + y4 = state->y[1]; + state->y[1] = + x[2][0] * w1[2][0] + x[2][1] * w1[2][1] + + x[2][2] * w1[2][2] + x[2][3] * w1[2][3] + + x[2][4] * w1[2][4] - x[3][0] * w1[3][0] - + x[3][1] * w1[3][1] - x[3][2] * w1[3][2] - + x[3][3] * w1[3][3] - x[3][4] * w1[3][4] ; + + y2 = x[4][0] * w0[4][0] + x[4][1] * w0[4][1] + + x[4][2] * w0[4][2] + x[4][3] * w0[4][3] + + x[4][4] * w0[4][4] + x[5][0] * w0[5][0] + + x[5][1] * w0[5][1] + x[5][2] * w0[5][2] + + x[5][3] * w0[5][3] + x[5][4] * w0[5][4] ; + + y5 = state->y[2]; + state->y[2] = + x[4][0] * w1[4][0] + x[4][1] * w1[4][1] + + x[4][2] * w1[4][2] + x[4][3] * w1[4][3] + + x[4][4] * w1[4][4] - x[5][0] * w1[5][0] - + x[5][1] * w1[5][1] - x[5][2] * w1[5][2] - + x[5][3] * w1[5][3] - x[5][4] * w1[5][4] ; + + y3 = x[6][0] * w0[6][0] + x[6][1] * w0[6][1] + + x[6][2] * w0[6][2] + x[6][3] * w0[6][3] + + x[6][4] * w0[6][4] + x[7][0] * w0[7][0] + + x[7][1] * w0[7][1] + x[7][2] * w0[7][2] + + x[7][3] * w0[7][3] + x[7][4] * w0[7][4] ; + + y6 = state->y[3]; + state->y[3] = + x[6][0] * w1[6][0] + x[6][1] * w1[6][1] + + x[6][2] * w1[6][2] + x[6][3] * w1[6][3] + + x[6][4] * w1[6][4] - x[7][0] * w1[7][0] - + x[7][1] * w1[7][1] - x[7][2] * w1[7][2] - + x[7][3] * w1[7][3] - x[7][4] * w1[7][4] ; + + y7 = x[1][0] * w0[1][0] + x[1][1] * w0[1][1] + + x[1][2] * w0[1][2] + x[1][3] * w0[1][3] + + x[1][4] * w0[1][4] ; + + y[0] = SBC_SAT16((y0 + (1 << 14)) >> 15); + y[1] = SBC_SAT16((y1 + (1 << 14)) >> 15); + y[2] = SBC_SAT16((y2 + (1 << 14)) >> 15); + y[3] = SBC_SAT16((y3 + (1 << 14)) >> 15); + y[4] = SBC_SAT16((y4 + (1 << 14)) >> 15); + y[5] = SBC_SAT16((y5 + (1 << 14)) >> 15); + y[6] = SBC_SAT16((y6 + (1 << 14)) >> 15); + y[7] = SBC_SAT16((y7 + (1 << 14)) >> 15); + + state->idx = state->idx < 9 ? state->idx + 1 : 0; + + /* --- Output subbands coefficients --- + * + * With H(k,i) = sign(x(k,i)) cos(abs(x(k,i)) * pi/16), + * x(i,k) = + * + * k\i | 0 1 2 3 4 5 6 7 + * -----|-------------------------------- + * 0 | 4 -4 -4 4 4 -4 -4 4 = h( 0,i) = h( 8,i) + * 1 | 3 -7 -1 -5 5 1 7 -3 = h( 1,i) = h( 7,i) + * 2 | 2 6 -6 -2 -2 -6 6 2 = h( 2,i) = h( 6,i) + * 3 | 1 3 5 7 -7 -5 -3 -1 = h( 3,i) = h( 5,i) + * | + * 4 | 5 -1 7 3 -3 -7 1 -5 = h( 9,i) = -h(15,i) + * 5 | 6 -2 2 -6 -6 2 -2 6 = h(10,i) = -h(14,i) + * 6 | 7 -5 3 -1 1 -3 5 -7 = h(11,i) = -h(13,i) + * 7 | 0 0 0 0 0 0 0 0 = h( 4,i) + * + * h(k,i) = cos( (i + 1/2) (k - 8/2) pi/8 ) */ + + static const int16_t cosmat[8][8] = { + /* 0 */ { 5793, 6811, 7568, 8035, 4551, 3135, 1598, 8192 }, + /* 1 */ { -5793, -1598, 3135, 6811, -8035, -7568, -4551, 8192 }, + /* 2 */ { -5793, -8035, -3135, 4551, 1598, 7568, 6811, 8192 }, + /* 3 */ { 5793, -4551, -7568, 1598, 6811, -3135, -8035, 8192 }, + /* 4 */ { 5793, 4551, -7568, -1598, -6811, -3135, 8035, 8192 }, + /* 5 */ { -5793, 8035, -3135, -4551, -1598, 7568, -6811, 8192 }, + /* 6 */ { -5793, 1598, 3135, -6811, 8035, -7568, 4551, 8192 }, + /* 7 */ { 5793, -6811, 7568, -8035, -4551, 3135, -1598, 8192 }, + }; + + for (int i = 0; i < 8; i++) { + int s = y[0] * cosmat[i][0] + y[1] * cosmat[i][1] + + y[2] * cosmat[i][2] + y[3] * cosmat[i][3] + + y[4] * cosmat[i][4] + y[5] * cosmat[i][5] + + y[6] * cosmat[i][6] + y[7] * cosmat[i][7] ; + *(out++) = SBC_SAT16((s + (1 << 12)) >> 13); + } +} + +/** + * Tranform PCM samples into sub-bands samples of a channel + * state Previous PCM samples of the channel + * frame Frame description + * in PCM input samples + * pitch Number of samples between two consecutive + * out Sub-band samples + */ +static inline void analyze(struct sbc_estate *state, + const struct sbc_frame *frame, const int16_t *in, int pitch, int16_t *out) +{ + for (int iblk = 0; iblk < frame->nblocks; iblk++) { + + if (frame->nsubbands == 4) + analyze_4(state, in, pitch, out); + else + analyze_8(state, in, pitch, out); + + in += frame->nsubbands * pitch; + out += frame->nsubbands; + } +} + +/** + * Encode a frame + */ +int sbc_encode(struct sbc *sbc, + const int16_t *pcml, int pitchl, const int16_t *pcmr, int pitchr, + const struct sbc_frame *frame, void *data, unsigned size) +{ + /* --- Override configuration on mSBC signaling --- */ + + if (frame->msbc) + frame = &msbc_frame; + + /* --- Check the given frame description --- */ + + if (!check_frame(frame) || size < sbc_get_frame_size(frame)) + return -1; + + /* -- Analyse PCM samples --- */ + + int16_t alignas(sizeof(int)) sb_samples[2][SBC_MAX_SAMPLES]; + + analyze(&sbc->estates[0], frame, pcml, pitchl, sb_samples[0]); + if (frame->mode != SBC_MODE_MONO) + analyze(&sbc->estates[1], frame, pcmr, pitchr, sb_samples[1]); + + /* --- Encode the frame --- */ + + sbc_bits_t bits; + + sbc_setup_bits(&bits, SBC_BITS_WRITE, + (void *)((uintptr_t)data + SBC_HEADER_SIZE), + sbc_get_frame_size(frame) - SBC_HEADER_SIZE); + encode_frame(&bits, frame, sb_samples); + sbc_flush_bits(&bits); + + sbc_setup_bits(&bits, SBC_BITS_WRITE, data, SBC_HEADER_SIZE); + encode_header(&bits, frame); + sbc_flush_bits(&bits); + + put_crc(frame, data, size); + + return 0; +} diff --git a/examples/voice_remote_ctrl/src/audio_adpcm.c b/examples/voice_remote_ctrl/src/audio_adpcm.c index 537b84575..70d50f8cd 100644 --- a/examples/voice_remote_ctrl/src/audio_adpcm.c +++ b/examples/voice_remote_ctrl/src/audio_adpcm.c @@ -32,7 +32,7 @@ static void adpcm_update(adpcm_state_t* state, const uint8_t sample) int32_t predicated = state->predicated; /* compute new sample estimate predictedSample */ - diff = ((sample & 0x7) * step_size) >> 2; // calculate difference = (newSample + 1/2) * stepsize/4 + diff = ((sample & 0x7) * step_size) >> 2; // calculate difference = (newSample + 1/2) * stepsize/4 diff += step_size >> 3; if (sample & 0x8) diff = -diff; @@ -53,9 +53,9 @@ static void adpcm_update(adpcm_state_t* state, const uint8_t sample) state->index = 88; } -void adpcm_encode(adpcm_enc_t *adpcm, pcm_sample_t *input, int input_size, void *output, int output_size) +void adpcm_encode(adpcm_enc_t *adpcm, const pcm_sample_t *input, int input_size) { - pcm_sample_t *sample = input; + const pcm_sample_t *sample = input; int i; for (i = 0; i < input_size; i++) @@ -95,7 +95,7 @@ void adpcm_encode(adpcm_enc_t *adpcm, pcm_sample_t *input, int input_size, void adpcm->output = new_sample; } - adpcm_update(&adpcm->state, new_sample); + adpcm_update(&adpcm->state, new_sample); } } diff --git a/examples/voice_remote_ctrl/src/audio_adpcm.h b/examples/voice_remote_ctrl/src/audio_adpcm.h index f3b169627..19ee34595 100644 --- a/examples/voice_remote_ctrl/src/audio_adpcm.h +++ b/examples/voice_remote_ctrl/src/audio_adpcm.h @@ -7,12 +7,12 @@ extern "C" { #endif +typedef int16_t pcm_sample_t; + // References for ADPCM: // 1. Text Books on Communication Systems // 2. http://www.cs.columbia.edu/~hgs/audio/dvi/IMA_ADPCM.pdf -typedef int16_t pcm_sample_t; - typedef void (*adpcm_encode_output_cb_f)(uint8_t output, void *param); typedef void (*adpcm_decode_output_cb_f)(pcm_sample_t output, void* param); @@ -41,7 +41,7 @@ typedef struct adpcm_dec_s void adpcm_enc_init(adpcm_enc_t *adpcm, adpcm_encode_output_cb_f callback, void *param); void adpcm_dec_init(adpcm_dec_t* adpcm, adpcm_decode_output_cb_f callback, void* param); -void adpcm_encode(adpcm_enc_t *adpcm, pcm_sample_t *input, int input_size, void *output, int output_size); +void adpcm_encode(adpcm_enc_t *adpcm, const pcm_sample_t *input, int input_size); void adpcm_decode(adpcm_dec_t *adpcm, uint8_t data); void adpcm_set_dec_state(adpcm_dec_t *adpcm, const adpcm_state_t *state); diff --git a/examples/voice_remote_ctrl/src/audio_encoder.h b/examples/voice_remote_ctrl/src/audio_encoder.h index a18f0309b..70a7bc113 100644 --- a/examples/voice_remote_ctrl/src/audio_encoder.h +++ b/examples/voice_remote_ctrl/src/audio_encoder.h @@ -9,7 +9,6 @@ extern "C" { #define AUDIO_CODEC_ALG_ADPCM 0 #define AUDIO_CODEC_ALG_SBC 1 -#define AUDIO_CODEC_ALG_LC3 2 #ifndef AUDIO_CODEC_ALG #define AUDIO_CODEC_ALG AUDIO_CODEC_ALG_ADPCM @@ -17,10 +16,8 @@ extern "C" { #if (AUDIO_CODEC_ALG == AUDIO_CODEC_ALG_ADPCM) #include "audio_adpcm.h" -static adpcm_enc_t adpcm; #elif (AUDIO_CODEC_ALG == AUDIO_CODEC_ALG_SBC) #include "audio_sbc.h" -static sbc_t sbc; #else #error unknown AUDIO_CODEC_ALG #endif @@ -29,9 +26,9 @@ typedef struct { int num; int size; -}sample_buf_t; +} sample_buf_t; -typedef void (* fun_encoder)(void *enc, void *input, int input_size, void *output, int output_size); +typedef void (* fun_encoder)(void *enc, const pcm_sample_t *input, int input_size); typedef struct { @@ -45,7 +42,7 @@ typedef struct sample_buf_t sample_buf; fun_encoder encoder; -}audio_encoder_t; +} audio_encoder_t; #ifdef __cplusplus } diff --git a/examples/voice_remote_ctrl/src/audio_input_sim.c b/examples/voice_remote_ctrl/src/audio_input_sim.c index a556f6d11..9850c5cbb 100644 --- a/examples/voice_remote_ctrl/src/audio_input_sim.c +++ b/examples/voice_remote_ctrl/src/audio_input_sim.c @@ -8,14 +8,20 @@ #include "audio_encoder.h" -const pcm_sample_t pcm[] = -#include "../data/itu_female_16k.m" -; - #if (SAMPLING_RATE != 16000) #error "only 16kHz is supported" #endif +#define NUM_OF_SAMPLES 57190 + +#if (INGCHIPS_FAMILY == INGCHIPS_FAMILY_918) + #define SAMPLES_LOCATION 0x00084000 +#elif (INGCHIPS_FAMILY == INGCHIPS_FAMILY_916) + #define SAMPLES_LOCATION 0x02041000 +#endif + +static const pcm_sample_t *pcm = (const pcm_sample_t *)SAMPLES_LOCATION; + static uint16_t pcm_index = 0; uint32_t audio_sample_isr(void *user_data) @@ -27,7 +33,7 @@ uint32_t audio_sample_isr(void *user_data) TMR_IntClr(APB_TMR1, 0, 0x1); #endif - if (pcm_index < sizeof(pcm) / sizeof(pcm[0])) + if (pcm_index < NUM_OF_SAMPLES) { sample = pcm[pcm_index++]; } diff --git a/examples/voice_remote_ctrl/src/audio_sbc.c b/examples/voice_remote_ctrl/src/audio_sbc.c index f8b8c9abc..3170e3640 100644 --- a/examples/voice_remote_ctrl/src/audio_sbc.c +++ b/examples/voice_remote_ctrl/src/audio_sbc.c @@ -1,1061 +1,40 @@ -#include -#include -#include -#include -#include -#include -#include - -#include "ingsoc.h" - -#include "FreeRTOS.h" -#include "semphr.h" -#include "queue.h" - -#include "platform_api.h" +#if (AUDIO_CODEC_ALG == 1) #include "audio_sbc.h" -#include "audio_sbc_tables.h" -#include "audio_sbc_types.h" - -static void __sbc_analyze_four(const int32_t *in, int32_t *out); - -static void __sbc_analyze_eight(const int32_t *in, int32_t *out); - -static void sbc_analyze_four(sbc_encoder_state *state, - sbc_frame *frame, - int ch, - int blk); - -static void sbc_analyze_eight(sbc_encoder_state *state, - sbc_frame *frame, - int ch, - int blk); - - -/* - * Calculates the CRC-8 of the first len bits in data - */ -static const uint8_t crc_table[256] = { - 0x00, 0x1D, 0x3A, 0x27, 0x74, 0x69, 0x4E, 0x53, - 0xE8, 0xF5, 0xD2, 0xCF, 0x9C, 0x81, 0xA6, 0xBB, - 0xCD, 0xD0, 0xF7, 0xEA, 0xB9, 0xA4, 0x83, 0x9E, - 0x25, 0x38, 0x1F, 0x02, 0x51, 0x4C, 0x6B, 0x76, - 0x87, 0x9A, 0xBD, 0xA0, 0xF3, 0xEE, 0xC9, 0xD4, - 0x6F, 0x72, 0x55, 0x48, 0x1B, 0x06, 0x21, 0x3C, - 0x4A, 0x57, 0x70, 0x6D, 0x3E, 0x23, 0x04, 0x19, - 0xA2, 0xBF, 0x98, 0x85, 0xD6, 0xCB, 0xEC, 0xF1, - 0x13, 0x0E, 0x29, 0x34, 0x67, 0x7A, 0x5D, 0x40, - 0xFB, 0xE6, 0xC1, 0xDC, 0x8F, 0x92, 0xB5, 0xA8, - 0xDE, 0xC3, 0xE4, 0xF9, 0xAA, 0xB7, 0x90, 0x8D, - 0x36, 0x2B, 0x0C, 0x11, 0x42, 0x5F, 0x78, 0x65, - 0x94, 0x89, 0xAE, 0xB3, 0xE0, 0xFD, 0xDA, 0xC7, - 0x7C, 0x61, 0x46, 0x5B, 0x08, 0x15, 0x32, 0x2F, - 0x59, 0x44, 0x63, 0x7E, 0x2D, 0x30, 0x17, 0x0A, - 0xB1, 0xAC, 0x8B, 0x96, 0xC5, 0xD8, 0xFF, 0xE2, - 0x26, 0x3B, 0x1C, 0x01, 0x52, 0x4F, 0x68, 0x75, - 0xCE, 0xD3, 0xF4, 0xE9, 0xBA, 0xA7, 0x80, 0x9D, - 0xEB, 0xF6, 0xD1, 0xCC, 0x9F, 0x82, 0xA5, 0xB8, - 0x03, 0x1E, 0x39, 0x24, 0x77, 0x6A, 0x4D, 0x50, - 0xA1, 0xBC, 0x9B, 0x86, 0xD5, 0xC8, 0xEF, 0xF2, - 0x49, 0x54, 0x73, 0x6E, 0x3D, 0x20, 0x07, 0x1A, - 0x6C, 0x71, 0x56, 0x4B, 0x18, 0x05, 0x22, 0x3F, - 0x84, 0x99, 0xBE, 0xA3, 0xF0, 0xED, 0xCA, 0xD7, - 0x35, 0x28, 0x0F, 0x12, 0x41, 0x5C, 0x7B, 0x66, - 0xDD, 0xC0, 0xE7, 0xFA, 0xA9, 0xB4, 0x93, 0x8E, - 0xF8, 0xE5, 0xC2, 0xDF, 0x8C, 0x91, 0xB6, 0xAB, - 0x10, 0x0D, 0x2A, 0x37, 0x64, 0x79, 0x5E, 0x43, - 0xB2, 0xAF, 0x88, 0x95, 0xC6, 0xDB, 0xFC, 0xE1, - 0x5A, 0x47, 0x60, 0x7D, 0x2E, 0x33, 0x14, 0x09, - 0x7F, 0x62, 0x45, 0x58, 0x0B, 0x16, 0x31, 0x2C, - 0x97, 0x8A, 0xAD, 0xB0, 0xE3, 0xFE, 0xD9, 0xC4 -}; - -static uint8_t sbc_crc8(const uint8_t *data, int len) -{ - uint8_t crc = 0x0f; - int i; - uint8_t octet; - - for (i = 0; i < len / 8; i++) - crc = crc_table[crc ^ data[i]]; - - octet = len % 8 ? data[i] : 0; - for (i = 0; i < len % 8; i++) - { - char bit = ((octet ^ crc) & 0x80) >> 7; - - crc = ((crc & 0x7f) << 1) ^ (bit ? 0x1d : 0); - - octet = octet << 1; - } - - return crc; -} - -/* - * Code straight from the spec to calculate the bits array - * Takes a pointer to the frame in question, a pointer to the bits array and - * the sampling frequency (as 2 bit integer) - */ -static void sbc_calculate_bits_internal(const sbc_frame *frame, - int (*bits)[8], - int subbands) -{ - uint8_t sf = frame->frequency; - - if(frame->mode == MONO || frame->mode == DUAL_CHANNEL) - { - int bitneed[2][8], loudness, max_bitneed, bitcount, slicecount, bitslice; - int ch, sb; - - for(ch = 0; ch < frame->channels; ch++) - { - max_bitneed = 0; - if(frame->allocation == SNR) - { - for(sb = 0; sb < subbands; sb++) - { - bitneed[ch][sb] = frame->scale_factor[ch][sb]; - if (bitneed[ch][sb] > max_bitneed) - max_bitneed = bitneed[ch][sb]; - } - } - else - { - for(sb = 0; sb < subbands; sb++) - { - if(frame->scale_factor[ch][sb] == 0) - bitneed[ch][sb] = -5; - else - { - if (subbands == 4) - loudness = frame->scale_factor[ch][sb] - sbc_offset4[sf][sb]; - else - loudness = frame->scale_factor[ch][sb] - sbc_offset8[sf][sb]; - if (loudness > 0) - bitneed[ch][sb] = loudness / 2; - else - bitneed[ch][sb] = loudness; - } - if (bitneed[ch][sb] > max_bitneed) - max_bitneed = bitneed[ch][sb]; - } - } - - bitcount = 0; - slicecount = 0; - bitslice = max_bitneed + 1; - do { - bitslice--; - bitcount += slicecount; - slicecount = 0; - for(sb = 0; sb < subbands; sb++) - { - if ((bitneed[ch][sb] > bitslice + 1) && (bitneed[ch][sb] < bitslice + 16)) - slicecount++; - else if (bitneed[ch][sb] == bitslice + 1) - slicecount += 2; - } - } while (bitcount + slicecount < frame->bitpool); - - if(bitcount + slicecount == frame->bitpool) - { - bitcount += slicecount; - bitslice--; - } - - for(sb = 0; sb < subbands; sb++) - { - if (bitneed[ch][sb] < bitslice + 2) - bits[ch][sb] = 0; - else - { - bits[ch][sb] = bitneed[ch][sb] - bitslice; - if (bits[ch][sb] > 16) - bits[ch][sb] = 16; - } - } - - for(sb = 0; bitcount < frame->bitpool && sb < subbands; sb++) - { - if((bits[ch][sb] >= 2) && (bits[ch][sb] < 16)) - { - bits[ch][sb]++; - bitcount++; - } - else if((bitneed[ch][sb] == bitslice + 1) && (frame->bitpool > bitcount + 1)) - { - bits[ch][sb] = 2; - bitcount += 2; - } - } - - for(sb = 0; bitcount < frame->bitpool && sb < subbands; sb++) - { - if(bits[ch][sb] < 16) - { - bits[ch][sb]++; - bitcount++; - } - } - } - } - else if (frame->mode == STEREO || frame->mode == JOINT_STEREO) - { - int bitneed[2][8], loudness, max_bitneed, bitcount, slicecount, bitslice; - int ch, sb; - - max_bitneed = 0; - if (frame->allocation == SNR) - { - for (ch = 0; ch < 2; ch++) - { - for (sb = 0; sb < subbands; sb++) - { - bitneed[ch][sb] = frame->scale_factor[ch][sb]; - if (bitneed[ch][sb] > max_bitneed) - max_bitneed = bitneed[ch][sb]; - } - } - } else { - for (ch = 0; ch < 2; ch++) - { - for (sb = 0; sb < subbands; sb++) - { - if (frame->scale_factor[ch][sb] == 0) - bitneed[ch][sb] = -5; - else { - if (subbands == 4) - loudness = frame->scale_factor[ch][sb] - sbc_offset4[sf][sb]; - else - loudness = frame->scale_factor[ch][sb] - sbc_offset8[sf][sb]; - if (loudness > 0) - bitneed[ch][sb] = loudness / 2; - else - bitneed[ch][sb] = loudness; - } - if (bitneed[ch][sb] > max_bitneed) - max_bitneed = bitneed[ch][sb]; - } - } - } - - bitcount = 0; - slicecount = 0; - bitslice = max_bitneed + 1; - do { - bitslice--; - bitcount += slicecount; - slicecount = 0; - for (ch = 0; ch < 2; ch++) - { - for (sb = 0; sb < subbands; sb++) - { - if ((bitneed[ch][sb] > bitslice + 1) && (bitneed[ch][sb] < bitslice + 16)) - slicecount++; - else if (bitneed[ch][sb] == bitslice + 1) - slicecount += 2; - } - } - } while (bitcount + slicecount < frame->bitpool); - - if (bitcount + slicecount == frame->bitpool) - { - bitcount += slicecount; - bitslice--; - } - - for (ch = 0; ch < 2; ch++) - { - for (sb = 0; sb < subbands; sb++) - { - if (bitneed[ch][sb] < bitslice + 2) - { - bits[ch][sb] = 0; - } - else - { - bits[ch][sb] = bitneed[ch][sb] - bitslice; - if (bits[ch][sb] > 16) - bits[ch][sb] = 16; - } - } - } - - ch = 0; - sb = 0; - while (bitcount < frame->bitpool) - { - if ((bits[ch][sb] >= 2) && (bits[ch][sb] < 16)) - { - bits[ch][sb]++; - bitcount++; - } else if ((bitneed[ch][sb] == bitslice + 1) && (frame->bitpool > bitcount + 1)) - { - bits[ch][sb] = 2; - bitcount += 2; - } - if (ch == 1) - { - ch = 0; - sb++; - if (sb >= subbands) - break; - } - else - ch = 1; - } - - ch = 0; - sb = 0; - while (bitcount < frame->bitpool) - { - if (bits[ch][sb] < 16) - { - bits[ch][sb]++; - bitcount++; - } - if (ch == 1) - { - ch = 0; - sb++; - if (sb >= subbands) - break; - } - else - ch = 1; - } - } -} - -static void sbc_calculate_bits(const sbc_frame *frame, int (*bits)[8]) -{ - if (frame->subbands == 4) - sbc_calculate_bits_internal(frame, bits, 4); - else - sbc_calculate_bits_internal(frame, bits, 8); -} - -int16_t sbc_clip16(int32_t s) -{ - if (s > 0x7FFF) //32767 - return 0x7FFF; - else if (s < -0x8000) //-32768 - return -0x8000; - else - return s; -} - -static int sbc_analyze_audio(sbc_encoder_state *state, sbc_frame *frame) -{ - int ch, blk; - - switch (frame->subbands) { - case 4: - for (ch = 0; ch < frame->channels; ch++) - for (blk = 0; blk < frame->blocks; blk++) - sbc_analyze_four(state, frame, ch, blk); - return frame->blocks * 4; - - case 8: - for (ch = 0; ch < frame->channels; ch++) - for (blk = 0; blk < frame->blocks; blk++) - sbc_analyze_eight(state, frame, ch, blk); - return frame->blocks * 8; - - default: - return -EIO; - } -} - -/* Supplementary bitstream writing macros for 'sbc_pack_frame' */ -#define PUT_BITS(data_ptr, bits_cache, bits_count, v, n) \ - do { \ - bits_cache = (v) | (bits_cache << (n)); \ - bits_count += (n); \ - if (bits_count >= 16) { \ - bits_count -= 8; \ - *data_ptr++ = (uint8_t) \ - (bits_cache >> bits_count); \ - bits_count -= 8; \ - *data_ptr++ = (uint8_t) \ - (bits_cache >> bits_count); \ - } \ - } while (0) - -#define FLUSH_BITS(data_ptr, bits_cache, bits_count) \ - do { \ - while (bits_count >= 8) { \ - bits_count -= 8; \ - *data_ptr++ = (uint8_t) \ - (bits_cache >> bits_count); \ - } \ - if (bits_count > 0) \ - *data_ptr++ = (uint8_t) \ - (bits_cache << (8 - bits_count)); \ - } while (0) - -static int sbc_pack_frame(uint8_t *data, sbc_frame *frame, int len) -{ - int produced; - /* Will copy the header parts for CRC-8 calculation here */ - uint8_t crc_header[11] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - int crc_pos = 0; - - uint16_t audio_sample; - - int ch, sb, blk, bit; /* channel, subband, block and bit counters */ - int bits[2][8]; /* bits distribution */ - int levels[2][8]; /* levels are derived from that */ - - uint32_t scalefactor[2][8]; /* derived from frame->scale_factor */ - - data[0] = SBC_SYNCWORD; - - data[1] = (frame->frequency & 0x03) << 6; - - data[1] |= (frame->block_mode & 0x03) << 4; - - data[1] |= (frame->mode & 0x03) << 2; - - data[1] |= (frame->allocation & 0x01) << 1; - - switch (frame->subbands) - { - case 4: - /* Nothing to do */ - break; - case 8: - data[1] |= 0x01; - break; - default: - return -4; - } - - data[2] = frame->bitpool; - - if ((frame->mode == SBC_MODE_MONO || frame->mode == SBC_MODE_DUAL_CHANNEL) && - frame->bitpool > frame->subbands << 4) - return -5; - - if ((frame->mode == SBC_MODE_STEREO || frame->mode == SBC_MODE_JOINT_STEREO) && - frame->bitpool > frame->subbands << 5) - return -5; - - /* Can't fill in crc yet */ - - produced = 32; - crc_header[0] = data[1]; - crc_header[1] = data[2]; - crc_pos = 16; - - for (ch = 0; ch < frame->channels; ch++) - { - for (sb = 0; sb < frame->subbands; sb++) - { - frame->scale_factor[ch][sb] = 0; - scalefactor[ch][sb] = 2; - for (blk = 0; blk < frame->blocks; blk++) - { - while (scalefactor[ch][sb] < fabs(frame->sb_sample_f[blk][ch][sb])) - { - frame->scale_factor[ch][sb]++; - scalefactor[ch][sb] *= 2; - } - } - } - } - - if (frame->mode == SBC_MODE_JOINT_STEREO) - { - /* like frame->sb_sample but joint stereo */ - int32_t sb_sample_j[16][2]; - /* scalefactor and scale_factor in joint case */ - uint32_t scalefactor_j[2]; - uint8_t scale_factor_j[2]; - - frame->joint = 0; - - for (sb = 0; sb < frame->subbands - 1; sb++) - { - scale_factor_j[0] = 0; - scalefactor_j[0] = 2; - scale_factor_j[1] = 0; - scalefactor_j[1] = 2; - - for (blk = 0; blk < frame->blocks; blk++) - { - /* Calculate joint stereo signal */ - sb_sample_j[blk][0] = - (frame->sb_sample_f[blk][0][sb] + - frame->sb_sample_f[blk][1][sb]) >> 1; - sb_sample_j[blk][1] = - (frame->sb_sample_f[blk][0][sb] - - frame->sb_sample_f[blk][1][sb]) >> 1; - - /* calculate scale_factor_j and scalefactor_j for joint case */ - while (scalefactor_j[0] < fabs(sb_sample_j[blk][0])) - { - scale_factor_j[0]++; - scalefactor_j[0] *= 2; - } - while (scalefactor_j[1] < fabs(sb_sample_j[blk][1])) - { - scale_factor_j[1]++; - scalefactor_j[1] *= 2; - } - } - - /* decide whether to join this subband */ - if ((scalefactor[0][sb] + scalefactor[1][sb]) > (scalefactor_j[0] + scalefactor_j[1]) ) - { - /* use joint stereo for this subband */ - frame->joint |= 1 << sb; - frame->scale_factor[0][sb] = scale_factor_j[0]; - frame->scale_factor[1][sb] = scale_factor_j[1]; - scalefactor[0][sb] = scalefactor_j[0]; - scalefactor[1][sb] = scalefactor_j[1]; - for (blk = 0; blk < frame->blocks; blk++) - { - frame->sb_sample_f[blk][0][sb] = - sb_sample_j[blk][0]; - frame->sb_sample_f[blk][1][sb] = - sb_sample_j[blk][1]; - } - } - } - - data[4] = 0; - for (sb = 0; sb < frame->subbands - 1; sb++) - data[4] |= ((frame->joint >> sb) & 0x01) << (frame->subbands - 1 - sb); - - crc_header[crc_pos >> 3] = data[4]; - - produced += frame->subbands; - crc_pos += frame->subbands; - } - - for (ch = 0; ch < frame->channels; ch++) - { - for (sb = 0; sb < frame->subbands; sb++) - { - data[produced >> 3] <<= 4; - crc_header[crc_pos >> 3] <<= 4; - data[produced >> 3] |= frame->scale_factor[ch][sb] & 0x0F; - crc_header[crc_pos >> 3] |= frame->scale_factor[ch][sb] & 0x0F; - produced += 4; - crc_pos += 4; - } - } - - /* align the last crc byte */ - if (crc_pos % 8) - crc_header[crc_pos >> 3] <<= 8 - (crc_pos % 8); - - data[3] = sbc_crc8(crc_header, crc_pos); - sbc_calculate_bits(frame, bits); - - for (ch = 0; ch < frame->channels; ch++) - { - for (sb = 0; sb < frame->subbands; sb++) - { - levels[ch][sb] = (1 << bits[ch][sb]) - 1; - } - } - - for (blk = 0; blk < frame->blocks; blk++) - { - for (ch = 0; ch < frame->channels; ch++) - { - for (sb = 0; sb < frame->subbands; sb++) - { - if (levels[ch][sb] > 0) - { - audio_sample = (uint16_t) ((((frame->sb_sample_f[blk][ch][sb]*levels[ch][sb]) >> - (frame->scale_factor[ch][sb] + 1)) + levels[ch][sb]) >> 1); - audio_sample <<= 16 - bits[ch][sb]; - - for (bit = 0; bit < bits[ch][sb]; bit++) - { - data[produced >> 3] <<= 1; - if (audio_sample & 0x8000) - data[produced >> 3] |= 0x1; - audio_sample <<= 1; - produced++; - } - } - } - } - } - - /* align the last byte */ - if (produced % 8) - { - data[produced >> 3] <<= 8 - (produced % 8); - } - - return (produced + 7) >> 3; -} - - -static void sbc_encoder_init(sbc_encoder_state *state, const sbc_frame *frame) -{ - memset(&state->X, 0, sizeof(state->X)); - state->subbands = frame->subbands; - state->position[0] = state->position[1] = 9 * frame->subbands; -} - -struct sbc_priv { - bool init; - sbc_frame frame; - sbc_encoder_state enc_state; -}; - -static void sbc_set_defaults(sbc_t *sbc, uint8_t flags) -{ - sbc->flags = flags; - sbc->frequency = SBC_FREQ_16000; - sbc->mode = SBC_MODE_MONO; - sbc->channels = ((sbc->mode == SBC_MODE_MONO) ? 1 : 2); - sbc->subbands = SBC_SB_4; - sbc->blocks = SBC_BLK_16; - sbc->allocation = SBC_AM_SNR; - sbc->bitpool = 9; -#if __BYTE_ORDER == __LITTLE_ENDIAN - sbc->endian = SBC_LE; -#elif __BYTE_ORDER == __BIG_ENDIAN - sbc->endian = SBC_BE; -#else -#error "Unknown byte order" -#endif -} - -int sbc_enc_init(sbc_t *sbc, sbc_encode_output_cb_f callback, uint8_t flags) -{ - if (!sbc) - return -EIO; - - memset(sbc, 0, sizeof(sbc_t)); - sbc->priv_alloc_base = malloc(sizeof(struct sbc_priv) + SBC_ALIGN_MASK); - - if (!sbc->priv_alloc_base) - return -ENOMEM; - - sbc->priv = (void *) (((uintptr_t) sbc->priv_alloc_base + - SBC_ALIGN_MASK) & ~((uintptr_t) SBC_ALIGN_MASK)); - - memset(sbc->priv, 0, sizeof(struct sbc_priv)); - sbc_set_defaults(sbc, flags); - sbc->callback = callback; - - return 0; -} - -static inline void sbc_analyze_four(sbc_encoder_state *state, - sbc_frame *frame, - int ch, - int blk) -{ - int32_t *x = &state->X[ch][state->position[ch]]; - int16_t *pcm = &frame->pcm_sample[ch][blk * 4]; - - /* Input 4 Audio Samples */ - x[40] = x[0] = pcm[3]; - x[41] = x[1] = pcm[2]; - x[42] = x[2] = pcm[1]; - x[43] = x[3] = pcm[0]; - - __sbc_analyze_four(x, frame->sb_sample_f[blk][ch]); - - state->position[ch] -= 4; - if (state->position[ch] < 0) - state->position[ch] = 36; -} -void sbc_analyze_eight(sbc_encoder_state *state, - sbc_frame *frame, - int ch, - int blk) -{ - int32_t *x = &state->X[ch][state->position[ch]]; - int16_t *pcm = &frame->pcm_sample[ch][blk * 8]; - - /* Input 8 Audio Samples */ - x[80] = x[0] = pcm[7]; - x[81] = x[1] = pcm[6]; - x[82] = x[2] = pcm[5]; - x[83] = x[3] = pcm[4]; - x[84] = x[4] = pcm[3]; - x[85] = x[5] = pcm[2]; - x[86] = x[6] = pcm[1]; - x[87] = x[7] = pcm[0]; - - __sbc_analyze_eight(x, frame->sb_sample_f[blk][ch]); +#include "app_cfg.h" - state->position[ch] -= 8; - if (state->position[ch] < 0) - state->position[ch] = 72; -} +#include "../libsbc/src/bits.c" +#include "../libsbc/src/sbc.c" -static int sbc_clz(uint32_t x) +int sbc_get_n_of_samples(sbc_enc_ctx_t *sbc) { -#ifdef __GNUC__ - return __builtin_clz(x); -#else - /* TODO: this should be replaced with something better if good - * performance is wanted when using compilers other than gcc */ - int cnt = 0; - while (x) { - cnt++; - x >>= 1; - } - return 32 - cnt; -#endif + return sbc->frame.nblocks * sbc->frame.nsubbands; } -void sbc_calc_scalefactors(int32_t sb_sample_f[16][2][8], - uint32_t scale_factor[2][8], - int blocks, - int channels, - int subbands) +void sbc_enc(sbc_enc_ctx_t *sbc, const pcm_sample_t *input, int input_size) { - int ch, sb, blk; - for (ch = 0; ch < channels; ch++) - { - for (sb = 0; sb < subbands; sb++) - { - uint32_t x = 1 << SCALE_OUT_BITS; - for (blk = 0; blk < blocks; blk++) - { - int32_t tmp = fabs(sb_sample_f[blk][ch][sb]); - if (tmp != 0) - x |= tmp - 1; - } - scale_factor[ch][sb] = (31 - SCALE_OUT_BITS) - - sbc_clz(x); - } - } -} - -void sbc_encode(sbc_t *sbc, - int16_t *input, - int input_len, - void *output, - int output_len) -{ - struct sbc_priv *priv; - int ch; - int framelen; int i; - int16_t *ptr; - - priv = sbc->priv; - - if (!priv->init) - { - priv->frame.frequency = sbc->frequency; - priv->frame.mode = (sbc_mdoe)sbc->mode; - priv->frame.channels = sbc->mode == SBC_MODE_MONO ? 1 : 2; - priv->frame.allocation = (sbc_allocation)sbc->allocation; - priv->frame.subband_mode = sbc->subbands; - priv->frame.subbands = sbc->subbands ? 8 : 4; - priv->frame.block_mode = sbc->blocks; - priv->frame.blocks = 4 + (sbc->blocks * 4); - priv->frame.bitpool = sbc->bitpool; - priv->frame.frame_count = 0; - priv->frame.codesize = sbc_get_codesize(sbc); - priv->frame.length = sbc_get_frame_length(sbc); - sbc_encoder_init(&priv->enc_state, &priv->frame); - priv->init = true; - } - else if (priv->frame.bitpool != sbc->bitpool) - { - //ref section 12.9 of A2DP - priv->frame.length = sbc_get_frame_length(sbc); - priv->frame.bitpool = sbc->bitpool; - } - - ptr = input; - - for (i = 0; i < priv->frame.subbands * priv->frame.blocks; i++) - { - for (ch = 0; ch < sbc->channels; ch++) - { - int16_t s; - - if (sbc->endian == SBC_LE) - s = ((ptr[0] & 0x00ff) << 8) | ((ptr[0] & 0xff00) >> 8); - else - s = ptr[0]; - ptr++; - - priv->frame.pcm_sample[ch][i] = s; - } - } - - sbc_analyze_audio(&priv->enc_state, &priv->frame); - framelen = sbc_pack_frame(output,&priv->frame, output_len); - - //using the output interface - for (i=0; i < framelen; i++) - { - sbc->callback(*((uint8_t *)(output) + i), 0); - } -} - -void sbc_finish(sbc_t *sbc) -{ - if (!sbc) - return; - - free(sbc->priv_alloc_base); - memset(sbc, 0, sizeof(sbc_t)); -} + int len; -int sbc_get_frame_length(sbc_t *sbc) -{ - int ret; - uint8_t subbands, channels, blocks, joint, bitpool; - struct sbc_priv *priv; - - priv = sbc->priv; - - if (priv->init && priv->frame.bitpool == sbc->bitpool) - return priv->frame.length; + if (input_size != sbc_get_n_of_samples(sbc)) + while (1); - subbands = sbc->subbands ? 8 : 4; - blocks = 4 + (sbc->blocks * 4); - channels = sbc->mode == SBC_MODE_MONO ? 1 : 2; - joint = sbc->mode == SBC_MODE_JOINT_STEREO ? 1 : 0; - bitpool = sbc->bitpool; + sbc_encode(&sbc->sbc, + input + 0, 1, + input + 1, 2, // ignored + &sbc->frame, + sbc->output, sizeof(sbc->output)); - ret = 4 + (4 * subbands * channels) / 8; - /* This term is not always evenly divide so we round it up */ - if (channels == 1 || sbc->mode == SBC_MODE_DUAL_CHANNEL) - //''MONO' or 'DUAL_CHANNEL' - ret += ((blocks * channels * bitpool) + 7) / 8; - else - //'STEREO' or 'JOINT STEREO' - ret += (((joint ? subbands : 0) + blocks * bitpool) + 7) / 8; - - return ret; + len = sbc_get_frame_size(&sbc->frame); + for (i = 0; i < len; i++) + sbc->callback(sbc->output[i], sbc->param); } -int sbc_get_codesize(sbc_t *sbc) +void sbc_enc_init(sbc_enc_ctx_t *sbc, sbc_encode_output_cb_f callback, void *param) { - uint16_t subbands, channels, blocks; - struct sbc_priv *priv; - - priv = sbc->priv; - - if (!priv->init) - { - subbands = sbc->subbands ? 8 : 4; - blocks = 4 + (sbc->blocks * 4); - channels = sbc->mode == SBC_MODE_MONO ? 1 : 2; - } - else - { - subbands = priv->frame.subbands; - blocks = priv->frame.blocks; - channels = priv->frame.channels; - } - - return subbands * blocks * channels * 2; -} - -int sbc_reinit(sbc_t *sbc, uint8_t flags) -{ - struct sbc_priv *priv; - - if (!sbc || !sbc->priv) - return -EIO; - - priv = sbc->priv; - - if (priv->init) - memset(sbc->priv, 0, sizeof(struct sbc_priv)); - - sbc_set_defaults(sbc, flags); - - return 0; -} - -static void __sbc_analyze_four(const int32_t *in, int32_t *out) -{ - sbc_fixed_t t[8], s[5]; - - /* -Windowing by 4 coefficients- - for i = 0 to 39 do - Z[i] = C[i] * X[i] - ( C[i]:filter coeffs tables 12-23 in A2DP ) - */ - t[0] = SCALE4_STAGE1(MULA(_sbc_proto_4[0], in[8] - in[32], - MUL( _sbc_proto_4[1], in[16] - in[24]))); - - t[1] = SCALE4_STAGE1(MULA(_sbc_proto_4[2], in[1], - MULA(_sbc_proto_4[3], in[9], - MULA(_sbc_proto_4[4], in[17], - MULA(_sbc_proto_4[5], in[25], - MUL( _sbc_proto_4[6], in[33])))))); - - t[2] = SCALE4_STAGE1(MULA(_sbc_proto_4[7], in[2], - MULA(_sbc_proto_4[8], in[10], - MULA(_sbc_proto_4[9], in[18], - MULA(_sbc_proto_4[10], in[26], - MUL( _sbc_proto_4[11], in[34])))))); - - t[3] = SCALE4_STAGE1(MULA(_sbc_proto_4[12], in[3], - MULA(_sbc_proto_4[13], in[11], - MULA(_sbc_proto_4[14], in[19], - MULA(_sbc_proto_4[15], in[27], - MUL( _sbc_proto_4[16], in[35])))))); - - t[4] = SCALE4_STAGE1(MULA(_sbc_proto_4[17], in[4] + in[36], - MULA(_sbc_proto_4[18], in[12] + in[28], - MUL( _sbc_proto_4[19], in[20])))); - - t[5] = SCALE4_STAGE1(MULA(_sbc_proto_4[16], in[5], - MULA(_sbc_proto_4[15], in[13], - MULA(_sbc_proto_4[14], in[21], - MULA(_sbc_proto_4[13], in[29], - MUL( _sbc_proto_4[12], in[37])))))); - - /* don't compute t[6]... this term always multiplies - * with cos(pi/2) = 0 */ - - t[7] = SCALE4_STAGE1(MULA(_sbc_proto_4[6], in[7], - MULA(_sbc_proto_4[5], in[15], - MULA(_sbc_proto_4[4], in[23], - MULA(_sbc_proto_4[3], in[31], - MUL( _sbc_proto_4[2], in[39])))))); - - /* -Partial Calculation- - for i = 0 to 7 do - for k = 0 to 4 do - Y[i] = sum(Z[i+k*8]) - */ - s[0] = MUL( _anamatrix4[0], t[0] + t[4]); - s[1] = MUL( _anamatrix4[2], t[2]); - s[2] = MULA(_anamatrix4[1], t[1] + t[3], MUL(_anamatrix4[3], t[5])); - s[3] = MULA(_anamatrix4[3], t[1] + t[3], MUL(_anamatrix4[1], -t[5] + t[7])); - s[4] = MUL( _anamatrix4[3], t[7]); - - out[0] = SCALE4_STAGE2( s[0] + s[1] + s[2] - s[4]); /* Q0 */ - out[1] = SCALE4_STAGE2(-s[0] + s[1] + s[3]); - out[2] = SCALE4_STAGE2(-s[0] + s[1] - s[3]); - out[3] = SCALE4_STAGE2( s[0] + s[1] - s[2] + s[4]); + sbc->callback = callback; + sbc->param = param; } -static void __sbc_analyze_eight(const int32_t *in, int32_t *out) -{ - sbc_fixed_t t[8], s[10]; - - t[2] = SCALE8_STAGE1(MULA(_sbc_proto_8[6], in[2], - MULA(_sbc_proto_8[7], in[18], - MULA(_sbc_proto_8[8], in[34], - MULA(_sbc_proto_8[9], in[50], - MULA(_sbc_proto_8[10], in[66], - MULA(_sbc_proto_8[26], in[6], - MULA(_sbc_proto_8[27], in[22], - MULA(_sbc_proto_8[28], in[38], - MULA(_sbc_proto_8[29], in[54], - MUL( _sbc_proto_8[30], in[70]))))))))))); - - t[4] = SCALE8_STAGE1(MULA(_sbc_proto_8[2], in[4], - MULA(_sbc_proto_8[3], in[20], - MULA(_sbc_proto_8[4], in[36], - MULA(_sbc_proto_8[5], in[52], - MUL(_sbc_proto_8[39], in[68])))))); - - t[3] = SCALE8_STAGE1(MULA(_sbc_proto_8[16], in[3], - MULA(_sbc_proto_8[17], in[19], - MULA(_sbc_proto_8[18], in[35], - MULA(_sbc_proto_8[19], in[51], - MULA(_sbc_proto_8[20], in[67], - MULA(_sbc_proto_8[21], in[5], - MULA(_sbc_proto_8[22], in[21], - MULA(_sbc_proto_8[23], in[37], - MULA(_sbc_proto_8[24], in[53], - MUL( _sbc_proto_8[25], in[69]))))))))))); - - t[1] = SCALE8_STAGE1(MULA( _sbc_proto_8[11], in[1], - MULA( _sbc_proto_8[12], in[17], - MULA( _sbc_proto_8[13], in[33], - MULA( _sbc_proto_8[14], in[49], - MULA( _sbc_proto_8[15], in[65], - MULA( _sbc_proto_8[31], in[7], - MULA( _sbc_proto_8[32], in[23], - MULA( _sbc_proto_8[33], in[39], - MULA( _sbc_proto_8[34], in[55], - MUL( _sbc_proto_8[35], in[71]))))))))))); - - t[0] = SCALE8_STAGE1(MULA( _sbc_proto_8[0], (in[16] - in[64]), - MULA( _sbc_proto_8[1], (in[32] - in[48]), - MULA( _sbc_proto_8[36],(in[8] + in[72]), - MULA( _sbc_proto_8[37],(in[24] + in[56]), - MUL( _sbc_proto_8[38], in[40])))))); - - t[5] = SCALE8_STAGE1(MULA( _sbc_proto_8[35], in[9], - MULA( _sbc_proto_8[34], in[25], - MULA( _sbc_proto_8[33], in[41], - MULA( _sbc_proto_8[32], in[57], - MULA( _sbc_proto_8[31], in[73], - MULA(-_sbc_proto_8[15], in[15], - MULA(-_sbc_proto_8[14], in[31], - MULA(-_sbc_proto_8[13], in[47], - MULA(-_sbc_proto_8[12], in[63], - MUL( -_sbc_proto_8[11], in[79]))))))))))); - - t[6] = SCALE8_STAGE1(MULA( _sbc_proto_8[30], in[10], - MULA( _sbc_proto_8[29], in[26], - MULA( _sbc_proto_8[28], in[42], - MULA( _sbc_proto_8[27], in[58], - MULA( _sbc_proto_8[26], in[74], - MULA(-_sbc_proto_8[10], in[14], - MULA(-_sbc_proto_8[9], in[30], - MULA(-_sbc_proto_8[8], in[46], - MULA(-_sbc_proto_8[7], in[62], - MUL( -_sbc_proto_8[6], in[78]))))))))))); - - t[7] = SCALE8_STAGE1(MULA( _sbc_proto_8[25], in[11], - MULA( _sbc_proto_8[24], in[27], - MULA( _sbc_proto_8[23], in[43], - MULA( _sbc_proto_8[22], in[59], - MULA( _sbc_proto_8[21], in[75], - MULA(-_sbc_proto_8[20], in[13], - MULA(-_sbc_proto_8[19], in[29], - MULA(-_sbc_proto_8[18], in[45], - MULA(-_sbc_proto_8[17], in[61], - MUL( -_sbc_proto_8[16], in[77]))))))))))); - - s[0] = MUL(_anamatrix8[7],t[4]); - s[1] = MUL(_anamatrix8[6],t[0]); - s[2] = MUL(_anamatrix8[0],t[2]); // 0 2 - s[3] = MUL(_anamatrix8[1],t[6]); // 1 6 - s[8] = MUL(_anamatrix8[1],t[2]); // 1 2 - s[9] = MUL(_anamatrix8[0],t[6]); // 0 6 - - s[4] = MULA( _anamatrix8[2], t[3], MULA( _anamatrix8[3], t[1], - MULA( _anamatrix8[4], t[5], - MUL( _anamatrix8[5], t[7])))); - s[5] = MULA(-_anamatrix8[2], t[5], MULA( _anamatrix8[3], t[3], - MULA(-_anamatrix8[4], t[7], - MUL( -_anamatrix8[5], t[1])))); - s[6] = MULA( _anamatrix8[4], t[3], MULA( -_anamatrix8[2], t[1], - MULA( _anamatrix8[5], t[5], - MUL( _anamatrix8[3], t[7])))); - s[7] = MULA(-_anamatrix8[2], t[7], MULA( _anamatrix8[3], t[5], - MULA(-_anamatrix8[4], t[1], - MUL( _anamatrix8[5], t[3])))); - - out[0] = SCALE8_STAGE2( (s[0] + s[1]) + (s[2] + s[3]) + s[4]); - out[1] = SCALE8_STAGE2( (s[0] - s[1]) + (s[8] - s[9]) + s[5]); - out[2] = SCALE8_STAGE2( (s[0] - s[1]) - s[8] + (s[9] + s[6])); - out[3] = SCALE8_STAGE2( (s[0] + s[1]) - (s[2] + s[3]) + s[7]); - out[4] = SCALE8_STAGE2( (s[0] + s[1]) - (s[2] + s[3]) - s[7]); - out[5] = SCALE8_STAGE2( (s[0] - s[1]) - s[8] + (s[9] - s[6])); - out[6] = SCALE8_STAGE2( (s[0] - s[1]) + (s[8] - s[9]) - s[5]); - out[7] = SCALE8_STAGE2( (s[0] + s[1]) + (s[2] + s[3]) - s[4] ); -} +#endif diff --git a/examples/voice_remote_ctrl/src/audio_sbc.h b/examples/voice_remote_ctrl/src/audio_sbc.h index 69a03ab23..4a398b044 100644 --- a/examples/voice_remote_ctrl/src/audio_sbc.h +++ b/examples/voice_remote_ctrl/src/audio_sbc.h @@ -1,88 +1,36 @@ -#ifndef _SBC_H_ -#define _SBC_H_ +#ifndef _AUDIO_SBC_H +#define _AUDIO_SBC_H #include +#include "../libsbc/include/sbc.h" + +typedef int16_t pcm_sample_t; + #ifdef __cplusplus extern "C" { #endif -typedef int16_t pcm_sample_t; - typedef void (*sbc_encode_output_cb_f)(uint8_t output, void *param); -typedef void (*sbc_decode_output_cb_f)(pcm_sample_t output, void* param); - -/* sampling frequency */ -#define SBC_FREQ_16000 0x00 -#define SBC_FREQ_32000 0x01 -#define SBC_FREQ_44100 0x02 -#define SBC_FREQ_48000 0x03 - -/* blocks */ -#define SBC_BLK_4 0x00 -#define SBC_BLK_8 0x01 -#define SBC_BLK_12 0x02 -#define SBC_BLK_16 0x03 - -/* channel mode */ -#define SBC_MODE_MONO 0x00 -#define SBC_MODE_DUAL_CHANNEL 0x01 -#define SBC_MODE_STEREO 0x02 -#define SBC_MODE_JOINT_STEREO 0x03 - -/* allocation method */ -#define SBC_AM_LOUDNESS 0x00 -#define SBC_AM_SNR 0x01 -/* subbands */ -#define SBC_SB_4 0x00 -#define SBC_SB_8 0x01 +typedef struct +{ + struct sbc_frame frame; + sbc_t sbc; + sbc_encode_output_cb_f callback; + void *param; + uint8_t output[SBC_MAX_SAMPLES]; +} sbc_enc_ctx_t; -/* data endianess */ -#define SBC_LE 0x00 -#define SBC_BE 0x01 -typedef struct{ - uint8_t flags; - uint8_t frequency; - uint8_t blocks; - uint8_t channels; - uint8_t subbands; - uint8_t mode; - uint8_t allocation; - uint8_t bitpool; - uint8_t endian; +void sbc_enc_init(sbc_enc_ctx_t *sbc, sbc_encode_output_cb_f callback, void *param); - void *priv; - void *priv_alloc_base; - sbc_encode_output_cb_f callback; -}sbc_t; - -int sbc_enc_init(sbc_t *sbc, sbc_encode_output_cb_f callback, uint8_t flags); -int sbc_reinit(sbc_t *sbc, uint8_t flags); - -/* Encodes ONE input block into ONE output block */ -void sbc_encode(sbc_t *sbc, - int16_t *input, - int input_len, - void *output, - int output_len); - -/* Returns the compressed block size in bytes */ -int sbc_get_frame_length(sbc_t *sbc); - -/* Returns the uncompressed block size in bytes */ -int sbc_get_codesize(sbc_t *sbc); - -void sbc_finish(sbc_t *sbc); +int sbc_get_n_of_samples(sbc_enc_ctx_t *sbc); +void sbc_enc(sbc_enc_ctx_t *sbc, const pcm_sample_t *input, int input_size); #ifdef __cplusplus } #endif -#endif // _SBC_H_ - - - - +#endif diff --git a/examples/voice_remote_ctrl/src/audio_sbc_math.h b/examples/voice_remote_ctrl/src/audio_sbc_math.h deleted file mode 100644 index 14b85af59..000000000 --- a/examples/voice_remote_ctrl/src/audio_sbc_math.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef _AUDIO_SBC_MATH_H_ -#define _AUDIO_SBC_MATH_H_ - -#include - -#define SBC_SYNCWORD 0x9C -#define MSBC_SYNCWORD 0xAD -#define MSBC_BLOCKS 15 - -#define A2DP_SAMPLING_FREQ_16000 (1 << 3) -#define A2DP_SAMPLING_FREQ_32000 (1 << 2) -#define A2DP_SAMPLING_FREQ_44100 (1 << 1) -#define A2DP_SAMPLING_FREQ_48000 (1 << 0) - -#define A2DP_CHANNEL_MODE_MONO (1 << 3) -#define A2DP_CHANNEL_MODE_DUAL_CHANNEL (1 << 2) -#define A2DP_CHANNEL_MODE_STEREO (1 << 1) -#define A2DP_CHANNEL_MODE_JOINT_STEREO (1 << 0) - -#define A2DP_BLOCK_LENGTH_4 (1 << 3) -#define A2DP_BLOCK_LENGTH_8 (1 << 2) -#define A2DP_BLOCK_LENGTH_12 (1 << 1) -#define A2DP_BLOCK_LENGTH_16 (1 << 0) - -#define A2DP_SUBBANDS_4 (1 << 1) -#define A2DP_SUBBANDS_8 (1 << 0) - -#define A2DP_ALLOCATION_SNR (1 << 1) -#define A2DP_ALLOCATION_LOUDNESS (1 << 0) - -#define SCALE_OUT_BITS 15 - -#define EIO 5 -#define ENOSPC 28 - -#define fabs(x) ((x) < 0 ? -(x) : (x)) -#define ASR(val, bits) ((-2 >> 1 == -1) ? \ - ((int32_t)(val)) >> (bits) : ((int32_t) (val)) / (1 << (bits))) - -#define SCALE_PROTO4_TBL 15 -#define SCALE_ANA4_TBL 17 -#define SCALE_PROTO8_TBL 16 -#define SCALE_ANA8_TBL 17 -#define SCALE_SPROTO4_TBL 12 -#define SCALE_SPROTO8_TBL 14 -#define SCALE_NPROTO4_TBL 11 -#define SCALE_NPROTO8_TBL 11 -#define SCALE4_STAGE1_BITS 15 -#define SCALE4_STAGE2_BITS 16 -#define SCALE4_STAGED1_BITS 15 -#define SCALE4_STAGED2_BITS 16 -#define SCALE8_STAGE1_BITS 15 -#define SCALE8_STAGE2_BITS 15 -#define SCALE8_STAGED1_BITS 15 -#define SCALE8_STAGED2_BITS 16 - -typedef int32_t sbc_fixed_t; - -#define SCALE4_STAGE1(src) ASR(src, SCALE4_STAGE1_BITS) -#define SCALE4_STAGE2(src) ASR(src, SCALE4_STAGE2_BITS) -#define SCALE4_STAGED1(src) ASR(src, SCALE4_STAGED1_BITS) -#define SCALE4_STAGED2(src) ASR(src, SCALE4_STAGED2_BITS) -#define SCALE8_STAGE1(src) ASR(src, SCALE8_STAGE1_BITS) -#define SCALE8_STAGE2(src) ASR(src, SCALE8_STAGE2_BITS) -#define SCALE8_STAGED1(src) ASR(src, SCALE8_STAGED1_BITS) -#define SCALE8_STAGED2(src) ASR(src, SCALE8_STAGED2_BITS) - -#define SBC_FIXED_0(val) { val = 0; } -#define MUL(a, b) ((a) * (b)) -#define MULA(a, b, res) ((a) * (b) + (res)) - -#endif // _AUDIO_SBC_MATH_H_ diff --git a/examples/voice_remote_ctrl/src/audio_sbc_tables.h b/examples/voice_remote_ctrl/src/audio_sbc_tables.h deleted file mode 100644 index 87a46e4e7..000000000 --- a/examples/voice_remote_ctrl/src/audio_sbc_tables.h +++ /dev/null @@ -1,119 +0,0 @@ -#ifndef _AUDIO_SBC_TABLES_H_ -#define _AUDIO_SBC_TABLES_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include "audio_sbc_math.h" - -#define SBC_ALIGN_BITS 4 -#define SBC_ALIGN_MASK ((1 << (SBC_ALIGN_BITS))) - -/* A2DP specification: Appendix B, page 69 */ -static const int sbc_offset4[4][4] = { - { -1, 0, 0, 0 }, - { -2, 0, 0, 1 }, - { -2, 0, 0, 1 }, - { -2, 0, 0, 1 } -}; - -/* A2DP specification: Appendix B, page 69 */ -static const int sbc_offset8[4][8] = { - { -2, 0, 0, 0, 0, 0, 0, 1 }, - { -3, 0, 0, 0, 0, 0, 1, 2 }, - { -4, 0, 0, 0, 0, 0, 1, 2 }, - { -4, 0, 0, 0, 0, 0, 1, 2 } -}; - -#define SP4(val) ASR(val, SCALE_PROTO4_TBL) -#define SA4(val) ASR(val, SCALE_ANA4_TBL) -#define SP8(val) ASR(val, SCALE_PROTO8_TBL) -#define SA8(val) ASR(val, SCALE_ANA8_TBL) - -static const int32_t _sbc_proto_4[20] = { - SP4(0x02cb3e8c), SP4(0x22b63dc0), SP4(0x002329cc), SP4(0x053b7548), - SP4(0x31eab940), SP4(0xec1f5e60), SP4(0xff3773a8), SP4(0x0061c5a7), - SP4(0x07646680), SP4(0x3f239480), SP4(0xf89f23a8), SP4(0x007a4737), - SP4(0x00b32807), SP4(0x083ddc80), SP4(0x4825e480), SP4(0x0191e578), - SP4(0x00ff11ca), SP4(0x00fb7991), SP4(0x069fdc58), SP4(0x4b584000) -}; - -static const int32_t _anamatrix4[4] = { - SA4(0x2d413cc0), SA4(0x3b20d780), SA4(0x40000000), SA4(0x187de2a0) -}; - -static const int32_t _sbc_proto_8[40] = { - SP8(0x02e5cd20), SP8(0x22d0c200), SP8(0x006bfe27), SP8(0x07808930), - SP8(0x3f1c8800), SP8(0xf8810d70), SP8(0x002cfdc6), SP8(0x055acf28), - SP8(0x31f566c0), SP8(0xebfe57e0), SP8(0xff27c437), SP8(0x001485cc), - SP8(0x041c6e58), SP8(0x2a7cfa80), SP8(0xe4c4a240), SP8(0xfe359e4c), - SP8(0x0048b1f8), SP8(0x0686ce30), SP8(0x38eec5c0), SP8(0xf2a1b9f0), - SP8(0xffe8904a), SP8(0x0095698a), SP8(0x0824a480), SP8(0x443b3c00), - SP8(0xfd7badc8), SP8(0x00d3e2d9), SP8(0x00c183d2), SP8(0x084e1950), - SP8(0x4810d800), SP8(0x017f43fe), SP8(0x01056dd8), SP8(0x00e9cb9f), - SP8(0x07d7d090), SP8(0x4a708980), SP8(0x0488fae8), SP8(0x0113bd20), - SP8(0x0107b1a8), SP8(0x069fb3c0), SP8(0x4b3db200), SP8(0x00763f48) -}; - -#define SS4(val) ASR(val, SCALE_SPROTO4_TBL) -#define SS8(val) ASR(val, SCALE_SPROTO8_TBL) -#define SN4(val) ASR(val, SCALE_NPROTO4_TBL) -#define SN8(val) ASR(val, SCALE_NPROTO8_TBL) - -static const int32_t sbc_proto_4_40m0[] = { - SS4(0x00000000), SS4(0xffa6982f), SS4(0xfba93848), SS4(0x0456c7b8), - SS4(0x005967d1), SS4(0xfffb9ac7), SS4(0xff589157), SS4(0xf9c2a8d8), - SS4(0x027c1434), SS4(0x0019118b), SS4(0xfff3c74c), SS4(0xff137330), - SS4(0xf81b8d70), SS4(0x00ec1b8b), SS4(0xfff0b71a), SS4(0xffe99b00), - SS4(0xfef84470), SS4(0xf6fb4370), SS4(0xffcdc351), SS4(0xffe01dc7) -}; - -static const int32_t sbc_proto_4_40m1[] = { - SS4(0xffe090ce), SS4(0xff2c0475), SS4(0xf694f800), SS4(0xff2c0475), - SS4(0xffe090ce), SS4(0xffe01dc7), SS4(0xffcdc351), SS4(0xf6fb4370), - SS4(0xfef84470), SS4(0xffe99b00), SS4(0xfff0b71a), SS4(0x00ec1b8b), - SS4(0xf81b8d70), SS4(0xff137330), SS4(0xfff3c74c), SS4(0x0019118b), - SS4(0x027c1434), SS4(0xf9c2a8d8), SS4(0xff589157), SS4(0xfffb9ac7) -}; - -static const int32_t sbc_proto_8_80m0[] = { - SS8(0x00000000), SS8(0xfe8d1970), SS8(0xee979f00), SS8(0x11686100), - SS8(0x0172e690), SS8(0xfff5bd1a), SS8(0xfdf1c8d4), SS8(0xeac182c0), - SS8(0x0d9daee0), SS8(0x00e530da), SS8(0xffe9811d), SS8(0xfd52986c), - SS8(0xe7054ca0), SS8(0x0a00d410), SS8(0x006c1de4), SS8(0xffdba705), - SS8(0xfcbc98e8), SS8(0xe3889d20), SS8(0x06af2308), SS8(0x000bb7db), - SS8(0xffca00ed), SS8(0xfc3fbb68), SS8(0xe071bc00), SS8(0x03bf7948), - SS8(0xffc4e05c), SS8(0xffb54b3b), SS8(0xfbedadc0), SS8(0xdde26200), - SS8(0x0142291c), SS8(0xff960e94), SS8(0xff9f3e17), SS8(0xfbd8f358), - SS8(0xdbf79400), SS8(0xff405e01), SS8(0xff7d4914), SS8(0xff8b1a31), - SS8(0xfc1417b8), SS8(0xdac7bb40), SS8(0xfdbb828c), SS8(0xff762170) -};// 40 - - -static const int32_t sbc_proto_8_80m1[] = { - SS8(0xff7c272c), SS8(0xfcb02620), SS8(0xda612700), SS8(0xfcb02620), - SS8(0xff7c272c), SS8(0xff762170), SS8(0xfdbb828c), SS8(0xdac7bb40), - SS8(0xfc1417b8), SS8(0xff8b1a31), SS8(0xff7d4914), SS8(0xff405e01), - SS8(0xdbf79400), SS8(0xfbd8f358), SS8(0xff9f3e17), SS8(0xff960e94), - SS8(0x0142291c), SS8(0xdde26200), SS8(0xfbedadc0), SS8(0xffb54b3b), - SS8(0xffc4e05c), SS8(0x03bf7948), SS8(0xe071bc00), SS8(0xfc3fbb68), - SS8(0xffca00ed), SS8(0x000bb7db), SS8(0x06af2308), SS8(0xe3889d20), - SS8(0xfcbc98e8), SS8(0xffdba705), SS8(0x006c1de4), SS8(0x0a00d410), - SS8(0xe7054ca0), SS8(0xfd52986c), SS8(0xffe9811d), SS8(0x00e530da), - SS8(0x0d9daee0), SS8(0xeac182c0), SS8(0xfdf1c8d4), SS8(0xfff5bd1a) -}; //40 - - -static const int32_t _anamatrix8[8] = { - SA8(0x3b20d780), SA8(0x187de2a0), SA8(0x3ec52f80), SA8(0x3536cc40), - SA8(0x238e7680), SA8(0x0c7c5c20), SA8(0x2d413cc0), SA8(0x40000000) -}; - -#ifdef __cplusplus -} -#endif - -#endif /* _SBC_H_ */ diff --git a/examples/voice_remote_ctrl/src/audio_sbc_types.h b/examples/voice_remote_ctrl/src/audio_sbc_types.h deleted file mode 100644 index 1aac66cc8..000000000 --- a/examples/voice_remote_ctrl/src/audio_sbc_types.h +++ /dev/null @@ -1,76 +0,0 @@ -#ifndef _AUDIO_SBC_TYPES_H_ -#define _AUDIO_SBC_TYPES_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include "audio_sbc_math.h" - -typedef enum -{ - MONO = SBC_MODE_MONO, - DUAL_CHANNEL = SBC_MODE_DUAL_CHANNEL, - STEREO = SBC_MODE_STEREO, - JOINT_STEREO = SBC_MODE_JOINT_STEREO -}sbc_mdoe; - -typedef enum -{ - LOUDNESS = SBC_AM_LOUDNESS, - SNR = SBC_AM_SNR -}sbc_allocation; - -/* This structure contains an unpacked SBC frame. - Yes, there is probably quite some unused space herein */ -typedef struct -{ - uint8_t frequency; - uint8_t block_mode; - uint8_t blocks; - sbc_mdoe mode; - uint8_t channels; - sbc_allocation allocation; - uint8_t subband_mode; - uint8_t subbands; - uint8_t bitpool; - uint16_t codesize; - uint16_t length; - uint16_t frame_count; - - /* bit number x set means joint stereo has been used in subband x */ - uint8_t joint; - - /* only the lower 4 bits of every element are to be used */ - uint32_t scale_factor[2][8]; - - /* raw integer subband samples in the frame */ - int32_t sb_sample_f[16][2][8]; - - /* modified subband samples */ - int32_t sb_sample[16][2][8]; - - /* original pcm audio samples */ - int16_t pcm_sample[2][16*8]; -}sbc_frame; - -typedef struct -{ - int subbands; - int position[2]; - int32_t X[2][160]; -}sbc_encoder_state; - -typedef struct -{ - int subbands; - int32_t V[2][170]; - int offset[2][16]; -}sbc_decoder_state; - -#ifdef __cplusplus -} -#endif - -#endif // _AUDIO_SBC_TYPES_H_ diff --git a/examples/voice_remote_ctrl/src/audio_service.c b/examples/voice_remote_ctrl/src/audio_service.c index 1202361a2..1ded4c430 100644 --- a/examples/voice_remote_ctrl/src/audio_service.c +++ b/examples/voice_remote_ctrl/src/audio_service.c @@ -11,6 +11,30 @@ #include "platform_api.h" #include "log.h" +#if (AUDIO_CODEC_ALG == AUDIO_CODEC_ALG_ADPCM) +#include "audio_adpcm.h" +static adpcm_enc_t adpcm; +#elif (AUDIO_CODEC_ALG == AUDIO_CODEC_ALG_SBC) +#include "audio_sbc.h" +static sbc_enc_ctx_t sbc = +{ + .frame = { + #if (EFFECTIVE_SAMPLING_RATE == 16000) + .freq = SBC_FREQ_16K, + #elif + #error unsupported EFFECTIVE_SAMPLING_RATE + #endif + .mode = SBC_MODE_MONO, + .nsubbands = 4, + .nblocks = 8, + .bam = SBC_BAM_LOUDNESS, + .bitpool = 35 + } +}; +#else +#error unknown AUDIO_CODEC_ALG +#endif + extern void audio_input_setup(void); extern void audio_input_start(void); extern void audio_input_stop(void); @@ -25,10 +49,14 @@ uint16_t seq_cnt; int8_t mic_dig_gain = 0; #define SAMPLE_BUF_LEN 128 -#define SAMPLE_BUF_CNT 2 +#define SAMPLE_BUF_CNT 5 pcm_sample_t sample_buf[SAMPLE_BUF_CNT][SAMPLE_BUF_LEN]; +#if (OVER_SAMPLING_MASK != 0) +pcm_sample_t down_sampling_buf[SAMPLE_BUF_LEN]; +#endif + int sample_buf_index = 0; int sample_index = 0; @@ -131,29 +159,18 @@ void audio_stop(void) static void audio_task(void *pdata) { - int input_size, output_size; - uint8_t *outp; -#if (AUDIO_CODEC_ALG == AUDIO_CODEC_ALG_SBC) - input_size = sbc_get_codesize(&sbc); //codesize - output_size = sbc_get_frame_length(&sbc); //framelen -#elif (AUDIO_CODEC_ALG == AUDIO_CODEC_ALG_ADPCM) + int input_size; input_size = aud_enc_t.sample_buf.size; - output_size = aud_enc_t.sample_buf.size; -#endif - outp = malloc(output_size * sizeof(uint8_t)); #if (OVER_SAMPLING_MASK != 0) int oversample_cnt = 0; - pcm_sample_t *buffer = NULL; - int buffer_index = 0; - - buffer = malloc(input_size * sizeof(pcm_sample_t)); + int down_sample_index = 0; + pcm_sample_t *down_sampling = down_sampling_buf; #endif pcm_sample_t *buf; for (;;) { - int16_t index; - int i; + int16_t index; if (xQueueReceive(xSampleQueue, &index, portMAX_DELAY ) != pdPASS) continue; @@ -161,6 +178,7 @@ static void audio_task(void *pdata) buf = sample_buf[index]; #if (OVER_SAMPLING_MASK != 0) + int i; for (i = 0; i < aud_enc_t.sample_buf.size; i++) { pcm_sample_t sample = buf[i]; @@ -173,17 +191,17 @@ static void audio_task(void *pdata) else { sample = fir_push_run(&fir, sample); - buffer[buffer_index++] = sample; + down_sampling[down_sample_index++] = sample; } - if (buffer_index >= input_size) + if (down_sample_index >= input_size) { - aud_enc_t.encoder(enc, buffer, input_size, outp, output_size); - buffer_index = 0; + aud_enc_t.encoder(enc, down_sampling, input_size); + down_sample_index = 0; } } #else - aud_enc_t.encoder(enc, buf, input_size, outp, output_size); + aud_enc_t.encoder(enc, buf, input_size); #endif } } @@ -200,7 +218,6 @@ uint8_t *audio_get_block_buff(uint16_t index) void audio_rx_sample(pcm_sample_t sample) { - BaseType_t xHigherPriorityTaskWoke = pdFALSE; // digital gain @@ -255,7 +272,7 @@ static void enc_state_init(audio_encoder_t *enc_t) adpcm_enc_init(enc, enc_output_cb, 0); enc_t->type = ADPCM_ENCODER; enc_t->sample_buf.num = 2; - enc_t->sample_buf.size = 20; + enc_t->sample_buf.size = SAMPLE_BUF_LEN; enc_t->encoder = (fun_encoder)adpcm_encode; LOG_PRINTF_TAB(LOG_LEVEL_INFO,"Parameter configured successfully."); @@ -263,11 +280,21 @@ static void enc_state_init(audio_encoder_t *enc_t) enc_t->type = SBC_ENCODER; LOG_PRINTF_TAB(LOG_LEVEL_INFO,"Encoder-->[SBC]"); enc = &sbc; - sbc_enc_init(enc, enc_output_cb, 0L); + sbc_enc_init(enc, enc_output_cb, 0); LOG_PRINTF_TAB(LOG_LEVEL_INFO,"Configure encode's parameter..."); enc_t->sample_buf.num = 2; - enc_t->sample_buf.size = sbc_get_codesize(&sbc); + enc_t->sample_buf.size = sbc_get_n_of_samples(&sbc); LOG_PRINTF_TAB(LOG_LEVEL_INFO,"Parameter configured successfully."); - enc_t->encoder = (fun_encoder)sbc_encode; + enc_t->encoder = (fun_encoder)sbc_enc; #endif + if (SAMPLE_BUF_LEN > enc_t->sample_buf.size) + { + LOG_PRINTF_TAB(LOG_LEVEL_INFO, "SAMPLE_BUF_LEN (%d) is larger than required (%d)", + SAMPLE_BUF_LEN, enc_t->sample_buf.size); + } + else if (SAMPLE_BUF_LEN < enc_t->sample_buf.size) + { + LOG_PRINTF_TAB(LOG_LEVEL_ERROR, "SAMPLE_BUF_LEN (%d) is smaller than required (%d)", + SAMPLE_BUF_LEN, enc_t->sample_buf.size); + } } diff --git a/examples/voice_remote_ctrl/src/profile.c b/examples/voice_remote_ctrl/src/profile.c index 916b9a33e..c3b7489f6 100644 --- a/examples/voice_remote_ctrl/src/profile.c +++ b/examples/voice_remote_ctrl/src/profile.c @@ -14,7 +14,7 @@ #include "audio_service.h" -#include "profile.h" +#include "profile.h" // GATT characteristic handles #include "../data/gatt.const" @@ -46,7 +46,7 @@ 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, +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) @@ -73,7 +73,7 @@ void update_conn_interval(hci_con_handle_t conn_handle, uint16_t interval) interval, interval, 0, interval > 10 ? interval : 10); } -static int att_write_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t transaction_mode, +static int att_write_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t transaction_mode, uint16_t offset, const uint8_t *buffer, uint16_t buffer_size) { switch (att_handle) @@ -93,7 +93,7 @@ static int att_write_callback(hci_con_handle_t connection_handle, uint16_t att_h audio_stop(); break; } - + return 0; case HANDLE_VOICE_OUTPUT + 1: @@ -130,11 +130,13 @@ static void send_audio_data() 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) + if (att_server_notify(handle_send, HANDLE_VOICE_OUTPUT, audio_get_block_buff(next_block), VOICE_BUF_BLOCK_SIZE) != 0) + { att_server_request_can_send_now_event(handle_send); + return; + } + next_block++; + if (next_block >= VOICE_BUF_BLOCK_NUM) next_block = 0; } } @@ -146,10 +148,7 @@ 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); + send_audio_data(); break; default: ; @@ -162,7 +161,7 @@ static void setup_adv() { gap_set_ext_adv_enable(0, 0, NULL); gap_set_adv_set_random_addr(0, rand_addr); - gap_set_ext_adv_para(0, + 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 @@ -192,7 +191,7 @@ 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; - + setup_adv(); break; @@ -230,11 +229,14 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin } } +void test_encoder(void); + 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/voice_remote_ctrl.uvopt b/examples/voice_remote_ctrl/voice_remote_ctrl.uvopt index 9f81bb2b9..609906b6b 100644 --- a/examples/voice_remote_ctrl/voice_remote_ctrl.uvopt +++ b/examples/voice_remote_ctrl/voice_remote_ctrl.uvopt @@ -232,10 +232,10 @@ 1 0 0 - 0 + 14 0 - 156 - 161 + 275 + 292 0 .\src\audio_service.c audio_service.c @@ -312,10 +312,10 @@ 1 0 0 - 10 + 0 0 - 823 - 824 + 1 + 4 0 .\src\audio_sbc.c audio_sbc.c @@ -560,10 +560,10 @@ 1 0 0 - 24 + 22 0 - 43 - 40 + 329 + 343 0 ..\..\src\FWlib\peripheral_dma.c peripheral_dma.c diff --git a/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj b/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj index 22a4c3cb7..9bfbe1d7f 100644 --- a/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj +++ b/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj @@ -1,7 +1,10 @@ - + + 1.1 +
### uVision Project, (C) Keil Software
+ Target 1 @@ -12,27 +15,27 @@ ing91600 INGCHIPS CLOCK(128000000) CPUTYPE("Cortex-M4") FPU2 ELITTLE IROM(0x2000000-0x2200000) IRAM(0x20000000-0x20008000) - - - + + + 0 - - - - - - - - - - - + + + + + + + + + + + 0 - - - - - + + + + + 0 0 @@ -54,8 +57,8 @@ 0 0 - - + + 0 0 0 @@ -64,8 +67,8 @@ 0 0 - - + + 0 0 @@ -73,12 +76,12 @@ 1 0 fromelf.exe --bin -o voice_remote_ctrl.bin ./output/voice_remote_ctrl.axf - + 0 0 0 - + 0 @@ -92,16 +95,16 @@ 0 0 3 - - + + SARMCM3.DLL - + DCM.DLL -pCM3 SARMCM3.DLL - + TCM.DLL -pCM3 @@ -138,17 +141,17 @@ 0 1 - - - - + + + + ..\map.ini - - - - + + + + .\init.ini BIN\UL2CM3.DLL @@ -165,7 +168,7 @@ 1 BIN\UL2CM3.DLL "" () - + @@ -197,7 +200,7 @@ 0 0 "Cortex-M4" - + 0 0 0 @@ -294,8 +297,8 @@ 1 - 33718272 - 360448 + 0x2028000 + 0x58000 1 @@ -319,8 +322,8 @@ 0 - 536892488 - 11192 + 0x20005448 + 0x2bb8 0 @@ -328,7 +331,7 @@ 0x0 - + 1 @@ -346,9 +349,9 @@ 0 --gnu - USE_STDPERIPH_DRIVER,AUDIO_INPUT=0,AUDIO_CODEC_ALG=1 - - ../../bundles/typical/inc;../../bundles/typical/inc/os;../../src/BSP;../../src/FWlib;../../src/StartUP/ing916;../../src/Tools;../../src + USE_STDPERIPH_DRIVER,AUDIO_INPUT=0,AUDIO_CODEC_ALG=0 + + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../src/BSP;../../src/FWlib;../../src/StartUP/ing916;../../src/Tools;../../src;.\libsbc\include @@ -361,10 +364,10 @@ 0 0 - - - - + + + + @@ -376,12 +379,12 @@ 0 0x00000000 0x00000000 - - - - - - + + + + + + @@ -534,4 +537,5 @@ +
diff --git a/examples/voice_remote_ctrl/voice_remote_ctrl.uvprojx b/examples/voice_remote_ctrl/voice_remote_ctrl.uvprojx index 6f3cc6e85..78c19a7e3 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 @@ -16,28 +19,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com IRAM(0x20000000,0x00008000) IROM(0x2000000,0x00200000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ing91600$SVD\ing91600.svd 0 0 - - - - - + + + + + 0 0 @@ -59,8 +62,8 @@ 0 0 - - + + 0 0 0 @@ -69,8 +72,8 @@ 0 0 - - + + 0 0 0 @@ -80,14 +83,14 @@ 1 0 fromelf.exe --bin -o voice_remote_ctrl.bin ./output/voice_remote_ctrl.axf - + 0 0 0 0 0 - + 0 @@ -101,8 +104,8 @@ 0 0 3 - - + + 1 @@ -136,10 +139,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -172,7 +175,7 @@ 0 0 "Cortex-M4" - + 0 0 0 @@ -273,8 +276,8 @@ 1 - 33718272 - 360448 + 0x2028000 + 0x58000 1 @@ -298,8 +301,8 @@ 0 - 536892488 - 11192 + 0x20005448 + 0x2bb8 0 @@ -307,7 +310,7 @@ 0x0 - + 1 @@ -334,10 +337,10 @@ 0 0 - + USE_STDPERIPH_DRIVER,AUDIO_INPUT=0,AUDIO_CODEC_ALG=1 - - ../../bundles/typical/inc;../../bundles/typical/inc/os;../../src/BSP;../../src/FWlib;../../src/StartUP/ing916;../../src/Tools;../../src + + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../src/BSP;../../src/FWlib;../../src/StartUP/ing916;../../src/Tools;../../src;.\libsbc\include @@ -352,10 +355,10 @@ 0 4 - - - - + + + + @@ -367,13 +370,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -529,11 +532,12 @@ + - + @@ -541,4 +545,5 @@ +
From 26c1f16165341cb854963b3ce177fc80b57ea1d5 Mon Sep 17 00:00:00 2001 From: zjli2019 Date: Wed, 18 Oct 2023 18:31:18 +0800 Subject: [PATCH 03/10] update 916 mini & noos_mini: memory mapped to sys --- bundles/extension/ING9168xx/apis.json | 751 +++++++++--------- bundles/extension/ING9168xx/meta.json | 4 +- bundles/extension/ING9168xx/platform.bin | Bin 161672 -> 161748 bytes bundles/extension/inc/platform_api.h | 17 +- bundles/mass_conn/ING9168xx/apis.json | 687 ++++++++-------- bundles/mass_conn/ING9168xx/meta.json | 4 +- bundles/mass_conn/ING9168xx/platform.bin | Bin 155068 -> 155136 bytes bundles/mass_conn/inc/platform_api.h | 17 +- bundles/mini/ING9168xx/apis.json | 687 ++++++++-------- bundles/mini/ING9168xx/meta.json | 6 +- bundles/mini/ING9168xx/platform.bin | Bin 155584 -> 155620 bytes bundles/mini/inc/platform_api.h | 17 +- bundles/noos_extension/ING9168xx/apis.json | 593 +++++++------- bundles/noos_extension/ING9168xx/meta.json | 4 +- bundles/noos_extension/ING9168xx/platform.bin | Bin 150796 -> 150868 bytes bundles/noos_extension/inc/platform_api.h | 17 +- bundles/noos_mass_conn/ING9168xx/apis.json | 529 ++++++------ bundles/noos_mass_conn/ING9168xx/meta.json | 4 +- bundles/noos_mass_conn/ING9168xx/platform.bin | Bin 144188 -> 144264 bytes bundles/noos_mass_conn/inc/platform_api.h | 17 +- bundles/noos_mini/ING9168xx/apis.json | 529 ++++++------ bundles/noos_mini/ING9168xx/meta.json | 6 +- bundles/noos_mini/ING9168xx/platform.bin | Bin 144688 -> 144728 bytes bundles/noos_mini/inc/platform_api.h | 17 +- bundles/noos_typical/ING9168xx/apis.json | 529 ++++++------ bundles/noos_typical/ING9168xx/meta.json | 4 +- bundles/noos_typical/ING9168xx/platform.bin | Bin 144188 -> 144260 bytes bundles/noos_typical/inc/platform_api.h | 17 +- bundles/typical/ING9168xx/apis.json | 687 ++++++++-------- bundles/typical/ING9168xx/meta.json | 4 +- bundles/typical/ING9168xx/platform.bin | Bin 155064 -> 155136 bytes bundles/typical/inc/platform_api.h | 17 +- .../peripheral_ibeacon/generic_cortex.icf | 6 +- .../peripheral_console.uvoptx | 6 +- .../peripheral_console.uvprojx | 10 +- .../peripheral_console_realtime.ingw | 10 +- .../peripheral_console_realtime.sct | 2 +- .../peripheral_console_realtime.uvproj | 4 +- .../peripheral_console_realtime.uvprojx | 4 +- examples/voice_remote_ctrl/flash_download.ini | 2 +- .../voice_remote_ctrl/src/audio_input_sim.c | 5 +- .../voice_remote_ctrl/src/audio_service.c | 75 +- .../voice_remote_ctrl/src/audio_service.h | 2 +- examples/voice_remote_ctrl/src/main.c | 22 +- examples/voice_remote_ctrl/src/profile.c | 19 +- .../voice_remote_ctrl.uvproj | 118 ++- .../voice_remote_ctrl.uvprojx | 109 ++- src/FWlib/peripheral_dma.c | 16 +- src/FWlib/peripheral_sysctrl.h | 42 +- src/Tools/trace.c | 25 +- src/Tools/trace.h | 19 +- 51 files changed, 2941 insertions(+), 2719 deletions(-) diff --git a/bundles/extension/ING9168xx/apis.json b/bundles/extension/ING9168xx/apis.json index 6cdaf5e6c..0bfba7e47 100644 --- a/bundles/extension/ING9168xx/apis.json +++ b/bundles/extension/ING9168xx/apis.json @@ -1,377 +1,378 @@ { - "att_dispatch_client_can_send_now": "0x0200446d", - "att_dispatch_client_request_can_send_now_event": "0x02004473", - "att_dispatch_register_client": "0x02004479", - "att_dispatch_register_server": "0x0200448d", - "att_dispatch_server_can_send_now": "0x020044a1", - "att_dispatch_server_request_can_send_now_event": "0x020044a7", - "att_emit_general_event": "0x02004559", - "att_server_can_send_packet_now": "0x02004c91", - "att_server_deferred_read_response": "0x02004c95", - "att_server_get_mtu": "0x02004cad", - "att_server_indicate": "0x02004d25", - "att_server_init": "0x02004da9", - "att_server_notify": "0x02004de5", - "att_server_register_packet_handler": "0x02004efd", - "att_server_request_can_send_now_event": "0x02004f09", - "att_set_db": "0x02004f25", - "att_set_read_callback": "0x02004f39", - "att_set_write_callback": "0x02004f45", - "bd_addr_cmp": "0x02005119", - "bd_addr_copy": "0x0200511f", - "bd_addr_to_str": "0x02005129", - "big_endian_read_16": "0x02005161", - "big_endian_read_32": "0x02005169", - "big_endian_store_16": "0x0200517d", - "big_endian_store_32": "0x02005189", - "btstack_config": "0x020052e9", - "btstack_memory_pool_create": "0x02005427", - "btstack_memory_pool_free": "0x02005451", - "btstack_memory_pool_get": "0x020054b1", - "btstack_push_user_msg": "0x02005519", - "btstack_push_user_runnable": "0x02005525", - "btstack_reset": "0x02005531", - "char_for_nibble": "0x02005859", - "eTaskConfirmSleepModeStatus": "0x02005c11", - "gap_add_dev_to_periodic_list": "0x02006281", - "gap_add_whitelist": "0x02006291", - "gap_aes_encrypt": "0x0200629d", - "gap_clear_white_lists": "0x020062d5", - "gap_clr_adv_set": "0x020062e1", - "gap_clr_periodic_adv_list": "0x020062ed", - "gap_create_connection_cancel": "0x020062f9", - "gap_default_periodic_adv_sync_transfer_param": "0x02006305", - "gap_disconnect": "0x0200631d", - "gap_disconnect_all": "0x02006349", - "gap_ext_create_connection": "0x02006389", - "gap_get_connection_parameter_range": "0x02006461", - "gap_le_read_channel_map": "0x0200649d", - "gap_periodic_adv_create_sync": "0x02006509", - "gap_periodic_adv_create_sync_cancel": "0x0200652d", - "gap_periodic_adv_set_info_transfer": "0x02006539", - "gap_periodic_adv_sync_transfer": "0x02006549", - "gap_periodic_adv_sync_transfer_param": "0x02006559", - "gap_periodic_adv_term_sync": "0x02006575", - "gap_read_antenna_info": "0x020065fd", - "gap_read_periodic_adv_list_size": "0x02006609", - "gap_read_phy": "0x02006615", - "gap_read_remote_used_features": "0x02006621", - "gap_read_remote_version": "0x0200662d", - "gap_read_rssi": "0x02006639", - "gap_remove_whitelist": "0x02006645", - "gap_rmv_adv_set": "0x020066c1", - "gap_rmv_dev_from_periodic_list": "0x020066cd", - "gap_rx_test_v2": "0x020066dd", - "gap_rx_test_v3": "0x020066ed", - "gap_set_adv_set_random_addr": "0x02006739", - "gap_set_callback_for_next_hci": "0x02006775", - "gap_set_connection_cte_request_enable": "0x02006795", - "gap_set_connection_cte_response_enable": "0x020067b1", - "gap_set_connection_cte_rx_param": "0x020067c1", - "gap_set_connection_cte_tx_param": "0x02006815", - "gap_set_connection_parameter_range": "0x02006861", - "gap_set_connectionless_cte_tx_enable": "0x02006879", - "gap_set_connectionless_cte_tx_param": "0x02006889", - "gap_set_connectionless_iq_sampling_enable": "0x020068e5", - "gap_set_data_length": "0x02006941", - "gap_set_def_phy": "0x02006959", - "gap_set_ext_adv_data": "0x02006969", - "gap_set_ext_adv_enable": "0x02006981", - "gap_set_ext_adv_para": "0x020069f1", - "gap_set_ext_scan_enable": "0x02006ac1", - "gap_set_ext_scan_para": "0x02006ad9", - "gap_set_ext_scan_response_data": "0x02006b79", - "gap_set_host_channel_classification": "0x02006b91", - "gap_set_periodic_adv_data": "0x02006ba1", - "gap_set_periodic_adv_enable": "0x02006c11", - "gap_set_periodic_adv_para": "0x02006c21", - "gap_set_periodic_adv_rx_enable": "0x02006c39", - "gap_set_phy": "0x02006c49", - "gap_set_random_device_address": "0x02006c65", - "gap_start_ccm": "0x02006c95", - "gap_test_end": "0x02006cdd", - "gap_tx_test_v2": "0x02006ce9", - "gap_tx_test_v4": "0x02006d01", - "gap_update_connection_parameters": "0x02006d25", - "gap_vendor_tx_continuous_wave": "0x02006d69", - "gatt_client_cancel_write": "0x02007291", - "gatt_client_discover_characteristic_descriptors": "0x020072b7", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x020072f7", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x02007347", - "gatt_client_discover_characteristics_for_service": "0x02007397", - "gatt_client_discover_primary_services": "0x020073cd", - "gatt_client_discover_primary_services_by_uuid128": "0x020073ff", - "gatt_client_discover_primary_services_by_uuid16": "0x02007443", - "gatt_client_execute_write": "0x02007481", - "gatt_client_find_included_services_for_service": "0x020074a7", - "gatt_client_get_mtu": "0x020074d5", - "gatt_client_is_ready": "0x02007599", - "gatt_client_listen_for_characteristic_value_updates": "0x020075af", - "gatt_client_prepare_write": "0x020075d1", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x0200760d", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x02007637", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x0200763d", - "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x0200766b", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x02007671", - "gatt_client_read_multiple_characteristic_values": "0x0200769f", - "gatt_client_read_value_of_characteristic_using_value_handle": "0x020076cf", - "gatt_client_read_value_of_characteristics_by_uuid128": "0x020076fd", - "gatt_client_read_value_of_characteristics_by_uuid16": "0x02007749", - "gatt_client_register_handler": "0x02007795", - "gatt_client_reliable_write_long_value_of_characteristic": "0x020077a1", - "gatt_client_signed_write_without_response": "0x02007bd5", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x02007c99", - "gatt_client_write_client_characteristic_configuration": "0x02007cd3", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x02007d25", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x02007d35", - "gatt_client_write_long_value_of_characteristic": "0x02007d71", - "gatt_client_write_long_value_of_characteristic_with_offset": "0x02007d81", - "gatt_client_write_value_of_characteristic": "0x02007dbd", - "gatt_client_write_value_of_characteristic_without_response": "0x02007df3", - "hci_add_event_handler": "0x02009415", - "hci_power_control": "0x02009bbd", - "hci_register_acl_packet_handler": "0x02009d71", - "kv_commit": "0x0200a4a5", - "kv_get": "0x0200a501", - "kv_init": "0x0200a50d", - "kv_init_backend": "0x0200a58d", - "kv_put": "0x0200a5a1", - "kv_remove": "0x0200a5ad", - "kv_remove_all": "0x0200a5e1", - "kv_value_modified": "0x0200a611", - "kv_value_modified_of_key": "0x0200a62d", - "kv_visit": "0x0200a639", - "l2cap_add_event_handler": "0x0200a6c9", - "l2cap_can_send_packet_now": "0x0200a6d9", - "l2cap_create_le_credit_based_connection_request": "0x0200a89d", - "l2cap_credit_based_send": "0x0200a9e5", - "l2cap_credit_based_send_continue": "0x0200aa11", - "l2cap_disconnect": "0x0200aa8d", - "l2cap_get_le_credit_based_connection_credits": "0x0200ac79", - "l2cap_get_peer_mtu_for_local_cid": "0x0200ac95", - "l2cap_init": "0x0200b0d5", - "l2cap_le_send_flow_control_credit": "0x0200b1cb", - "l2cap_max_le_mtu": "0x0200b4d9", - "l2cap_register_packet_handler": "0x0200b601", - "l2cap_register_service": "0x0200b60d", - "l2cap_request_can_send_now_event": "0x0200b71d", - "l2cap_request_connection_parameter_update": "0x0200b737", - "l2cap_send_echo_request": "0x0200bc19", - "l2cap_unregister_service": "0x0200bcf9", - "le_device_db_add": "0x0200bd51", - "le_device_db_find": "0x0200be29", - "le_device_db_from_key": "0x0200be55", - "le_device_db_iter_cur": "0x0200be5d", - "le_device_db_iter_cur_key": "0x0200be61", - "le_device_db_iter_init": "0x0200be65", - "le_device_db_iter_next": "0x0200be6d", - "le_device_db_remove_key": "0x0200be93", - "ll_ackable_packet_alloc": "0x0200bebf", - "ll_ackable_packet_get_status": "0x0200bffb", - "ll_ackable_packet_run": "0x0200c069", - "ll_ackable_packet_set_tx_data": "0x0200c121", - "ll_adjust_conn_peer_tx_power": "0x0200c13d", - "ll_aes_encrypt": "0x0200c169", - "ll_allow_nonstandard_adv_type": "0x0200c1dd", - "ll_attach_cte_to_adv_set": "0x0200c1f5", - "ll_channel_monitor_alloc": "0x0200c38d", - "ll_channel_monitor_check_each_pdu": "0x0200c40f", - "ll_channel_monitor_run": "0x0200c471", - "ll_config": "0x0200c541", - "ll_free": "0x0200c797", - "ll_get_conn_events_info": "0x0200c7a1", - "ll_get_conn_info": "0x0200c889", - "ll_get_heap_free_size": "0x0200c8d9", - "ll_hint_on_ce_len": "0x0200c8ed", - "ll_legacy_adv_set_interval": "0x0200c925", - "ll_lock_frequency": "0x0200c935", - "ll_malloc": "0x0200c999", - "ll_override_whitening_init_value": "0x0200c9a1", - "ll_raw_packet_alloc": "0x0200cac9", - "ll_raw_packet_free": "0x0200cb9d", - "ll_raw_packet_get_bare_rx_data": "0x0200cbd5", - "ll_raw_packet_get_iq_samples": "0x0200cc95", - "ll_raw_packet_get_rx_data": "0x0200cd2f", - "ll_raw_packet_recv": "0x0200cde1", - "ll_raw_packet_send": "0x0200ceb5", - "ll_raw_packet_set_bare_data": "0x0200cfd1", - "ll_raw_packet_set_bare_mode": "0x0200d00f", - "ll_raw_packet_set_fake_cte_info": "0x0200d113", - "ll_raw_packet_set_param": "0x0200d135", - "ll_raw_packet_set_rx_cte": "0x0200d197", - "ll_raw_packet_set_tx_cte": "0x0200d22d", - "ll_raw_packet_set_tx_data": "0x0200d26d", - "ll_register_hci_acl_previewer": "0x0200d2d5", - "ll_scan_set_fixed_channel": "0x0200d339", - "ll_scanner_enable_iq_sampling": "0x0200d345", - "ll_scanner_enable_iq_sampling_on_legacy": "0x0200d3ed", - "ll_set_adv_access_address": "0x0200d6dd", - "ll_set_adv_coded_scheme": "0x0200d6e9", - "ll_set_conn_acl_report_latency": "0x0200d721", - "ll_set_conn_coded_scheme": "0x0200d751", - "ll_set_conn_interval_unit": "0x0200d77d", - "ll_set_conn_latency": "0x0200d789", - "ll_set_conn_tx_power": "0x0200d7b9", - "ll_set_cte_bit": "0x0200d7e9", - "ll_set_def_antenna": "0x0200d811", - "ll_set_initiating_coded_scheme": "0x0200d831", - "ll_set_max_conn_number": "0x0200d83d", - "ll_set_tx_power_range": "0x0200d8d1", - "ll_unlock_frequency": "0x0200d8f9", - "nibble_for_char": "0x02020815", - "platform_32k_rc_auto_tune": "0x020208c1", - "platform_32k_rc_tune": "0x0202090d", - "platform_calibrate_32k": "0x02020929", - "platform_config": "0x0202092d", - "platform_delete_timer": "0x02020a55", - "platform_enable_irq": "0x02020a5d", - "platform_get_current_task": "0x02020a91", - "platform_get_gen_os_driver": "0x02020ab5", - "platform_get_heap_status": "0x02020abd", - "platform_get_link_layer_interf": "0x02020ad5", - "platform_get_task_handle": "0x02020add", - "platform_get_timer_counter": "0x02020afd", - "platform_get_us_time": "0x02020b01", - "platform_get_version": "0x02020b05", - "platform_hrng": "0x02020b0d", - "platform_install_isr_stack": "0x02020b15", - "platform_install_task_stack": "0x02020b21", - "platform_patch_rf_init_data": "0x02020b59", - "platform_printf": "0x02020b65", - "platform_raise_assertion": "0x02020b79", - "platform_rand": "0x02020b8d", - "platform_read_info": "0x02020b91", - "platform_read_persistent_reg": "0x02020bc1", - "platform_reset": "0x02020bcd", - "platform_set_abs_timer": "0x02020be1", - "platform_set_evt_callback": "0x02020be5", - "platform_set_evt_callback_table": "0x02020bf9", - "platform_set_irq_callback": "0x02020c05", - "platform_set_irq_callback_table": "0x02020c21", - "platform_set_rf_clk_source": "0x02020c2d", - "platform_set_rf_init_data": "0x02020c39", - "platform_set_rf_power_mapping": "0x02020c45", - "platform_set_timer": "0x02020c51", - "platform_shutdown": "0x02020c55", - "platform_switch_app": "0x02020c59", - "platform_trace_raw": "0x02020c71", - "platform_write_persistent_reg": "0x02020c89", - "printf_hexdump": "0x02020e41", - "pvPortMalloc": "0x02021919", - "pvTaskIncrementMutexHeldCount": "0x02021a01", - "pvTimerGetTimerID": "0x02021a19", - "pxPortInitialiseStack": "0x02021a45", - "reverse_128": "0x02021c2d", - "reverse_24": "0x02021c33", - "reverse_256": "0x02021c39", - "reverse_48": "0x02021c3f", - "reverse_56": "0x02021c45", - "reverse_64": "0x02021c4b", - "reverse_bd_addr": "0x02021c51", - "reverse_bytes": "0x02021c57", - "sm_add_event_handler": "0x02021fe5", - "sm_address_resolution_lookup": "0x0202213d", - "sm_authenticated": "0x020224b9", - "sm_authorization_decline": "0x020224c7", - "sm_authorization_grant": "0x020224e7", - "sm_authorization_state": "0x02022507", - "sm_bonding_decline": "0x02022521", - "sm_config": "0x02022975", - "sm_config_conn": "0x0202298d", - "sm_encryption_key_size": "0x02022b43", - "sm_just_works_confirm": "0x020230c9", - "sm_le_device_key": "0x02023415", - "sm_passkey_input": "0x020234ab", - "sm_private_random_address_generation_get": "0x02023865", - "sm_private_random_address_generation_get_mode": "0x0202386d", - "sm_private_random_address_generation_set_mode": "0x02023879", - "sm_private_random_address_generation_set_update_period": "0x020238a1", - "sm_register_external_ltk_callback": "0x020239dd", - "sm_register_oob_data_callback": "0x020239e9", - "sm_request_pairing": "0x020239f5", - "sm_send_security_request": "0x020244cb", - "sm_set_accepted_stk_generation_methods": "0x020244f1", - "sm_set_authentication_requirements": "0x020244fd", - "sm_set_encryption_key_size_range": "0x02024509", - "sscanf_bd_addr": "0x020248e1", - "sysSetPublicDeviceAddr": "0x02024d91", - "uuid128_to_str": "0x020255d9", - "uuid_add_bluetooth_prefix": "0x02025631", - "uuid_has_bluetooth_prefix": "0x02025651", - "uxListRemove": "0x0202566d", - "uxQueueMessagesWaiting": "0x02025695", - "uxQueueMessagesWaitingFromISR": "0x020256bd", - "uxQueueSpacesAvailable": "0x020256d9", - "uxTaskGetStackHighWaterMark": "0x02025705", - "uxTaskPriorityGet": "0x02025725", - "uxTaskPriorityGetFromISR": "0x02025741", - "vListInitialise": "0x020257ff", - "vListInitialiseItem": "0x02025815", - "vListInsert": "0x0202581b", - "vListInsertEnd": "0x0202584b", - "vPortEndScheduler": "0x02025865", - "vPortEnterCritical": "0x02025891", - "vPortExitCritical": "0x020258d5", - "vPortFree": "0x02025909", - "vPortSuppressTicksAndSleep": "0x020259ad", - "vPortValidateInterruptPriority": "0x02025ad5", - "vQueueDelete": "0x02025b31", - "vQueueWaitForMessageRestricted": "0x02025b5d", - "vTaskDelay": "0x02025ba1", - "vTaskInternalSetTimeOutState": "0x02025bed", - "vTaskMissedYield": "0x02025bfd", - "vTaskPlaceOnEventList": "0x02025c09", - "vTaskPlaceOnEventListRestricted": "0x02025c41", - "vTaskPriorityDisinheritAfterTimeout": "0x02025c81", - "vTaskPrioritySet": "0x02025d2d", - "vTaskResume": "0x02025df5", - "vTaskStartScheduler": "0x02025e79", - "vTaskStepTick": "0x02025f09", - "vTaskSuspend": "0x02025f39", - "vTaskSuspendAll": "0x02025ff5", - "vTaskSwitchContext": "0x02026005", - "xPortStartScheduler": "0x020260ad", - "xQueueAddToSet": "0x020261b1", - "xQueueCreateCountingSemaphore": "0x020261d5", - "xQueueCreateCountingSemaphoreStatic": "0x02026211", - "xQueueCreateMutex": "0x02026255", - "xQueueCreateMutexStatic": "0x0202626b", - "xQueueCreateSet": "0x02026285", - "xQueueGenericCreate": "0x0202628d", - "xQueueGenericCreateStatic": "0x020262d9", - "xQueueGenericReset": "0x02026341", - "xQueueGenericSend": "0x020263cd", - "xQueueGenericSendFromISR": "0x02026539", - "xQueueGiveFromISR": "0x020265f9", - "xQueueGiveMutexRecursive": "0x0202669d", - "xQueueIsQueueEmptyFromISR": "0x020266dd", - "xQueueIsQueueFullFromISR": "0x02026701", - "xQueuePeek": "0x02026729", - "xQueuePeekFromISR": "0x02026851", - "xQueueReceive": "0x020268bd", - "xQueueReceiveFromISR": "0x020269e9", - "xQueueRemoveFromSet": "0x02026a7d", - "xQueueSelectFromSet": "0x02026a9f", - "xQueueSelectFromSetFromISR": "0x02026ab1", - "xQueueSemaphoreTake": "0x02026ac5", - "xQueueTakeMutexRecursive": "0x02026c31", - "xTaskCheckForTimeOut": "0x02026c75", - "xTaskCreate": "0x02026ce5", - "xTaskCreateStatic": "0x02026d41", - "xTaskGetCurrentTaskHandle": "0x02026db1", - "xTaskGetSchedulerState": "0x02026dbd", - "xTaskGetTickCount": "0x02026dd9", - "xTaskGetTickCountFromISR": "0x02026de5", - "xTaskIncrementTick": "0x02026df5", - "xTaskPriorityDisinherit": "0x02026ec1", - "xTaskPriorityInherit": "0x02026f55", - "xTaskRemoveFromEventList": "0x02026fe9", - "xTaskResumeAll": "0x02027069", - "xTaskResumeFromISR": "0x02027131", - "xTimerCreate": "0x020271bd", - "xTimerCreateStatic": "0x020271f1", - "xTimerCreateTimerTask": "0x02027229", - "xTimerGenericCommand": "0x02027295", - "xTimerGetExpiryTime": "0x02027305", - "xTimerGetTimerDaemonTaskHandle": "0x02027325" + "att_dispatch_client_can_send_now": "0x020044b5", + "att_dispatch_client_request_can_send_now_event": "0x020044bb", + "att_dispatch_register_client": "0x020044c1", + "att_dispatch_register_server": "0x020044d5", + "att_dispatch_server_can_send_now": "0x020044e9", + "att_dispatch_server_request_can_send_now_event": "0x020044ef", + "att_emit_general_event": "0x020045a1", + "att_server_can_send_packet_now": "0x02004cd9", + "att_server_deferred_read_response": "0x02004cdd", + "att_server_get_mtu": "0x02004cf5", + "att_server_indicate": "0x02004d6d", + "att_server_init": "0x02004df1", + "att_server_notify": "0x02004e2d", + "att_server_register_packet_handler": "0x02004f45", + "att_server_request_can_send_now_event": "0x02004f51", + "att_set_db": "0x02004f6d", + "att_set_read_callback": "0x02004f81", + "att_set_write_callback": "0x02004f8d", + "bd_addr_cmp": "0x02005161", + "bd_addr_copy": "0x02005167", + "bd_addr_to_str": "0x02005171", + "big_endian_read_16": "0x020051a9", + "big_endian_read_32": "0x020051b1", + "big_endian_store_16": "0x020051c5", + "big_endian_store_32": "0x020051d1", + "btstack_config": "0x02005331", + "btstack_memory_pool_create": "0x0200546f", + "btstack_memory_pool_free": "0x02005499", + "btstack_memory_pool_get": "0x020054f9", + "btstack_push_user_msg": "0x02005561", + "btstack_push_user_runnable": "0x0200556d", + "btstack_reset": "0x02005579", + "char_for_nibble": "0x020058a1", + "eTaskConfirmSleepModeStatus": "0x02005c59", + "gap_add_dev_to_periodic_list": "0x020062c9", + "gap_add_whitelist": "0x020062d9", + "gap_aes_encrypt": "0x020062e5", + "gap_clear_white_lists": "0x0200631d", + "gap_clr_adv_set": "0x02006329", + "gap_clr_periodic_adv_list": "0x02006335", + "gap_create_connection_cancel": "0x02006341", + "gap_default_periodic_adv_sync_transfer_param": "0x0200634d", + "gap_disconnect": "0x02006365", + "gap_disconnect_all": "0x02006391", + "gap_ext_create_connection": "0x020063d1", + "gap_get_connection_parameter_range": "0x020064a9", + "gap_le_read_channel_map": "0x020064e5", + "gap_periodic_adv_create_sync": "0x02006551", + "gap_periodic_adv_create_sync_cancel": "0x02006575", + "gap_periodic_adv_set_info_transfer": "0x02006581", + "gap_periodic_adv_sync_transfer": "0x02006591", + "gap_periodic_adv_sync_transfer_param": "0x020065a1", + "gap_periodic_adv_term_sync": "0x020065bd", + "gap_read_antenna_info": "0x02006645", + "gap_read_periodic_adv_list_size": "0x02006651", + "gap_read_phy": "0x0200665d", + "gap_read_remote_used_features": "0x02006669", + "gap_read_remote_version": "0x02006675", + "gap_read_rssi": "0x02006681", + "gap_remove_whitelist": "0x0200668d", + "gap_rmv_adv_set": "0x02006709", + "gap_rmv_dev_from_periodic_list": "0x02006715", + "gap_rx_test_v2": "0x02006725", + "gap_rx_test_v3": "0x02006735", + "gap_set_adv_set_random_addr": "0x02006781", + "gap_set_callback_for_next_hci": "0x020067bd", + "gap_set_connection_cte_request_enable": "0x020067dd", + "gap_set_connection_cte_response_enable": "0x020067f9", + "gap_set_connection_cte_rx_param": "0x02006809", + "gap_set_connection_cte_tx_param": "0x0200685d", + "gap_set_connection_parameter_range": "0x020068a9", + "gap_set_connectionless_cte_tx_enable": "0x020068c1", + "gap_set_connectionless_cte_tx_param": "0x020068d1", + "gap_set_connectionless_iq_sampling_enable": "0x0200692d", + "gap_set_data_length": "0x02006989", + "gap_set_def_phy": "0x020069a1", + "gap_set_ext_adv_data": "0x020069b1", + "gap_set_ext_adv_enable": "0x020069c9", + "gap_set_ext_adv_para": "0x02006a39", + "gap_set_ext_scan_enable": "0x02006b09", + "gap_set_ext_scan_para": "0x02006b21", + "gap_set_ext_scan_response_data": "0x02006bc1", + "gap_set_host_channel_classification": "0x02006bd9", + "gap_set_periodic_adv_data": "0x02006be9", + "gap_set_periodic_adv_enable": "0x02006c59", + "gap_set_periodic_adv_para": "0x02006c69", + "gap_set_periodic_adv_rx_enable": "0x02006c81", + "gap_set_phy": "0x02006c91", + "gap_set_random_device_address": "0x02006cad", + "gap_start_ccm": "0x02006cdd", + "gap_test_end": "0x02006d25", + "gap_tx_test_v2": "0x02006d31", + "gap_tx_test_v4": "0x02006d49", + "gap_update_connection_parameters": "0x02006d6d", + "gap_vendor_tx_continuous_wave": "0x02006db1", + "gatt_client_cancel_write": "0x020072d9", + "gatt_client_discover_characteristic_descriptors": "0x020072ff", + "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x0200733f", + "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x0200738f", + "gatt_client_discover_characteristics_for_service": "0x020073df", + "gatt_client_discover_primary_services": "0x02007415", + "gatt_client_discover_primary_services_by_uuid128": "0x02007447", + "gatt_client_discover_primary_services_by_uuid16": "0x0200748b", + "gatt_client_execute_write": "0x020074c9", + "gatt_client_find_included_services_for_service": "0x020074ef", + "gatt_client_get_mtu": "0x0200751d", + "gatt_client_is_ready": "0x020075e1", + "gatt_client_listen_for_characteristic_value_updates": "0x020075f7", + "gatt_client_prepare_write": "0x02007619", + "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x02007655", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x0200767f", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x02007685", + "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x020076b3", + "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x020076b9", + "gatt_client_read_multiple_characteristic_values": "0x020076e7", + "gatt_client_read_value_of_characteristic_using_value_handle": "0x02007717", + "gatt_client_read_value_of_characteristics_by_uuid128": "0x02007745", + "gatt_client_read_value_of_characteristics_by_uuid16": "0x02007791", + "gatt_client_register_handler": "0x020077dd", + "gatt_client_reliable_write_long_value_of_characteristic": "0x020077e9", + "gatt_client_signed_write_without_response": "0x02007c1d", + "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x02007ce1", + "gatt_client_write_client_characteristic_configuration": "0x02007d1b", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x02007d6d", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x02007d7d", + "gatt_client_write_long_value_of_characteristic": "0x02007db9", + "gatt_client_write_long_value_of_characteristic_with_offset": "0x02007dc9", + "gatt_client_write_value_of_characteristic": "0x02007e05", + "gatt_client_write_value_of_characteristic_without_response": "0x02007e3b", + "hci_add_event_handler": "0x0200945d", + "hci_power_control": "0x02009c05", + "hci_register_acl_packet_handler": "0x02009db9", + "kv_commit": "0x0200a4ed", + "kv_get": "0x0200a549", + "kv_init": "0x0200a555", + "kv_init_backend": "0x0200a5d5", + "kv_put": "0x0200a5e9", + "kv_remove": "0x0200a5f5", + "kv_remove_all": "0x0200a629", + "kv_value_modified": "0x0200a659", + "kv_value_modified_of_key": "0x0200a675", + "kv_visit": "0x0200a681", + "l2cap_add_event_handler": "0x0200a711", + "l2cap_can_send_packet_now": "0x0200a721", + "l2cap_create_le_credit_based_connection_request": "0x0200a8e5", + "l2cap_credit_based_send": "0x0200aa2d", + "l2cap_credit_based_send_continue": "0x0200aa59", + "l2cap_disconnect": "0x0200aad5", + "l2cap_get_le_credit_based_connection_credits": "0x0200acc1", + "l2cap_get_peer_mtu_for_local_cid": "0x0200acdd", + "l2cap_init": "0x0200b11d", + "l2cap_le_send_flow_control_credit": "0x0200b213", + "l2cap_max_le_mtu": "0x0200b521", + "l2cap_register_packet_handler": "0x0200b649", + "l2cap_register_service": "0x0200b655", + "l2cap_request_can_send_now_event": "0x0200b765", + "l2cap_request_connection_parameter_update": "0x0200b77f", + "l2cap_send_echo_request": "0x0200bc61", + "l2cap_unregister_service": "0x0200bd41", + "le_device_db_add": "0x0200bd99", + "le_device_db_find": "0x0200be71", + "le_device_db_from_key": "0x0200be9d", + "le_device_db_iter_cur": "0x0200bea5", + "le_device_db_iter_cur_key": "0x0200bea9", + "le_device_db_iter_init": "0x0200bead", + "le_device_db_iter_next": "0x0200beb5", + "le_device_db_remove_key": "0x0200bedb", + "ll_ackable_packet_alloc": "0x0200bf07", + "ll_ackable_packet_get_status": "0x0200c043", + "ll_ackable_packet_run": "0x0200c0b1", + "ll_ackable_packet_set_tx_data": "0x0200c169", + "ll_adjust_conn_peer_tx_power": "0x0200c185", + "ll_aes_encrypt": "0x0200c1b1", + "ll_allow_nonstandard_adv_type": "0x0200c225", + "ll_attach_cte_to_adv_set": "0x0200c23d", + "ll_channel_monitor_alloc": "0x0200c3d5", + "ll_channel_monitor_check_each_pdu": "0x0200c457", + "ll_channel_monitor_run": "0x0200c4b9", + "ll_config": "0x0200c589", + "ll_free": "0x0200c7df", + "ll_get_conn_events_info": "0x0200c7e9", + "ll_get_conn_info": "0x0200c8d1", + "ll_get_heap_free_size": "0x0200c921", + "ll_hint_on_ce_len": "0x0200c935", + "ll_legacy_adv_set_interval": "0x0200c96d", + "ll_lock_frequency": "0x0200c97d", + "ll_malloc": "0x0200c9e1", + "ll_override_whitening_init_value": "0x0200c9e9", + "ll_raw_packet_alloc": "0x0200cb11", + "ll_raw_packet_free": "0x0200cbe5", + "ll_raw_packet_get_bare_rx_data": "0x0200cc1d", + "ll_raw_packet_get_iq_samples": "0x0200ccdd", + "ll_raw_packet_get_rx_data": "0x0200cd77", + "ll_raw_packet_recv": "0x0200ce29", + "ll_raw_packet_send": "0x0200cefd", + "ll_raw_packet_set_bare_data": "0x0200d019", + "ll_raw_packet_set_bare_mode": "0x0200d057", + "ll_raw_packet_set_fake_cte_info": "0x0200d15b", + "ll_raw_packet_set_param": "0x0200d17d", + "ll_raw_packet_set_rx_cte": "0x0200d1df", + "ll_raw_packet_set_tx_cte": "0x0200d275", + "ll_raw_packet_set_tx_data": "0x0200d2b5", + "ll_register_hci_acl_previewer": "0x0200d31d", + "ll_scan_set_fixed_channel": "0x0200d381", + "ll_scanner_enable_iq_sampling": "0x0200d38d", + "ll_scanner_enable_iq_sampling_on_legacy": "0x0200d435", + "ll_set_adv_access_address": "0x0200d725", + "ll_set_adv_coded_scheme": "0x0200d731", + "ll_set_conn_acl_report_latency": "0x0200d769", + "ll_set_conn_coded_scheme": "0x0200d799", + "ll_set_conn_interval_unit": "0x0200d7c5", + "ll_set_conn_latency": "0x0200d7d1", + "ll_set_conn_tx_power": "0x0200d801", + "ll_set_cte_bit": "0x0200d831", + "ll_set_def_antenna": "0x0200d859", + "ll_set_initiating_coded_scheme": "0x0200d879", + "ll_set_max_conn_number": "0x0200d885", + "ll_set_tx_power_range": "0x0200d919", + "ll_unlock_frequency": "0x0200d941", + "nibble_for_char": "0x0202085d", + "platform_32k_rc_auto_tune": "0x02020909", + "platform_32k_rc_tune": "0x02020955", + "platform_calibrate_32k": "0x02020971", + "platform_call_on_stack": "0x020021fb", + "platform_config": "0x02020975", + "platform_delete_timer": "0x02020a9d", + "platform_enable_irq": "0x02020aa5", + "platform_get_current_task": "0x02020ad9", + "platform_get_gen_os_driver": "0x02020afd", + "platform_get_heap_status": "0x02020b05", + "platform_get_link_layer_interf": "0x02020b1d", + "platform_get_task_handle": "0x02020b25", + "platform_get_timer_counter": "0x02020b45", + "platform_get_us_time": "0x02020b49", + "platform_get_version": "0x02020b4d", + "platform_hrng": "0x02020b55", + "platform_install_isr_stack": "0x02020b5d", + "platform_install_task_stack": "0x02020b69", + "platform_patch_rf_init_data": "0x02020ba1", + "platform_printf": "0x02020bad", + "platform_raise_assertion": "0x02020bc1", + "platform_rand": "0x02020bd5", + "platform_read_info": "0x02020bd9", + "platform_read_persistent_reg": "0x02020c09", + "platform_reset": "0x02020c15", + "platform_set_abs_timer": "0x02020c29", + "platform_set_evt_callback": "0x02020c2d", + "platform_set_evt_callback_table": "0x02020c41", + "platform_set_irq_callback": "0x02020c4d", + "platform_set_irq_callback_table": "0x02020c69", + "platform_set_rf_clk_source": "0x02020c75", + "platform_set_rf_init_data": "0x02020c81", + "platform_set_rf_power_mapping": "0x02020c8d", + "platform_set_timer": "0x02020c99", + "platform_shutdown": "0x02020c9d", + "platform_switch_app": "0x02020ca1", + "platform_trace_raw": "0x02020cb9", + "platform_write_persistent_reg": "0x02020cd1", + "printf_hexdump": "0x02020e89", + "pvPortMalloc": "0x02021961", + "pvTaskIncrementMutexHeldCount": "0x02021a49", + "pvTimerGetTimerID": "0x02021a61", + "pxPortInitialiseStack": "0x02021a8d", + "reverse_128": "0x02021c75", + "reverse_24": "0x02021c7b", + "reverse_256": "0x02021c81", + "reverse_48": "0x02021c87", + "reverse_56": "0x02021c8d", + "reverse_64": "0x02021c93", + "reverse_bd_addr": "0x02021c99", + "reverse_bytes": "0x02021c9f", + "sm_add_event_handler": "0x0202202d", + "sm_address_resolution_lookup": "0x02022185", + "sm_authenticated": "0x02022501", + "sm_authorization_decline": "0x0202250f", + "sm_authorization_grant": "0x0202252f", + "sm_authorization_state": "0x0202254f", + "sm_bonding_decline": "0x02022569", + "sm_config": "0x020229bd", + "sm_config_conn": "0x020229d5", + "sm_encryption_key_size": "0x02022b8b", + "sm_just_works_confirm": "0x02023111", + "sm_le_device_key": "0x0202345d", + "sm_passkey_input": "0x020234f3", + "sm_private_random_address_generation_get": "0x020238ad", + "sm_private_random_address_generation_get_mode": "0x020238b5", + "sm_private_random_address_generation_set_mode": "0x020238c1", + "sm_private_random_address_generation_set_update_period": "0x020238e9", + "sm_register_external_ltk_callback": "0x02023a25", + "sm_register_oob_data_callback": "0x02023a31", + "sm_request_pairing": "0x02023a3d", + "sm_send_security_request": "0x02024513", + "sm_set_accepted_stk_generation_methods": "0x02024539", + "sm_set_authentication_requirements": "0x02024545", + "sm_set_encryption_key_size_range": "0x02024551", + "sscanf_bd_addr": "0x02024929", + "sysSetPublicDeviceAddr": "0x02024dd9", + "uuid128_to_str": "0x02025621", + "uuid_add_bluetooth_prefix": "0x02025679", + "uuid_has_bluetooth_prefix": "0x02025699", + "uxListRemove": "0x020256b5", + "uxQueueMessagesWaiting": "0x020256dd", + "uxQueueMessagesWaitingFromISR": "0x02025705", + "uxQueueSpacesAvailable": "0x02025721", + "uxTaskGetStackHighWaterMark": "0x0202574d", + "uxTaskPriorityGet": "0x0202576d", + "uxTaskPriorityGetFromISR": "0x02025789", + "vListInitialise": "0x02025847", + "vListInitialiseItem": "0x0202585d", + "vListInsert": "0x02025863", + "vListInsertEnd": "0x02025893", + "vPortEndScheduler": "0x020258ad", + "vPortEnterCritical": "0x020258d9", + "vPortExitCritical": "0x0202591d", + "vPortFree": "0x02025951", + "vPortSuppressTicksAndSleep": "0x020259f5", + "vPortValidateInterruptPriority": "0x02025b1d", + "vQueueDelete": "0x02025b79", + "vQueueWaitForMessageRestricted": "0x02025ba5", + "vTaskDelay": "0x02025be9", + "vTaskInternalSetTimeOutState": "0x02025c35", + "vTaskMissedYield": "0x02025c45", + "vTaskPlaceOnEventList": "0x02025c51", + "vTaskPlaceOnEventListRestricted": "0x02025c89", + "vTaskPriorityDisinheritAfterTimeout": "0x02025cc9", + "vTaskPrioritySet": "0x02025d75", + "vTaskResume": "0x02025e3d", + "vTaskStartScheduler": "0x02025ec1", + "vTaskStepTick": "0x02025f51", + "vTaskSuspend": "0x02025f81", + "vTaskSuspendAll": "0x0202603d", + "vTaskSwitchContext": "0x0202604d", + "xPortStartScheduler": "0x020260f5", + "xQueueAddToSet": "0x020261f9", + "xQueueCreateCountingSemaphore": "0x0202621d", + "xQueueCreateCountingSemaphoreStatic": "0x02026259", + "xQueueCreateMutex": "0x0202629d", + "xQueueCreateMutexStatic": "0x020262b3", + "xQueueCreateSet": "0x020262cd", + "xQueueGenericCreate": "0x020262d5", + "xQueueGenericCreateStatic": "0x02026321", + "xQueueGenericReset": "0x02026389", + "xQueueGenericSend": "0x02026415", + "xQueueGenericSendFromISR": "0x02026581", + "xQueueGiveFromISR": "0x02026641", + "xQueueGiveMutexRecursive": "0x020266e5", + "xQueueIsQueueEmptyFromISR": "0x02026725", + "xQueueIsQueueFullFromISR": "0x02026749", + "xQueuePeek": "0x02026771", + "xQueuePeekFromISR": "0x02026899", + "xQueueReceive": "0x02026905", + "xQueueReceiveFromISR": "0x02026a31", + "xQueueRemoveFromSet": "0x02026ac5", + "xQueueSelectFromSet": "0x02026ae7", + "xQueueSelectFromSetFromISR": "0x02026af9", + "xQueueSemaphoreTake": "0x02026b0d", + "xQueueTakeMutexRecursive": "0x02026c79", + "xTaskCheckForTimeOut": "0x02026cbd", + "xTaskCreate": "0x02026d2d", + "xTaskCreateStatic": "0x02026d89", + "xTaskGetCurrentTaskHandle": "0x02026df9", + "xTaskGetSchedulerState": "0x02026e05", + "xTaskGetTickCount": "0x02026e21", + "xTaskGetTickCountFromISR": "0x02026e2d", + "xTaskIncrementTick": "0x02026e3d", + "xTaskPriorityDisinherit": "0x02026f09", + "xTaskPriorityInherit": "0x02026f9d", + "xTaskRemoveFromEventList": "0x02027031", + "xTaskResumeAll": "0x020270b1", + "xTaskResumeFromISR": "0x02027179", + "xTimerCreate": "0x02027205", + "xTimerCreateStatic": "0x02027239", + "xTimerCreateTimerTask": "0x02027271", + "xTimerGenericCommand": "0x020272dd", + "xTimerGetExpiryTime": "0x0202734d", + "xTimerGetTimerDaemonTaskHandle": "0x0202736d" } \ No newline at end of file diff --git a/bundles/extension/ING9168xx/meta.json b/bundles/extension/ING9168xx/meta.json index ac5fbb209..205ecdb9a 100644 --- a/bundles/extension/ING9168xx/meta.json +++ b/bundles/extension/ING9168xx/meta.json @@ -8,11 +8,11 @@ }, "rom": { "base": 33562624, - "size": 161672 + "size": 161748 }, "version": [ 2, 2, - 50 + 52 ] } \ No newline at end of file diff --git a/bundles/extension/ING9168xx/platform.bin b/bundles/extension/ING9168xx/platform.bin index 30f4a536b9e7341b5f18826cff97b45c21757a12..35a0cb1454b5b1c2470bfa52537ecbcd2d0ef6f9 100644 GIT binary patch delta 7779 zcmaKx4OCRuwa3riGXpcoAj7AC$OR;ZAQ4nF#85@$V?g64Dk4!dCXhhY2K+)Y7{d$N zn2J|>wXJDvY7^Vo#7ylti6pTvzJxS(X;*A&tFIx6ZOw}nm$9OVy#JoL*re;NH*1~y z+h?DB&e`YObN4y-PWxrYN0%KQ0nj#VDMh>F`$kO#vIq!!2x zNG>$g3Es#FR@evm5YkrIZ$PR;DuR6t%I6>*MBa^#@{t@!2}qSlbx0eKwu)>zE8GkR zSVi-A^#b!>dLvJ%p17N;RF$;pF3O;T`b6rWLcNQ|x{oAIPwTO;r8uHg)xKkkIDPqQ zOlxas*qO^$9j#AYb+ps3?8SRZ=vXUc)p_}<9a{U>w03B%m((ZvEo$Tugms}5c;XNbI1y!_r0mk z=uqm^^J21`Ckqu*IhU!PPu}SCHpGmI;K*J2_tT!F5B1pe$sxydW^K23ar(U!msf^S zyGxf@Q@J#>=VwQcDW&C=d7mHovk=?MJDHbw-C5I!_IkIEjwhOz898IuE7h*I6i%Ymy1#HKozWAfriZL=!mU`VPn}xke0eQ17gMRFXXKkN z>wBk8%>5$@C2x6CsTWMS{|%)U!BX_sAs;p6E0Fi-G%cRK)Dxy<(K5Yg+GJeYroCiq zhfTYlJ3Yzu30h&?${oG!YITV?R6RYO+V!UC>8Ua-3iLnXjrU<^aXV_u>Ur7W-qOg; zt*cAgb^r8L**nbsKK7$O$kD}N#lc#?^PfWt|H}WD|0BJlBsThu8^b%5`utAoulrxn zTZ$g7>t3n2cc#*2lhR}~O=xk4Im%U#-<2BB*FkChhy_0owv(m2WDxGxu`m3l-%_d zN(fd1Xkj=k>_?OyTpUvOt9}`WwMoA{BaLI4^t72%M;r}U?NmF5%ZRBsG)*jD4_J)K~ew;*Sjp`WsEuHmc#$p$u z&yA*d`U`#Ts~ARE7CP+PoJ1-1*cVXY%p~F|4=QcZET#S7t*y`1`HrO1RVVE+4(8HJ z^oB8KEWJo|zH4LYV~X7{ff&m%FK20e{fbo$vLe-HqkBAg=!~x>k0ul6ed_zk1o{)x zW?xG_eV1sF&oPN651~CicQKWO(`sMGT$&U{dySJz$VU~vwrc9bW86l3!q>Kp9%p*j zxU!tSM<4k%ub^4cOx?cUucZ*CgTAxtX$yr#cVlXhsM~mCBmF@PzST@=HcsB*Ti!}{ zS*Y5#bqkHM(|q6I@6wBj)ZnZ58O_6N`wqTLv)GpXF7ahw|Iew4U|abLZQ-y(pAsMZ zOj`B*^_Rr#2xf>6`L4W1zZinb`;L(}jOvUz?~#E?x%eI}C3@I!chN7Pz1Bt3FwFc9 zsEVoH*!>|rV{5uh?DwUfr1vZixj~C9N}K7sa*BQ!O2>TL|40{za(qwxiMq&fda>gD zKUMsSQFM+5xNxzr_&lw(xNH_YK=ZK|xhqr+n>dporg)f#}^gJ zSQd7}SLWiUoQ}+q%xCkND~&TFcv4skvQzN1M6NRuQ}{{h_3cgJNmfT?8gmcg>fep? z>72#Rd|%i|ev3G2o$rGT{u5D+abOhxjbolMp1YeL1bzQ~H~%4&wMOIDIeZU~ZZt;Z za-7kd!z1~=K<0j)-e@e&<%ejA;m_p~n(d>pJjzPFM&<-grzT_O1Wv-B>L&0iD{kP~ z`#HtRsnNch-{Otz`t$Wq2f|CKwyS)}p^idU7!7U$W5B1uSWudYGZ_!IBR>q3UxKF8v&bicyTBw+>@`r@ zNdxzQIpB}LTu_EH7JLEuJPof=((wc+UIr(EN5T6{=7TcN4}kALUtscE;Je6A20sL+ zfMQn&N(WQHkD#9ho&%?YpMyo9{ED@pqb1r9rM^T#DHLBC4GVZw?8TobK8;k3RD?t? zD(*K9F5t-{>L9K}szj1z=mW){y{GsR7Fq5*BV-{jpczK>LN2efZeu=yI6{h4h}DAo zLF&?0g*$`0YswUEw<~2)70}6@V#xB#4!2m@w8;%8vY0mG!b9y=$OoUrYhQSOoDFiP z;abG;8PdcGG)JasGuE&bO^AL|xYcSC*_gSAOPt~bX?FV%F*Wut;&i82g=j+~rSl5o zG#V@rl|$2R$~Z+1)5MRUJVXl(O))zP*KoT{*{LNYV4!FsqmswCrCJnBF~&d>(ON`A zh&ikn&1Q3$`dBm(YU<-4+f6xM(==DW$$ga^pCEoGYEe;PW^ocshlp&PM6vUUZHh-| zmI_(%Ta7D&HBvQ;HNvcsriFxr2Wq4)=6H|zH%3z`27Smc2MtD=rn#EMGSVE@Sd77C z>c?r8xmYr)0KJXZtbyL#kn>>UguWY2PQWxonDRtzU|^^z-v?QySZwmOxR5v(G8IPW zVnn@eqZ=-{rD!tDVokFta4Al#;A$bJZwy@W?^HY$Bgrw{o2EVRKs;=czpJp$BO-D| zZxmKx$~^F_1h@Kb)3g+FW}tXY6;BFGz$|TUU_jEtY%Me}prxobN1Hu+nCZn_c#&Yr z^Rzj0SXq@cJs&nv=EPKJvt~t`@&Zgoj43a~M8=x3M8R?BUVfFD#bdFU4K2oS;!L9| ztc-Y5UIKrInQ}F3#+&0g0zGbr|!Cvb2 zky82Xif@A#@YMEEh$i_yvTOOCfZ#9{VJ0I?Mw)b)j4~M$q$NeuzlVmf+5#P*!yiAV z_@;7d7oImj7_Xi#1Nv5OaX1**)+l&C=m`CNo0rBv(>CsiN&$cLNNED=%wL)>!VKMc# zAUV|J&>&s$K@O!`K?jEg^N!&r#{_9h50X41g96_ZWN4Pj(E*BM(dhUl;$Asdm4Oc90{NS$5WJVsTDr_oc%1f(G>kw~WzJYS@_j?nw23lv=rDU1Xv?`X zfWMh`M@*hDc?tB0=b6$#$l5yC(Qss;vCQ1nBw1gt?r)xuihhrnbwvQ)~yO}q>|y^6R7+_0K>Ip}C0UIAv- z6F&@gfh)mE=pO;AA18hkJOS2%2i6eRf#<(N{Fs`IicmZ*1y2yygGFEi*oBdO8_Y+= zxrpn9H)ZOS+JMD49^8EpBR0-2$N9Ow6~}z2hQe&-99er7b$qU@J&W3hyc0YDMt~Qg zj}$#9Cz~Thvg9l(73I-j1N3qlxrTf!n2&rMcxIlgZHww!EYE;NZLK0a0~VE0g@;H^ zhixn5VZgqR0tI#%H^T5DA!cNLuF9~phL>hpq%9Pq5}>ayQ{&v#4%3FbpKvCxCv`PXrS@XfO%FR&+ER zJcJ6#U>h760oI{GIdk}7C&!0aj7W|SZge0=h0_?R?CAN>KLlPw2TLW7`pdwBs9ysX zz*B`S;8R*63}Qq9wG$2DOd|5w=>W1xmNPqmfSP{5JRi#z9e>5m502X zdyat8P{ZY5Lu){3=L$YraFR1-s~n1zngKp+WY%%H=W~c(BE4(AR!Hsq8^PK_sa*h~ zR^ay`Y~`>uFrbtRhekpu9)%6+E9k}O(nb99gGC;WBeTd73gm@EBtyY{MRQ z=>c>mL1(Z)0?(j#5_|?bkN}jP9&|#2P{78>ejEpG@mJ!I6>mu*ODqbs4f(OJ$r6%= z;59>RBrFZe5}F3@*(qxdcW^HRx%Gu_ zOJGu}=&%GPoC1C=n<9=6UI|c2wH%cIg@2=dB>_sQYp+Rw!cp>72~bL9yeR<+anLUT zN~xwdB)%x+|E0ti=s|hCYl8#wZc>fcbnn5uj5ciczFL)IE+<0At8F@4=0HF+l`{+#HPZTLC-tr0blHf5Lt zRz2UxH!^GDEoyN73v%nVQb#GYx*9GOtW^)%MX12)T eVcz+ENaW7{VD>~0kmWAN3q#Yj;g)+hI{z0Q^9|Pk delta 7880 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 diff --git a/bundles/extension/inc/platform_api.h b/bundles/extension/inc/platform_api.h index 82abb7536..f670fd75a 100644 --- a/bundles/extension/inc/platform_api.h +++ b/bundles/extension/inc/platform_api.h @@ -761,7 +761,7 @@ void platform_delete_timer(f_platform_timer_callback callback); * the generic OS interface. * * @param[in] id task identifier - * @param[in] start start address of the new stack + * @param[in] start start (lowest) address of the new stack * @param[in] size size of the new stack in bytes **************************************************************************************** */ @@ -845,6 +845,21 @@ typedef struct platform_hci_link_layer_interf */ const platform_hci_link_layer_interf_t *platform_get_link_layer_interf(void); +typedef void (*f_platform_function)(void *user_data); + +/** + **************************************************************************************** + * @brief Call a function on a separate dedicated stack + * + * @param[in] f the function to be called + * @param[in] user_data user data passed to `f` + * @param[in] start start (lowest) address of the dedicated stack + * @param[in] size size of the dedicated stack in bytes + **************************************************************************************** + */ +void platform_call_on_stack(f_platform_function f, void *user_data, + void *stack_start, uint32_t stack_size); + #ifdef __cplusplus } #endif diff --git a/bundles/mass_conn/ING9168xx/apis.json b/bundles/mass_conn/ING9168xx/apis.json index b3025e2e2..9d3d0054b 100644 --- a/bundles/mass_conn/ING9168xx/apis.json +++ b/bundles/mass_conn/ING9168xx/apis.json @@ -1,345 +1,346 @@ { - "att_dispatch_client_can_send_now": "0x0200446d", - "att_dispatch_client_request_can_send_now_event": "0x02004473", - "att_dispatch_register_client": "0x02004479", - "att_dispatch_register_server": "0x0200448d", - "att_dispatch_server_can_send_now": "0x020044a1", - "att_dispatch_server_request_can_send_now_event": "0x020044a7", - "att_emit_general_event": "0x02004559", - "att_server_can_send_packet_now": "0x02004c91", - "att_server_deferred_read_response": "0x02004c95", - "att_server_get_mtu": "0x02004cad", - "att_server_indicate": "0x02004d25", - "att_server_init": "0x02004da9", - "att_server_notify": "0x02004de5", - "att_server_register_packet_handler": "0x02004efd", - "att_server_request_can_send_now_event": "0x02004f09", - "att_set_db": "0x02004f25", - "att_set_read_callback": "0x02004f39", - "att_set_write_callback": "0x02004f45", - "bd_addr_cmp": "0x02005119", - "bd_addr_copy": "0x0200511f", - "bd_addr_to_str": "0x02005129", - "big_endian_read_16": "0x02005161", - "big_endian_read_32": "0x02005169", - "big_endian_store_16": "0x0200517d", - "big_endian_store_32": "0x02005189", - "btstack_config": "0x020052e9", - "btstack_memory_pool_create": "0x02005427", - "btstack_memory_pool_free": "0x02005451", - "btstack_memory_pool_get": "0x020054b1", - "btstack_push_user_msg": "0x02005519", - "btstack_push_user_runnable": "0x02005525", - "btstack_reset": "0x02005531", - "char_for_nibble": "0x02005823", - "eTaskConfirmSleepModeStatus": "0x02005bd5", - "gap_add_dev_to_periodic_list": "0x02006245", - "gap_add_whitelist": "0x02006255", - "gap_aes_encrypt": "0x02006261", - "gap_clear_white_lists": "0x02006299", - "gap_clr_adv_set": "0x020062a5", - "gap_clr_periodic_adv_list": "0x020062b1", - "gap_create_connection_cancel": "0x020062bd", - "gap_default_periodic_adv_sync_transfer_param": "0x020062c9", - "gap_disconnect": "0x020062e1", - "gap_disconnect_all": "0x0200630d", - "gap_ext_create_connection": "0x0200634d", - "gap_get_connection_parameter_range": "0x02006425", - "gap_le_read_channel_map": "0x02006461", - "gap_periodic_adv_create_sync": "0x020064cd", - "gap_periodic_adv_create_sync_cancel": "0x020064f1", - "gap_periodic_adv_set_info_transfer": "0x020064fd", - "gap_periodic_adv_sync_transfer": "0x0200650d", - "gap_periodic_adv_sync_transfer_param": "0x0200651d", - "gap_periodic_adv_term_sync": "0x02006539", - "gap_read_antenna_info": "0x020065c1", - "gap_read_periodic_adv_list_size": "0x020065cd", - "gap_read_phy": "0x020065d9", - "gap_read_remote_used_features": "0x020065e5", - "gap_read_remote_version": "0x020065f1", - "gap_read_rssi": "0x020065fd", - "gap_remove_whitelist": "0x02006609", - "gap_rmv_adv_set": "0x02006685", - "gap_rmv_dev_from_periodic_list": "0x02006691", - "gap_rx_test_v2": "0x020066a1", - "gap_rx_test_v3": "0x020066b1", - "gap_set_adv_set_random_addr": "0x020066fd", - "gap_set_callback_for_next_hci": "0x02006739", - "gap_set_connection_cte_request_enable": "0x02006759", - "gap_set_connection_cte_response_enable": "0x02006775", - "gap_set_connection_cte_rx_param": "0x02006785", - "gap_set_connection_cte_tx_param": "0x020067d9", - "gap_set_connection_parameter_range": "0x02006825", - "gap_set_connectionless_cte_tx_enable": "0x0200683d", - "gap_set_connectionless_cte_tx_param": "0x0200684d", - "gap_set_connectionless_iq_sampling_enable": "0x020068a9", - "gap_set_data_length": "0x02006905", - "gap_set_def_phy": "0x0200691d", - "gap_set_ext_adv_data": "0x0200692d", - "gap_set_ext_adv_enable": "0x02006945", - "gap_set_ext_adv_para": "0x020069b5", - "gap_set_ext_scan_enable": "0x02006a85", - "gap_set_ext_scan_para": "0x02006a9d", - "gap_set_ext_scan_response_data": "0x02006b3d", - "gap_set_host_channel_classification": "0x02006b55", - "gap_set_periodic_adv_data": "0x02006b65", - "gap_set_periodic_adv_enable": "0x02006bd5", - "gap_set_periodic_adv_para": "0x02006be5", - "gap_set_periodic_adv_rx_enable": "0x02006bfd", - "gap_set_phy": "0x02006c0d", - "gap_set_random_device_address": "0x02006c29", - "gap_start_ccm": "0x02006c59", - "gap_test_end": "0x02006ca1", - "gap_tx_test_v2": "0x02006cad", - "gap_tx_test_v4": "0x02006cc5", - "gap_update_connection_parameters": "0x02006ce9", - "gap_vendor_tx_continuous_wave": "0x02006d2d", - "gatt_client_cancel_write": "0x02007255", - "gatt_client_discover_characteristic_descriptors": "0x0200727b", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x020072bb", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x0200730b", - "gatt_client_discover_characteristics_for_service": "0x0200735b", - "gatt_client_discover_primary_services": "0x02007391", - "gatt_client_discover_primary_services_by_uuid128": "0x020073c3", - "gatt_client_discover_primary_services_by_uuid16": "0x02007407", - "gatt_client_execute_write": "0x02007445", - "gatt_client_find_included_services_for_service": "0x0200746b", - "gatt_client_get_mtu": "0x02007499", - "gatt_client_is_ready": "0x0200755d", - "gatt_client_listen_for_characteristic_value_updates": "0x02007573", - "gatt_client_prepare_write": "0x02007595", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x020075d1", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x020075fb", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x02007601", - "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x0200762f", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x02007635", - "gatt_client_read_multiple_characteristic_values": "0x02007663", - "gatt_client_read_value_of_characteristic_using_value_handle": "0x02007693", - "gatt_client_read_value_of_characteristics_by_uuid128": "0x020076c1", - "gatt_client_read_value_of_characteristics_by_uuid16": "0x0200770d", - "gatt_client_register_handler": "0x02007759", - "gatt_client_reliable_write_long_value_of_characteristic": "0x02007765", - "gatt_client_signed_write_without_response": "0x02007b99", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x02007c5d", - "gatt_client_write_client_characteristic_configuration": "0x02007c97", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x02007ce9", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x02007cf9", - "gatt_client_write_long_value_of_characteristic": "0x02007d35", - "gatt_client_write_long_value_of_characteristic_with_offset": "0x02007d45", - "gatt_client_write_value_of_characteristic": "0x02007d81", - "gatt_client_write_value_of_characteristic_without_response": "0x02007db7", - "hci_add_event_handler": "0x020093ad", - "hci_power_control": "0x02009b55", - "hci_register_acl_packet_handler": "0x02009d09", - "kv_commit": "0x0200a43d", - "kv_get": "0x0200a499", - "kv_init": "0x0200a4a5", - "kv_init_backend": "0x0200a525", - "kv_put": "0x0200a539", - "kv_remove": "0x0200a545", - "kv_remove_all": "0x0200a579", - "kv_value_modified": "0x0200a5a9", - "kv_value_modified_of_key": "0x0200a5c5", - "kv_visit": "0x0200a5d1", - "l2cap_add_event_handler": "0x0200a661", - "l2cap_can_send_packet_now": "0x0200a671", - "l2cap_create_le_credit_based_connection_request": "0x0200a835", - "l2cap_credit_based_send": "0x0200a97d", - "l2cap_credit_based_send_continue": "0x0200a9a9", - "l2cap_disconnect": "0x0200aa25", - "l2cap_get_le_credit_based_connection_credits": "0x0200ac11", - "l2cap_get_peer_mtu_for_local_cid": "0x0200ac2d", - "l2cap_init": "0x0200b06d", - "l2cap_le_send_flow_control_credit": "0x0200b163", - "l2cap_max_le_mtu": "0x0200b471", - "l2cap_register_packet_handler": "0x0200b599", - "l2cap_register_service": "0x0200b5a5", - "l2cap_request_can_send_now_event": "0x0200b6b5", - "l2cap_request_connection_parameter_update": "0x0200b6cf", - "l2cap_send_echo_request": "0x0200bbb1", - "l2cap_unregister_service": "0x0200bc91", - "le_device_db_add": "0x0200bce9", - "le_device_db_find": "0x0200bdc1", - "le_device_db_from_key": "0x0200bded", - "le_device_db_iter_cur": "0x0200bdf5", - "le_device_db_iter_cur_key": "0x0200bdf9", - "le_device_db_iter_init": "0x0200bdfd", - "le_device_db_iter_next": "0x0200be05", - "le_device_db_remove_key": "0x0200be2b", - "ll_adjust_conn_peer_tx_power": "0x0200be59", - "ll_aes_encrypt": "0x0200be85", - "ll_config": "0x0200bef9", - "ll_free": "0x0200bf2f", - "ll_get_heap_free_size": "0x0200bf39", - "ll_hint_on_ce_len": "0x0200bf4d", - "ll_legacy_adv_set_interval": "0x0200bf85", - "ll_malloc": "0x0200bf95", - "ll_register_hci_acl_previewer": "0x0200c0ad", - "ll_scan_set_fixed_channel": "0x0200c111", - "ll_set_adv_access_address": "0x0200c329", - "ll_set_adv_coded_scheme": "0x0200c335", - "ll_set_conn_acl_report_latency": "0x0200c36d", - "ll_set_conn_coded_scheme": "0x0200c39d", - "ll_set_conn_latency": "0x0200c3c9", - "ll_set_conn_tx_power": "0x0200c3f9", - "ll_set_def_antenna": "0x0200c435", - "ll_set_initiating_coded_scheme": "0x0200c455", - "ll_set_max_conn_number": "0x0200c461", - "ll_set_tx_power_range": "0x0200c4f5", - "nibble_for_char": "0x0201ef75", - "platform_32k_rc_auto_tune": "0x0201f021", - "platform_32k_rc_tune": "0x0201f06d", - "platform_calibrate_32k": "0x0201f089", - "platform_config": "0x0201f08d", - "platform_delete_timer": "0x0201f1b5", - "platform_enable_irq": "0x0201f1bd", - "platform_get_current_task": "0x0201f1f1", - "platform_get_gen_os_driver": "0x0201f215", - "platform_get_heap_status": "0x0201f21d", - "platform_get_link_layer_interf": "0x0201f235", - "platform_get_task_handle": "0x0201f23d", - "platform_get_timer_counter": "0x0201f25d", - "platform_get_us_time": "0x0201f261", - "platform_get_version": "0x0201f265", - "platform_hrng": "0x0201f26d", - "platform_install_isr_stack": "0x0201f275", - "platform_install_task_stack": "0x0201f281", - "platform_patch_rf_init_data": "0x0201f2b9", - "platform_printf": "0x0201f2c5", - "platform_raise_assertion": "0x0201f2d9", - "platform_rand": "0x0201f2ed", - "platform_read_info": "0x0201f2f1", - "platform_read_persistent_reg": "0x0201f321", - "platform_reset": "0x0201f32d", - "platform_set_abs_timer": "0x0201f341", - "platform_set_evt_callback": "0x0201f345", - "platform_set_evt_callback_table": "0x0201f359", - "platform_set_irq_callback": "0x0201f365", - "platform_set_irq_callback_table": "0x0201f381", - "platform_set_rf_clk_source": "0x0201f38d", - "platform_set_rf_init_data": "0x0201f399", - "platform_set_rf_power_mapping": "0x0201f3a5", - "platform_set_timer": "0x0201f3b1", - "platform_shutdown": "0x0201f3b5", - "platform_switch_app": "0x0201f3b9", - "platform_trace_raw": "0x0201f3d1", - "platform_write_persistent_reg": "0x0201f3e9", - "printf_hexdump": "0x0201f5a1", - "pvPortMalloc": "0x02020079", - "pvTaskIncrementMutexHeldCount": "0x02020161", - "pvTimerGetTimerID": "0x02020179", - "pxPortInitialiseStack": "0x020201a5", - "reverse_128": "0x0202038d", - "reverse_24": "0x02020393", - "reverse_256": "0x02020399", - "reverse_48": "0x0202039f", - "reverse_56": "0x020203a5", - "reverse_64": "0x020203ab", - "reverse_bd_addr": "0x020203b1", - "reverse_bytes": "0x020203b7", - "sm_add_event_handler": "0x02020715", - "sm_address_resolution_lookup": "0x0202086d", - "sm_authenticated": "0x02020be9", - "sm_authorization_decline": "0x02020bf7", - "sm_authorization_grant": "0x02020c17", - "sm_authorization_state": "0x02020c37", - "sm_bonding_decline": "0x02020c51", - "sm_config": "0x020210a5", - "sm_config_conn": "0x020210bd", - "sm_encryption_key_size": "0x02021273", - "sm_just_works_confirm": "0x020217f9", - "sm_le_device_key": "0x02021b45", - "sm_passkey_input": "0x02021bdb", - "sm_private_random_address_generation_get": "0x02021f95", - "sm_private_random_address_generation_get_mode": "0x02021f9d", - "sm_private_random_address_generation_set_mode": "0x02021fa9", - "sm_private_random_address_generation_set_update_period": "0x02021fd1", - "sm_register_external_ltk_callback": "0x0202210d", - "sm_register_oob_data_callback": "0x02022119", - "sm_request_pairing": "0x02022125", - "sm_send_security_request": "0x02022bfb", - "sm_set_accepted_stk_generation_methods": "0x02022c21", - "sm_set_authentication_requirements": "0x02022c2d", - "sm_set_encryption_key_size_range": "0x02022c39", - "sscanf_bd_addr": "0x02022f99", - "sysSetPublicDeviceAddr": "0x02023449", - "uuid128_to_str": "0x02023c91", - "uuid_add_bluetooth_prefix": "0x02023ce9", - "uuid_has_bluetooth_prefix": "0x02023d09", - "uxListRemove": "0x02023d25", - "uxQueueMessagesWaiting": "0x02023d4d", - "uxQueueMessagesWaitingFromISR": "0x02023d75", - "uxQueueSpacesAvailable": "0x02023d91", - "uxTaskGetStackHighWaterMark": "0x02023dbd", - "uxTaskPriorityGet": "0x02023ddd", - "uxTaskPriorityGetFromISR": "0x02023df9", - "vListInitialise": "0x02023eb7", - "vListInitialiseItem": "0x02023ecd", - "vListInsert": "0x02023ed3", - "vListInsertEnd": "0x02023f03", - "vPortEndScheduler": "0x02023f1d", - "vPortEnterCritical": "0x02023f49", - "vPortExitCritical": "0x02023f8d", - "vPortFree": "0x02023fc1", - "vPortSuppressTicksAndSleep": "0x02024065", - "vPortValidateInterruptPriority": "0x0202418d", - "vQueueDelete": "0x020241e9", - "vQueueWaitForMessageRestricted": "0x02024215", - "vTaskDelay": "0x02024259", - "vTaskInternalSetTimeOutState": "0x020242a5", - "vTaskMissedYield": "0x020242b5", - "vTaskPlaceOnEventList": "0x020242c1", - "vTaskPlaceOnEventListRestricted": "0x020242f9", - "vTaskPriorityDisinheritAfterTimeout": "0x02024339", - "vTaskPrioritySet": "0x020243e5", - "vTaskResume": "0x020244ad", - "vTaskStartScheduler": "0x02024531", - "vTaskStepTick": "0x020245c1", - "vTaskSuspend": "0x020245f1", - "vTaskSuspendAll": "0x020246ad", - "vTaskSwitchContext": "0x020246bd", - "xPortStartScheduler": "0x02024765", - "xQueueAddToSet": "0x02024869", - "xQueueCreateCountingSemaphore": "0x0202488d", - "xQueueCreateCountingSemaphoreStatic": "0x020248c9", - "xQueueCreateMutex": "0x0202490d", - "xQueueCreateMutexStatic": "0x02024923", - "xQueueCreateSet": "0x0202493d", - "xQueueGenericCreate": "0x02024945", - "xQueueGenericCreateStatic": "0x02024991", - "xQueueGenericReset": "0x020249f9", - "xQueueGenericSend": "0x02024a85", - "xQueueGenericSendFromISR": "0x02024bf1", - "xQueueGiveFromISR": "0x02024cb1", - "xQueueGiveMutexRecursive": "0x02024d55", - "xQueueIsQueueEmptyFromISR": "0x02024d95", - "xQueueIsQueueFullFromISR": "0x02024db9", - "xQueuePeek": "0x02024de1", - "xQueuePeekFromISR": "0x02024f09", - "xQueueReceive": "0x02024f75", - "xQueueReceiveFromISR": "0x020250a1", - "xQueueRemoveFromSet": "0x02025135", - "xQueueSelectFromSet": "0x02025157", - "xQueueSelectFromSetFromISR": "0x02025169", - "xQueueSemaphoreTake": "0x0202517d", - "xQueueTakeMutexRecursive": "0x020252e9", - "xTaskCheckForTimeOut": "0x0202532d", - "xTaskCreate": "0x0202539d", - "xTaskCreateStatic": "0x020253f9", - "xTaskGetCurrentTaskHandle": "0x02025469", - "xTaskGetSchedulerState": "0x02025475", - "xTaskGetTickCount": "0x02025491", - "xTaskGetTickCountFromISR": "0x0202549d", - "xTaskIncrementTick": "0x020254ad", - "xTaskPriorityDisinherit": "0x02025579", - "xTaskPriorityInherit": "0x0202560d", - "xTaskRemoveFromEventList": "0x020256a1", - "xTaskResumeAll": "0x02025721", - "xTaskResumeFromISR": "0x020257e9", - "xTimerCreate": "0x02025875", - "xTimerCreateStatic": "0x020258a9", - "xTimerCreateTimerTask": "0x020258e1", - "xTimerGenericCommand": "0x0202594d", - "xTimerGetExpiryTime": "0x020259bd", - "xTimerGetTimerDaemonTaskHandle": "0x020259dd" + "att_dispatch_client_can_send_now": "0x020044b5", + "att_dispatch_client_request_can_send_now_event": "0x020044bb", + "att_dispatch_register_client": "0x020044c1", + "att_dispatch_register_server": "0x020044d5", + "att_dispatch_server_can_send_now": "0x020044e9", + "att_dispatch_server_request_can_send_now_event": "0x020044ef", + "att_emit_general_event": "0x020045a1", + "att_server_can_send_packet_now": "0x02004cd9", + "att_server_deferred_read_response": "0x02004cdd", + "att_server_get_mtu": "0x02004cf5", + "att_server_indicate": "0x02004d6d", + "att_server_init": "0x02004df1", + "att_server_notify": "0x02004e2d", + "att_server_register_packet_handler": "0x02004f45", + "att_server_request_can_send_now_event": "0x02004f51", + "att_set_db": "0x02004f6d", + "att_set_read_callback": "0x02004f81", + "att_set_write_callback": "0x02004f8d", + "bd_addr_cmp": "0x02005161", + "bd_addr_copy": "0x02005167", + "bd_addr_to_str": "0x02005171", + "big_endian_read_16": "0x020051a9", + "big_endian_read_32": "0x020051b1", + "big_endian_store_16": "0x020051c5", + "big_endian_store_32": "0x020051d1", + "btstack_config": "0x02005331", + "btstack_memory_pool_create": "0x0200546f", + "btstack_memory_pool_free": "0x02005499", + "btstack_memory_pool_get": "0x020054f9", + "btstack_push_user_msg": "0x02005561", + "btstack_push_user_runnable": "0x0200556d", + "btstack_reset": "0x02005579", + "char_for_nibble": "0x0200586b", + "eTaskConfirmSleepModeStatus": "0x02005c1d", + "gap_add_dev_to_periodic_list": "0x0200628d", + "gap_add_whitelist": "0x0200629d", + "gap_aes_encrypt": "0x020062a9", + "gap_clear_white_lists": "0x020062e1", + "gap_clr_adv_set": "0x020062ed", + "gap_clr_periodic_adv_list": "0x020062f9", + "gap_create_connection_cancel": "0x02006305", + "gap_default_periodic_adv_sync_transfer_param": "0x02006311", + "gap_disconnect": "0x02006329", + "gap_disconnect_all": "0x02006355", + "gap_ext_create_connection": "0x02006395", + "gap_get_connection_parameter_range": "0x0200646d", + "gap_le_read_channel_map": "0x020064a9", + "gap_periodic_adv_create_sync": "0x02006515", + "gap_periodic_adv_create_sync_cancel": "0x02006539", + "gap_periodic_adv_set_info_transfer": "0x02006545", + "gap_periodic_adv_sync_transfer": "0x02006555", + "gap_periodic_adv_sync_transfer_param": "0x02006565", + "gap_periodic_adv_term_sync": "0x02006581", + "gap_read_antenna_info": "0x02006609", + "gap_read_periodic_adv_list_size": "0x02006615", + "gap_read_phy": "0x02006621", + "gap_read_remote_used_features": "0x0200662d", + "gap_read_remote_version": "0x02006639", + "gap_read_rssi": "0x02006645", + "gap_remove_whitelist": "0x02006651", + "gap_rmv_adv_set": "0x020066cd", + "gap_rmv_dev_from_periodic_list": "0x020066d9", + "gap_rx_test_v2": "0x020066e9", + "gap_rx_test_v3": "0x020066f9", + "gap_set_adv_set_random_addr": "0x02006745", + "gap_set_callback_for_next_hci": "0x02006781", + "gap_set_connection_cte_request_enable": "0x020067a1", + "gap_set_connection_cte_response_enable": "0x020067bd", + "gap_set_connection_cte_rx_param": "0x020067cd", + "gap_set_connection_cte_tx_param": "0x02006821", + "gap_set_connection_parameter_range": "0x0200686d", + "gap_set_connectionless_cte_tx_enable": "0x02006885", + "gap_set_connectionless_cte_tx_param": "0x02006895", + "gap_set_connectionless_iq_sampling_enable": "0x020068f1", + "gap_set_data_length": "0x0200694d", + "gap_set_def_phy": "0x02006965", + "gap_set_ext_adv_data": "0x02006975", + "gap_set_ext_adv_enable": "0x0200698d", + "gap_set_ext_adv_para": "0x020069fd", + "gap_set_ext_scan_enable": "0x02006acd", + "gap_set_ext_scan_para": "0x02006ae5", + "gap_set_ext_scan_response_data": "0x02006b85", + "gap_set_host_channel_classification": "0x02006b9d", + "gap_set_periodic_adv_data": "0x02006bad", + "gap_set_periodic_adv_enable": "0x02006c1d", + "gap_set_periodic_adv_para": "0x02006c2d", + "gap_set_periodic_adv_rx_enable": "0x02006c45", + "gap_set_phy": "0x02006c55", + "gap_set_random_device_address": "0x02006c71", + "gap_start_ccm": "0x02006ca1", + "gap_test_end": "0x02006ce9", + "gap_tx_test_v2": "0x02006cf5", + "gap_tx_test_v4": "0x02006d0d", + "gap_update_connection_parameters": "0x02006d31", + "gap_vendor_tx_continuous_wave": "0x02006d75", + "gatt_client_cancel_write": "0x0200729d", + "gatt_client_discover_characteristic_descriptors": "0x020072c3", + "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x02007303", + "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x02007353", + "gatt_client_discover_characteristics_for_service": "0x020073a3", + "gatt_client_discover_primary_services": "0x020073d9", + "gatt_client_discover_primary_services_by_uuid128": "0x0200740b", + "gatt_client_discover_primary_services_by_uuid16": "0x0200744f", + "gatt_client_execute_write": "0x0200748d", + "gatt_client_find_included_services_for_service": "0x020074b3", + "gatt_client_get_mtu": "0x020074e1", + "gatt_client_is_ready": "0x020075a5", + "gatt_client_listen_for_characteristic_value_updates": "0x020075bb", + "gatt_client_prepare_write": "0x020075dd", + "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x02007619", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x02007643", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x02007649", + "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x02007677", + "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x0200767d", + "gatt_client_read_multiple_characteristic_values": "0x020076ab", + "gatt_client_read_value_of_characteristic_using_value_handle": "0x020076db", + "gatt_client_read_value_of_characteristics_by_uuid128": "0x02007709", + "gatt_client_read_value_of_characteristics_by_uuid16": "0x02007755", + "gatt_client_register_handler": "0x020077a1", + "gatt_client_reliable_write_long_value_of_characteristic": "0x020077ad", + "gatt_client_signed_write_without_response": "0x02007be1", + "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x02007ca5", + "gatt_client_write_client_characteristic_configuration": "0x02007cdf", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x02007d31", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x02007d41", + "gatt_client_write_long_value_of_characteristic": "0x02007d7d", + "gatt_client_write_long_value_of_characteristic_with_offset": "0x02007d8d", + "gatt_client_write_value_of_characteristic": "0x02007dc9", + "gatt_client_write_value_of_characteristic_without_response": "0x02007dff", + "hci_add_event_handler": "0x020093f5", + "hci_power_control": "0x02009b9d", + "hci_register_acl_packet_handler": "0x02009d51", + "kv_commit": "0x0200a485", + "kv_get": "0x0200a4e1", + "kv_init": "0x0200a4ed", + "kv_init_backend": "0x0200a56d", + "kv_put": "0x0200a581", + "kv_remove": "0x0200a58d", + "kv_remove_all": "0x0200a5c1", + "kv_value_modified": "0x0200a5f1", + "kv_value_modified_of_key": "0x0200a60d", + "kv_visit": "0x0200a619", + "l2cap_add_event_handler": "0x0200a6a9", + "l2cap_can_send_packet_now": "0x0200a6b9", + "l2cap_create_le_credit_based_connection_request": "0x0200a87d", + "l2cap_credit_based_send": "0x0200a9c5", + "l2cap_credit_based_send_continue": "0x0200a9f1", + "l2cap_disconnect": "0x0200aa6d", + "l2cap_get_le_credit_based_connection_credits": "0x0200ac59", + "l2cap_get_peer_mtu_for_local_cid": "0x0200ac75", + "l2cap_init": "0x0200b0b5", + "l2cap_le_send_flow_control_credit": "0x0200b1ab", + "l2cap_max_le_mtu": "0x0200b4b9", + "l2cap_register_packet_handler": "0x0200b5e1", + "l2cap_register_service": "0x0200b5ed", + "l2cap_request_can_send_now_event": "0x0200b6fd", + "l2cap_request_connection_parameter_update": "0x0200b717", + "l2cap_send_echo_request": "0x0200bbf9", + "l2cap_unregister_service": "0x0200bcd9", + "le_device_db_add": "0x0200bd31", + "le_device_db_find": "0x0200be09", + "le_device_db_from_key": "0x0200be35", + "le_device_db_iter_cur": "0x0200be3d", + "le_device_db_iter_cur_key": "0x0200be41", + "le_device_db_iter_init": "0x0200be45", + "le_device_db_iter_next": "0x0200be4d", + "le_device_db_remove_key": "0x0200be73", + "ll_adjust_conn_peer_tx_power": "0x0200bea1", + "ll_aes_encrypt": "0x0200becd", + "ll_config": "0x0200bf41", + "ll_free": "0x0200bf77", + "ll_get_heap_free_size": "0x0200bf81", + "ll_hint_on_ce_len": "0x0200bf95", + "ll_legacy_adv_set_interval": "0x0200bfcd", + "ll_malloc": "0x0200bfdd", + "ll_register_hci_acl_previewer": "0x0200c0f5", + "ll_scan_set_fixed_channel": "0x0200c159", + "ll_set_adv_access_address": "0x0200c371", + "ll_set_adv_coded_scheme": "0x0200c37d", + "ll_set_conn_acl_report_latency": "0x0200c3b5", + "ll_set_conn_coded_scheme": "0x0200c3e5", + "ll_set_conn_latency": "0x0200c411", + "ll_set_conn_tx_power": "0x0200c441", + "ll_set_def_antenna": "0x0200c47d", + "ll_set_initiating_coded_scheme": "0x0200c49d", + "ll_set_max_conn_number": "0x0200c4a9", + "ll_set_tx_power_range": "0x0200c53d", + "nibble_for_char": "0x0201efbd", + "platform_32k_rc_auto_tune": "0x0201f069", + "platform_32k_rc_tune": "0x0201f0b5", + "platform_calibrate_32k": "0x0201f0d1", + "platform_call_on_stack": "0x020021fb", + "platform_config": "0x0201f0d5", + "platform_delete_timer": "0x0201f1fd", + "platform_enable_irq": "0x0201f205", + "platform_get_current_task": "0x0201f239", + "platform_get_gen_os_driver": "0x0201f25d", + "platform_get_heap_status": "0x0201f265", + "platform_get_link_layer_interf": "0x0201f27d", + "platform_get_task_handle": "0x0201f285", + "platform_get_timer_counter": "0x0201f2a5", + "platform_get_us_time": "0x0201f2a9", + "platform_get_version": "0x0201f2ad", + "platform_hrng": "0x0201f2b5", + "platform_install_isr_stack": "0x0201f2bd", + "platform_install_task_stack": "0x0201f2c9", + "platform_patch_rf_init_data": "0x0201f301", + "platform_printf": "0x0201f30d", + "platform_raise_assertion": "0x0201f321", + "platform_rand": "0x0201f335", + "platform_read_info": "0x0201f339", + "platform_read_persistent_reg": "0x0201f369", + "platform_reset": "0x0201f375", + "platform_set_abs_timer": "0x0201f389", + "platform_set_evt_callback": "0x0201f38d", + "platform_set_evt_callback_table": "0x0201f3a1", + "platform_set_irq_callback": "0x0201f3ad", + "platform_set_irq_callback_table": "0x0201f3c9", + "platform_set_rf_clk_source": "0x0201f3d5", + "platform_set_rf_init_data": "0x0201f3e1", + "platform_set_rf_power_mapping": "0x0201f3ed", + "platform_set_timer": "0x0201f3f9", + "platform_shutdown": "0x0201f3fd", + "platform_switch_app": "0x0201f401", + "platform_trace_raw": "0x0201f419", + "platform_write_persistent_reg": "0x0201f431", + "printf_hexdump": "0x0201f5e9", + "pvPortMalloc": "0x020200c1", + "pvTaskIncrementMutexHeldCount": "0x020201a9", + "pvTimerGetTimerID": "0x020201c1", + "pxPortInitialiseStack": "0x020201ed", + "reverse_128": "0x020203d5", + "reverse_24": "0x020203db", + "reverse_256": "0x020203e1", + "reverse_48": "0x020203e7", + "reverse_56": "0x020203ed", + "reverse_64": "0x020203f3", + "reverse_bd_addr": "0x020203f9", + "reverse_bytes": "0x020203ff", + "sm_add_event_handler": "0x0202075d", + "sm_address_resolution_lookup": "0x020208b5", + "sm_authenticated": "0x02020c31", + "sm_authorization_decline": "0x02020c3f", + "sm_authorization_grant": "0x02020c5f", + "sm_authorization_state": "0x02020c7f", + "sm_bonding_decline": "0x02020c99", + "sm_config": "0x020210ed", + "sm_config_conn": "0x02021105", + "sm_encryption_key_size": "0x020212bb", + "sm_just_works_confirm": "0x02021841", + "sm_le_device_key": "0x02021b8d", + "sm_passkey_input": "0x02021c23", + "sm_private_random_address_generation_get": "0x02021fdd", + "sm_private_random_address_generation_get_mode": "0x02021fe5", + "sm_private_random_address_generation_set_mode": "0x02021ff1", + "sm_private_random_address_generation_set_update_period": "0x02022019", + "sm_register_external_ltk_callback": "0x02022155", + "sm_register_oob_data_callback": "0x02022161", + "sm_request_pairing": "0x0202216d", + "sm_send_security_request": "0x02022c43", + "sm_set_accepted_stk_generation_methods": "0x02022c69", + "sm_set_authentication_requirements": "0x02022c75", + "sm_set_encryption_key_size_range": "0x02022c81", + "sscanf_bd_addr": "0x02022fe1", + "sysSetPublicDeviceAddr": "0x02023491", + "uuid128_to_str": "0x02023cd9", + "uuid_add_bluetooth_prefix": "0x02023d31", + "uuid_has_bluetooth_prefix": "0x02023d51", + "uxListRemove": "0x02023d6d", + "uxQueueMessagesWaiting": "0x02023d95", + "uxQueueMessagesWaitingFromISR": "0x02023dbd", + "uxQueueSpacesAvailable": "0x02023dd9", + "uxTaskGetStackHighWaterMark": "0x02023e05", + "uxTaskPriorityGet": "0x02023e25", + "uxTaskPriorityGetFromISR": "0x02023e41", + "vListInitialise": "0x02023eff", + "vListInitialiseItem": "0x02023f15", + "vListInsert": "0x02023f1b", + "vListInsertEnd": "0x02023f4b", + "vPortEndScheduler": "0x02023f65", + "vPortEnterCritical": "0x02023f91", + "vPortExitCritical": "0x02023fd5", + "vPortFree": "0x02024009", + "vPortSuppressTicksAndSleep": "0x020240ad", + "vPortValidateInterruptPriority": "0x020241d5", + "vQueueDelete": "0x02024231", + "vQueueWaitForMessageRestricted": "0x0202425d", + "vTaskDelay": "0x020242a1", + "vTaskInternalSetTimeOutState": "0x020242ed", + "vTaskMissedYield": "0x020242fd", + "vTaskPlaceOnEventList": "0x02024309", + "vTaskPlaceOnEventListRestricted": "0x02024341", + "vTaskPriorityDisinheritAfterTimeout": "0x02024381", + "vTaskPrioritySet": "0x0202442d", + "vTaskResume": "0x020244f5", + "vTaskStartScheduler": "0x02024579", + "vTaskStepTick": "0x02024609", + "vTaskSuspend": "0x02024639", + "vTaskSuspendAll": "0x020246f5", + "vTaskSwitchContext": "0x02024705", + "xPortStartScheduler": "0x020247ad", + "xQueueAddToSet": "0x020248b1", + "xQueueCreateCountingSemaphore": "0x020248d5", + "xQueueCreateCountingSemaphoreStatic": "0x02024911", + "xQueueCreateMutex": "0x02024955", + "xQueueCreateMutexStatic": "0x0202496b", + "xQueueCreateSet": "0x02024985", + "xQueueGenericCreate": "0x0202498d", + "xQueueGenericCreateStatic": "0x020249d9", + "xQueueGenericReset": "0x02024a41", + "xQueueGenericSend": "0x02024acd", + "xQueueGenericSendFromISR": "0x02024c39", + "xQueueGiveFromISR": "0x02024cf9", + "xQueueGiveMutexRecursive": "0x02024d9d", + "xQueueIsQueueEmptyFromISR": "0x02024ddd", + "xQueueIsQueueFullFromISR": "0x02024e01", + "xQueuePeek": "0x02024e29", + "xQueuePeekFromISR": "0x02024f51", + "xQueueReceive": "0x02024fbd", + "xQueueReceiveFromISR": "0x020250e9", + "xQueueRemoveFromSet": "0x0202517d", + "xQueueSelectFromSet": "0x0202519f", + "xQueueSelectFromSetFromISR": "0x020251b1", + "xQueueSemaphoreTake": "0x020251c5", + "xQueueTakeMutexRecursive": "0x02025331", + "xTaskCheckForTimeOut": "0x02025375", + "xTaskCreate": "0x020253e5", + "xTaskCreateStatic": "0x02025441", + "xTaskGetCurrentTaskHandle": "0x020254b1", + "xTaskGetSchedulerState": "0x020254bd", + "xTaskGetTickCount": "0x020254d9", + "xTaskGetTickCountFromISR": "0x020254e5", + "xTaskIncrementTick": "0x020254f5", + "xTaskPriorityDisinherit": "0x020255c1", + "xTaskPriorityInherit": "0x02025655", + "xTaskRemoveFromEventList": "0x020256e9", + "xTaskResumeAll": "0x02025769", + "xTaskResumeFromISR": "0x02025831", + "xTimerCreate": "0x020258bd", + "xTimerCreateStatic": "0x020258f1", + "xTimerCreateTimerTask": "0x02025929", + "xTimerGenericCommand": "0x02025995", + "xTimerGetExpiryTime": "0x02025a05", + "xTimerGetTimerDaemonTaskHandle": "0x02025a25" } \ No newline at end of file diff --git a/bundles/mass_conn/ING9168xx/meta.json b/bundles/mass_conn/ING9168xx/meta.json index 94f31a4b2..a572225d2 100644 --- a/bundles/mass_conn/ING9168xx/meta.json +++ b/bundles/mass_conn/ING9168xx/meta.json @@ -8,11 +8,11 @@ }, "rom": { "base": 33562624, - "size": 155068 + "size": 155136 }, "version": [ 2, 2, - 50 + 52 ] } \ No newline at end of file diff --git a/bundles/mass_conn/ING9168xx/platform.bin b/bundles/mass_conn/ING9168xx/platform.bin index bd2b355f5b255960c83d0999a1ee4cef1c80e50c..629897a385cfa8a4af9817c98e8adf44588b23cf 100644 GIT binary patch delta 7906 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 ael$8WlmqP{gJc^0)UX825@Q;@-v6JuUNepW delta 7626 zcmaKx4_sAMw#WBc_Ye0X{}B)nJcw9mlqjg6D4_gPP*E^JF-UD7#k5F6#4C=@=rqoV zM?2ZeUi8PwUiKN@jczz)Ia7UPs`=ndroG8hr)IK=Ld(WKq3^fOJvhz#%;)j>Y`<%- zz4qQ~ud~nE`&>7_>VEY%ZjbUP?ZimMp~;Fi_&rM|-@b-v_yEg5o69 zrK}yVIQ2Hgu_*6B{~F36l;8}-XU8cn8LN0(8uTb)UxRx2c;(>^bS!|f55}iaG9jm+ z^uXXjuoIo7LnY)DD0#3?M@d2%fPF05-6(aaQ@Y{{kdLAqM+rwg2_+pRPh`tkVHU<` z70Kh(X68>WhxMxdi&s>!D%!7yQwkrA&?nO_YSw#bJSlx9H}OE2ewg#28sPQe4ONPZ z7bvZB5vClac)xd>t%Yc+PL2sFQy*YMPV5)a?((*BWM}XWN$-oWB_I9twYBKZ_C3{X7eo7f97zOw`=GvA$+-6|9Ipk zdP%QIp6+<2nc3y-NWO!j`%18ilHyu>5*G*b-~Y<1N@;y1-oK7I;B@SIhBee4XP za_@=TVu;*&U)ltBbAjSxu&eQ=-tJ|7f4%qPaTo2*%hk+h7V95mZlN7|)x-z*a<%sl z6OY&e8xg5B*a{~uc^}FC*cn~1fw_1_Np``)f;ko0DdWaJq}1hV{bzaE(*NzerIezl zc2<3U?T-4k+BHQm-!gM#ur!nDmFw_iy>n)yjPv%))oIF__-HpKh8$TKSm-x= zrMnc1`e*&u-81#Ng81MHX#EzCcZcaa3VuX2`h|kXN@Xpl3L|BR4VJS2@;I5noVv7o zv)Gt&VR!CLIk)@N%`vmP`yu-Sn9;52RfR1{Z@}`Oeth+c_Ah?^^_5lnrNU&|sK*w~ z&X$Ef3VYQ_8Y3QUKZuWQR%HF7%fsrAE?3%M%m_BySD0~nq9`tW6eb@GK;b^m$aJ{=e4?)hapH;iLe!CgsfA)z*AG_XOyqLeQ*1syQP7RU)yJue9 zHF9tT+~4`SQV;!LP2B(7>)Z9UB{B4zzN2I%zp_OCuB6%_OL_4~;EJC7j1`oY=vWu5wgwhY=csJpt9?w^*6xj+B9>oui%e_)pdyQzA4 zX*})H8%yJ(WyZ@Aelu_l*2dDGC@lTAp5 zX^(ej*$|g|ph@u=ymKYqj>;)c?wRZTc<~rJ{oL!Wy=J3auVeXr_TV>{F)v@vymbZh z9=)yp>3`LD(;Fgfv`Q~n^~%S8mc<3HMNb_!T=^f3p%`9^MYyD#LhQWk#|Atv&a%98A?9P42R{i`N?$0@_ ziq{l9j!o--VZXKF>VIL^rE{+fn-v>Uie#7DTgI4=!e+kTP3nzrHiubFt6Rp%1dp}6 zESSG>wcxiK%~?ZQ{mX1kycvLF%gg{&x0*#TPt!KS| z%96nP-dcA(*O%103d1CQT=$qkSh{&mgv3?W@axN)tTlL#Y~IZ@LNEXEU-(3|K5^>- zD%DSK{js~@8O5Jt6SR99wyk&asTS|Kho7*=_F@~Y8o#V=jh3c8&{Ws7LQ8p2PTp1e zzFiBPYhT2<_^kKhuBU8tt9S37*BwOO%Ex|cqcr{W{<)4dh+&&I{fWphet)I6@Wp#v z{Ox_-7hnD&h+gpS``tTuRY#ygbSbr7cvRT!6;KA{TV z2^)>IQKgRp=x+hhVK9GdH1V3bO4~k9X&)Tf@r$07zUv|MRWP}XzTxyM8e{BDpr;w? z>_mE-sKFqOA}Q5~(#XSaX}(7^nntwEcOr@Y%#`Zu97PWkAFJ_A8%>FUj(W0HY)d>=eU2Zl)R zO$X>eAcA0w?xaT~7)Ls3De;>tjYKa!FAcxmsjI@@wDRMM&Iw~1|O~Ref1`-vqdC)L0nO( zG%B%as=v4U!!La6j?o69F5iV7inlwC;(l__7ybwOMqXvZ*-Hl;mD$X9`8s=P5>c#i z{y5F15k}@8X)Mh&>i$S0$ZoX#5nEw|ukKIM@8s9Mg(qkv6Zx7?(qb3)UiW?Q2~A^a z_eGt<6XuI6eUE%ftKAgqb9_ZD?!X-p%u&OcFNFDi_79p!+`rNH+sm{i*d0EE`KZR6 zXOua4ihBjBxp)^g8|_Z^P`xiafT!5qd2Zx2WaC9fi$)8mla}qd?&sY2IP2kmbO80%3#3SsK<-3x?tsMIN_d&%}pVyz8N42N_ z(eB%JE8hsSoxVZFPqX-~=t?JZ8sgdY7_O)&!5xaPJZapW&13S;eoLHriFhqa6iOHB zvr*bm%25Uo+f2}n(u|CFbUIEKl$|K)1$do}_p-Ugb1SZS^EIUwfeXNKU;p+rbH_7lRq#WN@yg;?y1pEl{ih zM}YFj=&;#1JB6pD%6tiS_|d{_3-UK_1Q((180yzMG|XodOyv=tTBsvX6-I)~!J*(P zFbb4mqAkXNYfv8s%3rLeR1@lP;6^YW6nhPnaYllh!ExYLFddZTj0d-)o~hwGM<$*K z#V&9X_#`;lViqWIo(et(eU8Ox;0vfv2VVknL9xpNWrBS0Rp@7cZ-O(ycfkTs{t7j} zqeU75^FA7ip?JT=Se?V8qq3gDCke_S?47+R<&evagE>4sp&Mcs%0UzvXaDPpC!plO ztiy0j<2&gEqh=b7yaLEI9_#hnr6B z&*hj{@jFh7hzPWr<6$~PWaB+F=e&dFM9o$yJN_(Wc{2hb%b$jsgRO2!n#~?!$s;wV zGsqkwDUV}3;_w}sQbRGR{Efp5VU}sSX0wg5);S)F3b*tVG~4_ku-%I(Gc>z7eFx-B z*aSnL1$iRk5@N}dv>P`eLw6Joqz(jUN({E_x#`A2B?M;fnC=Z?#N|A*Y(n zYx8-E8GyOkd~-oE!#pj(T#ygl%C&j(hFM&eb+;dx8#Q~=5SN?C~ihWg4M7=v)dCbxkalqBOy`Qh(Y7v zu{@hrEiiDBHNhq=C}@ObPv0jdCRuv^-rD`q7QKU>$YsagFMA@bhcHW z<)@?6BpmUmZI(w#7H5bIlyA5pW!inhSK+b2Z#CV?%@{i z@Y9j(CwWHs1s>yPz*vj7nUqj1!^BsS&?Tf-Rf5TD_Ozg~U2w?m7&-|QyAjwM*U=tj z)iV(hdFB`7QP^X(9K4&?aem$jUW0ul9>Fz_qs0vERTXJIvumy>?Vvefv{}E34*q8u zsWrq;n2NiYw3IYweXRpzl#c~O~1#v#xR{afEE zmNTODf-=vCBv6uk8uW4q?EFTt8~}M>DA@L)GPC^gFYx|LS}*@fv1GBVFY&u8cmkB{ zwezp|4HiuOn?epIwcJ#WSRS35g$kE1tMO>gN;}g6(H; zTLC|G5f_1}<%CaUI6RN=t0pPW(fPO$Lnv54Tne7Q8{c_g*)rle;8}1k*pBvjU>{fx zrq>eB2Rp$9;AhM683Z=h5m$m$7-u2aUPF8*cpTqhi@-kESAje3BCb~CQGE~=L-83r zTLN~#p&GDl5%E&6vWoaFZ~&|YcP=EZ0}oXa-wl?bz6?AKE(gz65U&7B(0&h?x|sM! zVBHepdhk#+af9gL*u82TsU9?}grW=`SAnmA^O47Qd?uk&YHb*C26%oq@vHY3e<Y?v6dT5#A=7x&*qx4%o|Gt_%~%J#GLF$fe>!7O`9?(m^@M#LG(IsFYu~rN^EUL%T{jDRy>+k9IsVySf6(K%Hhg`hzk~rg32| z$9tOa1rdOuUI5=jc@AF_Hsw$^ZYWjPE=km(*5g?D2yGZgHJ-rT4qG+|H(-(F&6e*A zkxL+pk;w9<$KZY_vb^lUI6Xv`7oKoph>VxsbF(6E{$OW$``x&>i;-l2L0PiEU}wn$ zgR*1;r_*mQ8DVf7$qIvgB{K}e)l$Zk?BJJ?j3q_jN@zAnniw1usp6(A*ryVVK&0&@OY1SF6qUN zuOE>m#SBg&X=YHCR5Ju$3u1Hc4`j(WgMB6Ih>h%wSp4*bSyU@1JH!3F>=@kaeCnW9Q(1u+k*!8HS z9UT78NZLVqdrH!dQaw*g)=(-K?FgDWZ%Ecq>O(jnpBSC{C1J9PmZmAi7=vyugHyTC;MUnF3nlu@&Q zL&LvZi{CrUy8j=$uXO?6a932cnxWC&z(UTAQT!_EkhPEIDYYj<@qfD_rthY>=ZSh9 z!%OkAZN!a;+{Di}GM}=?_1fb;wO4->mTIs5(ms1@%kb1usX=kajNTfKPHbvq-hIp& Zc5xN6C-Mf_Mn4&vtPQt~-XPE5e*vPg>SF)^ diff --git a/bundles/mass_conn/inc/platform_api.h b/bundles/mass_conn/inc/platform_api.h index 82abb7536..f670fd75a 100644 --- a/bundles/mass_conn/inc/platform_api.h +++ b/bundles/mass_conn/inc/platform_api.h @@ -761,7 +761,7 @@ void platform_delete_timer(f_platform_timer_callback callback); * the generic OS interface. * * @param[in] id task identifier - * @param[in] start start address of the new stack + * @param[in] start start (lowest) address of the new stack * @param[in] size size of the new stack in bytes **************************************************************************************** */ @@ -845,6 +845,21 @@ typedef struct platform_hci_link_layer_interf */ const platform_hci_link_layer_interf_t *platform_get_link_layer_interf(void); +typedef void (*f_platform_function)(void *user_data); + +/** + **************************************************************************************** + * @brief Call a function on a separate dedicated stack + * + * @param[in] f the function to be called + * @param[in] user_data user data passed to `f` + * @param[in] start start (lowest) address of the dedicated stack + * @param[in] size size of the dedicated stack in bytes + **************************************************************************************** + */ +void platform_call_on_stack(f_platform_function f, void *user_data, + void *stack_start, uint32_t stack_size); + #ifdef __cplusplus } #endif diff --git a/bundles/mini/ING9168xx/apis.json b/bundles/mini/ING9168xx/apis.json index 241533188..0109526db 100644 --- a/bundles/mini/ING9168xx/apis.json +++ b/bundles/mini/ING9168xx/apis.json @@ -1,345 +1,346 @@ { - "att_dispatch_client_can_send_now": "0x02004299", - "att_dispatch_client_request_can_send_now_event": "0x0200429f", - "att_dispatch_register_client": "0x020042a5", - "att_dispatch_register_server": "0x020042b9", - "att_dispatch_server_can_send_now": "0x020042cd", - "att_dispatch_server_request_can_send_now_event": "0x020042d3", - "att_emit_general_event": "0x02004385", - "att_server_can_send_packet_now": "0x02004ab9", - "att_server_deferred_read_response": "0x02004abd", - "att_server_get_mtu": "0x02004ad5", - "att_server_indicate": "0x02004b41", - "att_server_init": "0x02004bc5", - "att_server_notify": "0x02004c01", - "att_server_register_packet_handler": "0x02004d19", - "att_server_request_can_send_now_event": "0x02004d25", - "att_set_db": "0x02004d41", - "att_set_read_callback": "0x02004d55", - "att_set_write_callback": "0x02004d61", - "bd_addr_cmp": "0x02004f35", - "bd_addr_copy": "0x02004f3b", - "bd_addr_to_str": "0x02004f45", - "big_endian_read_16": "0x02004f7d", - "big_endian_read_32": "0x02004f85", - "big_endian_store_16": "0x02004f99", - "big_endian_store_32": "0x02004fa5", - "btstack_config": "0x02004fd1", - "btstack_memory_pool_create": "0x0200510f", - "btstack_memory_pool_free": "0x02005139", - "btstack_memory_pool_get": "0x02005199", - "btstack_push_user_msg": "0x02005201", - "btstack_push_user_runnable": "0x0200520d", - "btstack_reset": "0x02005219", - "char_for_nibble": "0x0200543f", - "eTaskConfirmSleepModeStatus": "0x02005781", - "gap_add_dev_to_periodic_list": "0x02005df1", - "gap_add_whitelist": "0x02005e01", - "gap_aes_encrypt": "0x02005e0d", - "gap_clear_white_lists": "0x02005e45", - "gap_clr_adv_set": "0x02005e51", - "gap_clr_periodic_adv_list": "0x02005e5d", - "gap_create_connection_cancel": "0x02005e69", - "gap_default_periodic_adv_sync_transfer_param": "0x02005e75", - "gap_disconnect": "0x02005e8d", - "gap_disconnect_all": "0x02005eb9", - "gap_ext_create_connection": "0x02005ef9", - "gap_get_connection_parameter_range": "0x02005fd1", - "gap_le_read_channel_map": "0x02006009", - "gap_periodic_adv_create_sync": "0x02006075", - "gap_periodic_adv_create_sync_cancel": "0x02006099", - "gap_periodic_adv_set_info_transfer": "0x020060a5", - "gap_periodic_adv_sync_transfer": "0x020060b5", - "gap_periodic_adv_sync_transfer_param": "0x020060c5", - "gap_periodic_adv_term_sync": "0x020060e1", - "gap_read_antenna_info": "0x02006169", - "gap_read_periodic_adv_list_size": "0x02006175", - "gap_read_phy": "0x02006181", - "gap_read_remote_used_features": "0x0200618d", - "gap_read_remote_version": "0x02006199", - "gap_read_rssi": "0x020061a5", - "gap_remove_whitelist": "0x020061b1", - "gap_rmv_adv_set": "0x0200622d", - "gap_rmv_dev_from_periodic_list": "0x02006239", - "gap_rx_test_v2": "0x02006249", - "gap_rx_test_v3": "0x02006259", - "gap_set_adv_set_random_addr": "0x020062a5", - "gap_set_callback_for_next_hci": "0x020062e1", - "gap_set_connection_cte_request_enable": "0x02006301", - "gap_set_connection_cte_response_enable": "0x0200631d", - "gap_set_connection_cte_rx_param": "0x0200632d", - "gap_set_connection_cte_tx_param": "0x02006381", - "gap_set_connection_parameter_range": "0x020063cd", - "gap_set_connectionless_cte_tx_enable": "0x020063e5", - "gap_set_connectionless_cte_tx_param": "0x020063f5", - "gap_set_connectionless_iq_sampling_enable": "0x02006451", - "gap_set_data_length": "0x020064ad", - "gap_set_def_phy": "0x020064c5", - "gap_set_ext_adv_data": "0x020064d5", - "gap_set_ext_adv_enable": "0x020064ed", - "gap_set_ext_adv_para": "0x0200655d", - "gap_set_ext_scan_enable": "0x0200662d", - "gap_set_ext_scan_para": "0x02006645", - "gap_set_ext_scan_response_data": "0x020066e5", - "gap_set_host_channel_classification": "0x020066fd", - "gap_set_periodic_adv_data": "0x0200670d", - "gap_set_periodic_adv_enable": "0x0200677d", - "gap_set_periodic_adv_para": "0x0200678d", - "gap_set_periodic_adv_rx_enable": "0x020067a5", - "gap_set_phy": "0x020067b5", - "gap_set_random_device_address": "0x020067d1", - "gap_start_ccm": "0x02006801", - "gap_test_end": "0x02006849", - "gap_tx_test_v2": "0x02006855", - "gap_tx_test_v4": "0x0200686d", - "gap_update_connection_parameters": "0x02006891", - "gap_vendor_tx_continuous_wave": "0x020068d1", - "gatt_client_cancel_write": "0x02006df9", - "gatt_client_discover_characteristic_descriptors": "0x02006e1f", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x02006e5f", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x02006eaf", - "gatt_client_discover_characteristics_for_service": "0x02006eff", - "gatt_client_discover_primary_services": "0x02006f35", - "gatt_client_discover_primary_services_by_uuid128": "0x02006f67", - "gatt_client_discover_primary_services_by_uuid16": "0x02006fab", - "gatt_client_execute_write": "0x02006fe9", - "gatt_client_find_included_services_for_service": "0x0200700f", - "gatt_client_get_mtu": "0x0200703d", - "gatt_client_is_ready": "0x02007101", - "gatt_client_listen_for_characteristic_value_updates": "0x02007117", - "gatt_client_prepare_write": "0x02007137", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x02007173", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x0200719d", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x020071a3", - "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x020071d1", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x020071d7", - "gatt_client_read_multiple_characteristic_values": "0x02007205", - "gatt_client_read_value_of_characteristic_using_value_handle": "0x02007235", - "gatt_client_read_value_of_characteristics_by_uuid128": "0x02007263", - "gatt_client_read_value_of_characteristics_by_uuid16": "0x020072af", - "gatt_client_register_handler": "0x020072f9", - "gatt_client_reliable_write_long_value_of_characteristic": "0x02007305", - "gatt_client_signed_write_without_response": "0x0200770d", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x020077d1", - "gatt_client_write_client_characteristic_configuration": "0x0200780b", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x0200785d", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x0200786d", - "gatt_client_write_long_value_of_characteristic": "0x020078a9", - "gatt_client_write_long_value_of_characteristic_with_offset": "0x020078b9", - "gatt_client_write_value_of_characteristic": "0x020078f5", - "gatt_client_write_value_of_characteristic_without_response": "0x0200792b", - "hci_add_event_handler": "0x02008f05", - "hci_power_control": "0x02009699", - "hci_register_acl_packet_handler": "0x0200984d", - "kv_commit": "0x02009ea9", - "kv_get": "0x02009f05", - "kv_init": "0x02009f11", - "kv_init_backend": "0x02009f8d", - "kv_put": "0x02009fa1", - "kv_remove": "0x02009fad", - "kv_remove_all": "0x02009fe1", - "kv_value_modified": "0x0200a011", - "kv_value_modified_of_key": "0x0200a02d", - "kv_visit": "0x0200a039", - "l2cap_add_event_handler": "0x0200a0c9", - "l2cap_can_send_packet_now": "0x0200a0d9", - "l2cap_create_le_credit_based_connection_request": "0x0200a29d", - "l2cap_credit_based_send": "0x0200a3e5", - "l2cap_credit_based_send_continue": "0x0200a411", - "l2cap_disconnect": "0x0200a48d", - "l2cap_get_le_credit_based_connection_credits": "0x0200a679", - "l2cap_get_peer_mtu_for_local_cid": "0x0200a695", - "l2cap_init": "0x0200aad5", - "l2cap_le_send_flow_control_credit": "0x0200abcb", - "l2cap_max_le_mtu": "0x0200aed9", - "l2cap_register_packet_handler": "0x0200b001", - "l2cap_register_service": "0x0200b00d", - "l2cap_request_can_send_now_event": "0x0200b11d", - "l2cap_request_connection_parameter_update": "0x0200b137", - "l2cap_send_echo_request": "0x0200b619", - "l2cap_unregister_service": "0x0200b6f9", - "le_device_db_add": "0x0200b751", - "le_device_db_find": "0x0200b819", - "le_device_db_from_key": "0x0200b845", - "le_device_db_iter_cur": "0x0200b84d", - "le_device_db_iter_cur_key": "0x0200b851", - "le_device_db_iter_init": "0x0200b855", - "le_device_db_iter_next": "0x0200b85d", - "le_device_db_remove_key": "0x0200b883", - "ll_adjust_conn_peer_tx_power": "0x0200b8b1", - "ll_aes_encrypt": "0x0200b8d9", - "ll_config": "0x0200b94d", - "ll_free": "0x0200b983", - "ll_get_heap_free_size": "0x0200b98d", - "ll_hint_on_ce_len": "0x0200b9a1", - "ll_legacy_adv_set_interval": "0x0200b9d9", - "ll_malloc": "0x0200b9e9", - "ll_register_hci_acl_previewer": "0x0200bb01", - "ll_scan_set_fixed_channel": "0x0200bb65", - "ll_set_adv_access_address": "0x0200bd7d", - "ll_set_adv_coded_scheme": "0x0200bd89", - "ll_set_conn_acl_report_latency": "0x0200bdb9", - "ll_set_conn_coded_scheme": "0x0200bde5", - "ll_set_conn_latency": "0x0200be0d", - "ll_set_conn_tx_power": "0x0200be39", - "ll_set_def_antenna": "0x0200be71", - "ll_set_initiating_coded_scheme": "0x0200be91", - "ll_set_max_conn_number": "0x0200be9d", - "ll_set_tx_power_range": "0x0200bf31", - "nibble_for_char": "0x0201c085", - "platform_32k_rc_auto_tune": "0x0201c10d", - "platform_32k_rc_tune": "0x0201c159", - "platform_calibrate_32k": "0x0201c175", - "platform_config": "0x0201c179", - "platform_delete_timer": "0x0201c2a1", - "platform_enable_irq": "0x0201c2a9", - "platform_get_current_task": "0x0201c2fd", - "platform_get_gen_os_driver": "0x0201c321", - "platform_get_heap_status": "0x0201c329", - "platform_get_link_layer_interf": "0x0201c341", - "platform_get_task_handle": "0x0201c349", - "platform_get_timer_counter": "0x0201c369", - "platform_get_us_time": "0x0201c36d", - "platform_get_version": "0x0201c371", - "platform_hrng": "0x0201c379", - "platform_install_isr_stack": "0x0201c381", - "platform_install_task_stack": "0x0201c38d", - "platform_patch_rf_init_data": "0x0201c3c5", - "platform_printf": "0x0201c3d1", - "platform_raise_assertion": "0x0201c3e5", - "platform_rand": "0x0201c3f9", - "platform_read_info": "0x0201c3fd", - "platform_read_persistent_reg": "0x0201c42d", - "platform_reset": "0x0201c439", - "platform_set_abs_timer": "0x0201c44d", - "platform_set_evt_callback": "0x0201c451", - "platform_set_evt_callback_table": "0x0201c465", - "platform_set_irq_callback": "0x0201c471", - "platform_set_irq_callback_table": "0x0201c48d", - "platform_set_rf_clk_source": "0x0201c499", - "platform_set_rf_init_data": "0x0201c4a5", - "platform_set_rf_power_mapping": "0x0201c4b1", - "platform_set_timer": "0x0201c4bd", - "platform_shutdown": "0x0201c4c1", - "platform_switch_app": "0x0201c4c5", - "platform_trace_raw": "0x0201c4dd", - "platform_write_persistent_reg": "0x0201c4f5", - "printf_hexdump": "0x0201c6ad", - "pvPortMalloc": "0x0201d0e1", - "pvTaskIncrementMutexHeldCount": "0x0201d1c9", - "pvTimerGetTimerID": "0x0201d1e1", - "pxPortInitialiseStack": "0x0201d20d", - "reverse_128": "0x0201d3f5", - "reverse_24": "0x0201d3fb", - "reverse_256": "0x0201d401", - "reverse_48": "0x0201d407", - "reverse_56": "0x0201d40d", - "reverse_64": "0x0201d413", - "reverse_bd_addr": "0x0201d419", - "reverse_bytes": "0x0201d41f", - "sm_add_event_handler": "0x0201d725", - "sm_address_resolution_lookup": "0x0201d87d", - "sm_authenticated": "0x0201dbf9", - "sm_authorization_decline": "0x0201dc07", - "sm_authorization_grant": "0x0201dc27", - "sm_authorization_state": "0x0201dc47", - "sm_bonding_decline": "0x0201dc61", - "sm_config": "0x0201e0b5", - "sm_config_conn": "0x0201e0cd", - "sm_encryption_key_size": "0x0201e283", - "sm_just_works_confirm": "0x0201e809", - "sm_le_device_key": "0x0201eb55", - "sm_passkey_input": "0x0201ebeb", - "sm_private_random_address_generation_get": "0x0201efa5", - "sm_private_random_address_generation_get_mode": "0x0201efad", - "sm_private_random_address_generation_set_mode": "0x0201efb9", - "sm_private_random_address_generation_set_update_period": "0x0201efe1", - "sm_register_external_ltk_callback": "0x0201f11d", - "sm_register_oob_data_callback": "0x0201f129", - "sm_request_pairing": "0x0201f135", - "sm_send_security_request": "0x0201fc0b", - "sm_set_accepted_stk_generation_methods": "0x0201fc31", - "sm_set_authentication_requirements": "0x0201fc3d", - "sm_set_encryption_key_size_range": "0x0201fc49", - "sscanf_bd_addr": "0x0201ffa9", - "sysSetPublicDeviceAddr": "0x0202005d", - "uuid128_to_str": "0x02020805", - "uuid_add_bluetooth_prefix": "0x0202085d", - "uuid_has_bluetooth_prefix": "0x0202087d", - "uxListRemove": "0x02020899", - "uxQueueMessagesWaiting": "0x020208c1", - "uxQueueMessagesWaitingFromISR": "0x020208e9", - "uxQueueSpacesAvailable": "0x02020905", - "uxTaskGetStackHighWaterMark": "0x02020931", - "uxTaskPriorityGet": "0x02020951", - "uxTaskPriorityGetFromISR": "0x0202096d", - "vListInitialise": "0x020209d3", - "vListInitialiseItem": "0x020209e9", - "vListInsert": "0x020209ef", - "vListInsertEnd": "0x02020a1f", - "vPortEndScheduler": "0x02020a39", - "vPortEnterCritical": "0x20000339", - "vPortExitCritical": "0x20000373", - "vPortFree": "0x02020a65", - "vPortSuppressTicksAndSleep": "0x2000039f", - "vPortValidateInterruptPriority": "0x02020b09", - "vQueueDelete": "0x02020b65", - "vQueueWaitForMessageRestricted": "0x02020b91", - "vTaskDelay": "0x02020bd5", - "vTaskInternalSetTimeOutState": "0x02020c21", - "vTaskMissedYield": "0x02020c31", - "vTaskPlaceOnEventList": "0x02020c3d", - "vTaskPlaceOnEventListRestricted": "0x02020c75", - "vTaskPriorityDisinheritAfterTimeout": "0x02020cb5", - "vTaskPrioritySet": "0x02020d61", - "vTaskResume": "0x02020e29", - "vTaskStartScheduler": "0x02020ead", - "vTaskStepTick": "0x2000071f", - "vTaskSuspend": "0x02020f3d", - "vTaskSuspendAll": "0x20000693", - "vTaskSwitchContext": "0x02020ff9", - "xPortStartScheduler": "0x0202109d", - "xQueueAddToSet": "0x020211a1", - "xQueueCreateCountingSemaphore": "0x020211c5", - "xQueueCreateCountingSemaphoreStatic": "0x02021201", - "xQueueCreateMutex": "0x02021245", - "xQueueCreateMutexStatic": "0x0202125b", - "xQueueCreateSet": "0x02021275", - "xQueueGenericCreate": "0x0202127d", - "xQueueGenericCreateStatic": "0x020212c9", - "xQueueGenericReset": "0x02021331", - "xQueueGenericSend": "0x020213bd", - "xQueueGenericSendFromISR": "0x02021529", - "xQueueGiveFromISR": "0x020215e9", - "xQueueGiveMutexRecursive": "0x0202168d", - "xQueueIsQueueEmptyFromISR": "0x020216cd", - "xQueueIsQueueFullFromISR": "0x020216f1", - "xQueuePeek": "0x02021719", - "xQueuePeekFromISR": "0x02021841", - "xQueueReceive": "0x020218ad", - "xQueueReceiveFromISR": "0x020219d9", - "xQueueRemoveFromSet": "0x02021a6d", - "xQueueSelectFromSet": "0x02021a8f", - "xQueueSelectFromSetFromISR": "0x02021aa1", - "xQueueSemaphoreTake": "0x02021ab5", - "xQueueTakeMutexRecursive": "0x02021c21", - "xTaskCheckForTimeOut": "0x02021c65", - "xTaskCreate": "0x02021cd5", - "xTaskCreateStatic": "0x02021d31", - "xTaskGetCurrentTaskHandle": "0x02021da1", - "xTaskGetSchedulerState": "0x02021dad", - "xTaskGetTickCount": "0x02021dc9", - "xTaskGetTickCountFromISR": "0x02021dd5", - "xTaskIncrementTick": "0x20000525", - "xTaskPriorityDisinherit": "0x02021de5", - "xTaskPriorityInherit": "0x02021e79", - "xTaskRemoveFromEventList": "0x02021f0d", - "xTaskResumeAll": "0x200005df", - "xTaskResumeFromISR": "0x02021f8d", - "xTimerCreate": "0x02022019", - "xTimerCreateStatic": "0x0202204d", - "xTimerCreateTimerTask": "0x02022085", - "xTimerGenericCommand": "0x020220f1", - "xTimerGetExpiryTime": "0x02022161", - "xTimerGetTimerDaemonTaskHandle": "0x02022181" + "att_dispatch_client_can_send_now": "0x020042e1", + "att_dispatch_client_request_can_send_now_event": "0x020042e7", + "att_dispatch_register_client": "0x020042ed", + "att_dispatch_register_server": "0x02004301", + "att_dispatch_server_can_send_now": "0x02004315", + "att_dispatch_server_request_can_send_now_event": "0x0200431b", + "att_emit_general_event": "0x020043cd", + "att_server_can_send_packet_now": "0x02004b01", + "att_server_deferred_read_response": "0x02004b05", + "att_server_get_mtu": "0x02004b1d", + "att_server_indicate": "0x02004b89", + "att_server_init": "0x02004c0d", + "att_server_notify": "0x02004c49", + "att_server_register_packet_handler": "0x02004d61", + "att_server_request_can_send_now_event": "0x02004d6d", + "att_set_db": "0x02004d89", + "att_set_read_callback": "0x02004d9d", + "att_set_write_callback": "0x02004da9", + "bd_addr_cmp": "0x02004f7d", + "bd_addr_copy": "0x02004f83", + "bd_addr_to_str": "0x02004f8d", + "big_endian_read_16": "0x02004fc5", + "big_endian_read_32": "0x02004fcd", + "big_endian_store_16": "0x02004fe1", + "big_endian_store_32": "0x02004fed", + "btstack_config": "0x02005019", + "btstack_memory_pool_create": "0x02005157", + "btstack_memory_pool_free": "0x02005181", + "btstack_memory_pool_get": "0x020051e1", + "btstack_push_user_msg": "0x02005249", + "btstack_push_user_runnable": "0x02005255", + "btstack_reset": "0x02005261", + "char_for_nibble": "0x02005487", + "eTaskConfirmSleepModeStatus": "0x020057bd", + "gap_add_dev_to_periodic_list": "0x02005e2d", + "gap_add_whitelist": "0x02005e3d", + "gap_aes_encrypt": "0x02005e49", + "gap_clear_white_lists": "0x02005e81", + "gap_clr_adv_set": "0x02005e8d", + "gap_clr_periodic_adv_list": "0x02005e99", + "gap_create_connection_cancel": "0x02005ea5", + "gap_default_periodic_adv_sync_transfer_param": "0x02005eb1", + "gap_disconnect": "0x02005ec9", + "gap_disconnect_all": "0x02005ef5", + "gap_ext_create_connection": "0x02005f35", + "gap_get_connection_parameter_range": "0x0200600d", + "gap_le_read_channel_map": "0x02006045", + "gap_periodic_adv_create_sync": "0x020060b1", + "gap_periodic_adv_create_sync_cancel": "0x020060d5", + "gap_periodic_adv_set_info_transfer": "0x020060e1", + "gap_periodic_adv_sync_transfer": "0x020060f1", + "gap_periodic_adv_sync_transfer_param": "0x02006101", + "gap_periodic_adv_term_sync": "0x0200611d", + "gap_read_antenna_info": "0x020061a5", + "gap_read_periodic_adv_list_size": "0x020061b1", + "gap_read_phy": "0x020061bd", + "gap_read_remote_used_features": "0x020061c9", + "gap_read_remote_version": "0x020061d5", + "gap_read_rssi": "0x020061e1", + "gap_remove_whitelist": "0x020061ed", + "gap_rmv_adv_set": "0x02006269", + "gap_rmv_dev_from_periodic_list": "0x02006275", + "gap_rx_test_v2": "0x02006285", + "gap_rx_test_v3": "0x02006295", + "gap_set_adv_set_random_addr": "0x020062e1", + "gap_set_callback_for_next_hci": "0x0200631d", + "gap_set_connection_cte_request_enable": "0x0200633d", + "gap_set_connection_cte_response_enable": "0x02006359", + "gap_set_connection_cte_rx_param": "0x02006369", + "gap_set_connection_cte_tx_param": "0x020063bd", + "gap_set_connection_parameter_range": "0x02006409", + "gap_set_connectionless_cte_tx_enable": "0x02006421", + "gap_set_connectionless_cte_tx_param": "0x02006431", + "gap_set_connectionless_iq_sampling_enable": "0x0200648d", + "gap_set_data_length": "0x020064e9", + "gap_set_def_phy": "0x02006501", + "gap_set_ext_adv_data": "0x02006511", + "gap_set_ext_adv_enable": "0x02006529", + "gap_set_ext_adv_para": "0x02006599", + "gap_set_ext_scan_enable": "0x02006669", + "gap_set_ext_scan_para": "0x02006681", + "gap_set_ext_scan_response_data": "0x02006721", + "gap_set_host_channel_classification": "0x02006739", + "gap_set_periodic_adv_data": "0x02006749", + "gap_set_periodic_adv_enable": "0x020067b9", + "gap_set_periodic_adv_para": "0x020067c9", + "gap_set_periodic_adv_rx_enable": "0x020067e1", + "gap_set_phy": "0x020067f1", + "gap_set_random_device_address": "0x0200680d", + "gap_start_ccm": "0x0200683d", + "gap_test_end": "0x02006885", + "gap_tx_test_v2": "0x02006891", + "gap_tx_test_v4": "0x020068a9", + "gap_update_connection_parameters": "0x020068cd", + "gap_vendor_tx_continuous_wave": "0x0200690d", + "gatt_client_cancel_write": "0x02006e35", + "gatt_client_discover_characteristic_descriptors": "0x02006e5b", + "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x02006e9b", + "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x02006eeb", + "gatt_client_discover_characteristics_for_service": "0x02006f3b", + "gatt_client_discover_primary_services": "0x02006f71", + "gatt_client_discover_primary_services_by_uuid128": "0x02006fa3", + "gatt_client_discover_primary_services_by_uuid16": "0x02006fe7", + "gatt_client_execute_write": "0x02007025", + "gatt_client_find_included_services_for_service": "0x0200704b", + "gatt_client_get_mtu": "0x02007079", + "gatt_client_is_ready": "0x0200713d", + "gatt_client_listen_for_characteristic_value_updates": "0x02007153", + "gatt_client_prepare_write": "0x02007173", + "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x020071af", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x020071d9", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x020071df", + "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x0200720d", + "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x02007213", + "gatt_client_read_multiple_characteristic_values": "0x02007241", + "gatt_client_read_value_of_characteristic_using_value_handle": "0x02007271", + "gatt_client_read_value_of_characteristics_by_uuid128": "0x0200729f", + "gatt_client_read_value_of_characteristics_by_uuid16": "0x020072eb", + "gatt_client_register_handler": "0x02007335", + "gatt_client_reliable_write_long_value_of_characteristic": "0x02007341", + "gatt_client_signed_write_without_response": "0x02007749", + "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x0200780d", + "gatt_client_write_client_characteristic_configuration": "0x02007847", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x02007899", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x020078a9", + "gatt_client_write_long_value_of_characteristic": "0x020078e5", + "gatt_client_write_long_value_of_characteristic_with_offset": "0x020078f5", + "gatt_client_write_value_of_characteristic": "0x02007931", + "gatt_client_write_value_of_characteristic_without_response": "0x02007967", + "hci_add_event_handler": "0x02008f41", + "hci_power_control": "0x020096d5", + "hci_register_acl_packet_handler": "0x02009889", + "kv_commit": "0x02009ee5", + "kv_get": "0x02009f41", + "kv_init": "0x02009f4d", + "kv_init_backend": "0x02009fc9", + "kv_put": "0x02009fdd", + "kv_remove": "0x02009fe9", + "kv_remove_all": "0x0200a01d", + "kv_value_modified": "0x0200a04d", + "kv_value_modified_of_key": "0x0200a069", + "kv_visit": "0x0200a075", + "l2cap_add_event_handler": "0x0200a105", + "l2cap_can_send_packet_now": "0x0200a115", + "l2cap_create_le_credit_based_connection_request": "0x0200a2d9", + "l2cap_credit_based_send": "0x0200a421", + "l2cap_credit_based_send_continue": "0x0200a44d", + "l2cap_disconnect": "0x0200a4c9", + "l2cap_get_le_credit_based_connection_credits": "0x0200a6b5", + "l2cap_get_peer_mtu_for_local_cid": "0x0200a6d1", + "l2cap_init": "0x0200ab11", + "l2cap_le_send_flow_control_credit": "0x0200ac07", + "l2cap_max_le_mtu": "0x0200af15", + "l2cap_register_packet_handler": "0x0200b03d", + "l2cap_register_service": "0x0200b049", + "l2cap_request_can_send_now_event": "0x0200b159", + "l2cap_request_connection_parameter_update": "0x0200b173", + "l2cap_send_echo_request": "0x0200b655", + "l2cap_unregister_service": "0x0200b735", + "le_device_db_add": "0x0200b78d", + "le_device_db_find": "0x0200b855", + "le_device_db_from_key": "0x0200b881", + "le_device_db_iter_cur": "0x0200b889", + "le_device_db_iter_cur_key": "0x0200b88d", + "le_device_db_iter_init": "0x0200b891", + "le_device_db_iter_next": "0x0200b899", + "le_device_db_remove_key": "0x0200b8bf", + "ll_adjust_conn_peer_tx_power": "0x0200b8ed", + "ll_aes_encrypt": "0x0200b915", + "ll_config": "0x0200b989", + "ll_free": "0x0200b9bf", + "ll_get_heap_free_size": "0x0200b9c9", + "ll_hint_on_ce_len": "0x0200b9dd", + "ll_legacy_adv_set_interval": "0x0200ba15", + "ll_malloc": "0x0200ba25", + "ll_register_hci_acl_previewer": "0x0200bb3d", + "ll_scan_set_fixed_channel": "0x0200bba1", + "ll_set_adv_access_address": "0x0200bdb9", + "ll_set_adv_coded_scheme": "0x0200bdc5", + "ll_set_conn_acl_report_latency": "0x0200bdf5", + "ll_set_conn_coded_scheme": "0x0200be21", + "ll_set_conn_latency": "0x0200be49", + "ll_set_conn_tx_power": "0x0200be75", + "ll_set_def_antenna": "0x0200bead", + "ll_set_initiating_coded_scheme": "0x0200becd", + "ll_set_max_conn_number": "0x0200bed9", + "ll_set_tx_power_range": "0x0200bf6d", + "nibble_for_char": "0x0201c0c1", + "platform_32k_rc_auto_tune": "0x0201c149", + "platform_32k_rc_tune": "0x0201c195", + "platform_calibrate_32k": "0x0201c1b1", + "platform_call_on_stack": "0x020021fb", + "platform_config": "0x0201c1b5", + "platform_delete_timer": "0x0201c2dd", + "platform_enable_irq": "0x0201c2e5", + "platform_get_current_task": "0x0201c339", + "platform_get_gen_os_driver": "0x0201c35d", + "platform_get_heap_status": "0x0201c365", + "platform_get_link_layer_interf": "0x0201c37d", + "platform_get_task_handle": "0x0201c385", + "platform_get_timer_counter": "0x0201c3a5", + "platform_get_us_time": "0x0201c3a9", + "platform_get_version": "0x0201c3ad", + "platform_hrng": "0x0201c3b5", + "platform_install_isr_stack": "0x0201c3bd", + "platform_install_task_stack": "0x0201c3c9", + "platform_patch_rf_init_data": "0x0201c401", + "platform_printf": "0x0201c40d", + "platform_raise_assertion": "0x0201c421", + "platform_rand": "0x0201c435", + "platform_read_info": "0x0201c439", + "platform_read_persistent_reg": "0x0201c469", + "platform_reset": "0x0201c475", + "platform_set_abs_timer": "0x0201c489", + "platform_set_evt_callback": "0x0201c48d", + "platform_set_evt_callback_table": "0x0201c4a1", + "platform_set_irq_callback": "0x0201c4ad", + "platform_set_irq_callback_table": "0x0201c4c9", + "platform_set_rf_clk_source": "0x0201c4d5", + "platform_set_rf_init_data": "0x0201c4e1", + "platform_set_rf_power_mapping": "0x0201c4ed", + "platform_set_timer": "0x0201c4f9", + "platform_shutdown": "0x0201c4fd", + "platform_switch_app": "0x0201c501", + "platform_trace_raw": "0x0201c519", + "platform_write_persistent_reg": "0x0201c531", + "printf_hexdump": "0x0201c6e9", + "pvPortMalloc": "0x0201d11d", + "pvTaskIncrementMutexHeldCount": "0x0201d205", + "pvTimerGetTimerID": "0x0201d21d", + "pxPortInitialiseStack": "0x0201d249", + "reverse_128": "0x0201d431", + "reverse_24": "0x0201d437", + "reverse_256": "0x0201d43d", + "reverse_48": "0x0201d443", + "reverse_56": "0x0201d449", + "reverse_64": "0x0201d44f", + "reverse_bd_addr": "0x0201d455", + "reverse_bytes": "0x0201d45b", + "sm_add_event_handler": "0x0201d761", + "sm_address_resolution_lookup": "0x0201d8b9", + "sm_authenticated": "0x0201dc35", + "sm_authorization_decline": "0x0201dc43", + "sm_authorization_grant": "0x0201dc63", + "sm_authorization_state": "0x0201dc83", + "sm_bonding_decline": "0x0201dc9d", + "sm_config": "0x0201e0f1", + "sm_config_conn": "0x0201e109", + "sm_encryption_key_size": "0x0201e2bf", + "sm_just_works_confirm": "0x0201e845", + "sm_le_device_key": "0x0201eb91", + "sm_passkey_input": "0x0201ec27", + "sm_private_random_address_generation_get": "0x0201efe1", + "sm_private_random_address_generation_get_mode": "0x0201efe9", + "sm_private_random_address_generation_set_mode": "0x0201eff5", + "sm_private_random_address_generation_set_update_period": "0x0201f01d", + "sm_register_external_ltk_callback": "0x0201f159", + "sm_register_oob_data_callback": "0x0201f165", + "sm_request_pairing": "0x0201f171", + "sm_send_security_request": "0x0201fc47", + "sm_set_accepted_stk_generation_methods": "0x0201fc6d", + "sm_set_authentication_requirements": "0x0201fc79", + "sm_set_encryption_key_size_range": "0x0201fc85", + "sscanf_bd_addr": "0x0201ffe5", + "sysSetPublicDeviceAddr": "0x02020099", + "uuid128_to_str": "0x02020841", + "uuid_add_bluetooth_prefix": "0x02020899", + "uuid_has_bluetooth_prefix": "0x020208b9", + "uxListRemove": "0x020208d5", + "uxQueueMessagesWaiting": "0x020208fd", + "uxQueueMessagesWaitingFromISR": "0x02020925", + "uxQueueSpacesAvailable": "0x02020941", + "uxTaskGetStackHighWaterMark": "0x0202096d", + "uxTaskPriorityGet": "0x0202098d", + "uxTaskPriorityGetFromISR": "0x020209a9", + "vListInitialise": "0x02020a0f", + "vListInitialiseItem": "0x02020a25", + "vListInsert": "0x02020a2b", + "vListInsertEnd": "0x02020a5b", + "vPortEndScheduler": "0x02020a75", + "vPortEnterCritical": "0x20000325", + "vPortExitCritical": "0x2000035f", + "vPortFree": "0x02020aa1", + "vPortSuppressTicksAndSleep": "0x2000038b", + "vPortValidateInterruptPriority": "0x02020b45", + "vQueueDelete": "0x02020ba1", + "vQueueWaitForMessageRestricted": "0x02020bcd", + "vTaskDelay": "0x02020c11", + "vTaskInternalSetTimeOutState": "0x02020c5d", + "vTaskMissedYield": "0x02020c6d", + "vTaskPlaceOnEventList": "0x02020c79", + "vTaskPlaceOnEventListRestricted": "0x02020cb1", + "vTaskPriorityDisinheritAfterTimeout": "0x02020cf1", + "vTaskPrioritySet": "0x02020d9d", + "vTaskResume": "0x02020e65", + "vTaskStartScheduler": "0x02020ee9", + "vTaskStepTick": "0x2000070b", + "vTaskSuspend": "0x02020f79", + "vTaskSuspendAll": "0x2000067f", + "vTaskSwitchContext": "0x02021035", + "xPortStartScheduler": "0x020210d9", + "xQueueAddToSet": "0x020211dd", + "xQueueCreateCountingSemaphore": "0x02021201", + "xQueueCreateCountingSemaphoreStatic": "0x0202123d", + "xQueueCreateMutex": "0x02021281", + "xQueueCreateMutexStatic": "0x02021297", + "xQueueCreateSet": "0x020212b1", + "xQueueGenericCreate": "0x020212b9", + "xQueueGenericCreateStatic": "0x02021305", + "xQueueGenericReset": "0x0202136d", + "xQueueGenericSend": "0x020213f9", + "xQueueGenericSendFromISR": "0x02021565", + "xQueueGiveFromISR": "0x02021625", + "xQueueGiveMutexRecursive": "0x020216c9", + "xQueueIsQueueEmptyFromISR": "0x02021709", + "xQueueIsQueueFullFromISR": "0x0202172d", + "xQueuePeek": "0x02021755", + "xQueuePeekFromISR": "0x0202187d", + "xQueueReceive": "0x020218e9", + "xQueueReceiveFromISR": "0x02021a15", + "xQueueRemoveFromSet": "0x02021aa9", + "xQueueSelectFromSet": "0x02021acb", + "xQueueSelectFromSetFromISR": "0x02021add", + "xQueueSemaphoreTake": "0x02021af1", + "xQueueTakeMutexRecursive": "0x02021c5d", + "xTaskCheckForTimeOut": "0x02021ca1", + "xTaskCreate": "0x02021d11", + "xTaskCreateStatic": "0x02021d6d", + "xTaskGetCurrentTaskHandle": "0x02021ddd", + "xTaskGetSchedulerState": "0x02021de9", + "xTaskGetTickCount": "0x02021e05", + "xTaskGetTickCountFromISR": "0x02021e11", + "xTaskIncrementTick": "0x20000511", + "xTaskPriorityDisinherit": "0x02021e21", + "xTaskPriorityInherit": "0x02021eb5", + "xTaskRemoveFromEventList": "0x02021f49", + "xTaskResumeAll": "0x200005cb", + "xTaskResumeFromISR": "0x02021fc9", + "xTimerCreate": "0x02022055", + "xTimerCreateStatic": "0x02022089", + "xTimerCreateTimerTask": "0x020220c1", + "xTimerGenericCommand": "0x0202212d", + "xTimerGetExpiryTime": "0x0202219d", + "xTimerGetTimerDaemonTaskHandle": "0x020221bd" } \ No newline at end of file diff --git a/bundles/mini/ING9168xx/meta.json b/bundles/mini/ING9168xx/meta.json index e6c6f6360..dcdc3f068 100644 --- a/bundles/mini/ING9168xx/meta.json +++ b/bundles/mini/ING9168xx/meta.json @@ -4,15 +4,15 @@ }, "ram": { "base": 536870912, - "size": 29012 + "size": 28988 }, "rom": { "base": 33562624, - "size": 155584 + "size": 155620 }, "version": [ 2, 2, - 51 + 52 ] } \ No newline at end of file diff --git a/bundles/mini/ING9168xx/platform.bin b/bundles/mini/ING9168xx/platform.bin index d161cda1189c8e875fa8ba6d3b2ca16b2f3b9770..9f783c7e27d59085094a9601d2673f56fe7c0f20 100644 GIT binary patch delta 31508 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 z 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 delta 31541 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 Trnxfbd~A-Ip)7croc#X*x)dg4 diff --git a/bundles/mini/inc/platform_api.h b/bundles/mini/inc/platform_api.h index 82abb7536..f670fd75a 100644 --- a/bundles/mini/inc/platform_api.h +++ b/bundles/mini/inc/platform_api.h @@ -761,7 +761,7 @@ void platform_delete_timer(f_platform_timer_callback callback); * the generic OS interface. * * @param[in] id task identifier - * @param[in] start start address of the new stack + * @param[in] start start (lowest) address of the new stack * @param[in] size size of the new stack in bytes **************************************************************************************** */ @@ -845,6 +845,21 @@ typedef struct platform_hci_link_layer_interf */ const platform_hci_link_layer_interf_t *platform_get_link_layer_interf(void); +typedef void (*f_platform_function)(void *user_data); + +/** + **************************************************************************************** + * @brief Call a function on a separate dedicated stack + * + * @param[in] f the function to be called + * @param[in] user_data user data passed to `f` + * @param[in] start start (lowest) address of the dedicated stack + * @param[in] size size of the dedicated stack in bytes + **************************************************************************************** + */ +void platform_call_on_stack(f_platform_function f, void *user_data, + void *stack_start, uint32_t stack_size); + #ifdef __cplusplus } #endif diff --git a/bundles/noos_extension/ING9168xx/apis.json b/bundles/noos_extension/ING9168xx/apis.json index f1fcd570f..358b11211 100644 --- a/bundles/noos_extension/ING9168xx/apis.json +++ b/bundles/noos_extension/ING9168xx/apis.json @@ -1,298 +1,299 @@ { - "att_dispatch_client_can_send_now": "0x02004351", - "att_dispatch_client_request_can_send_now_event": "0x02004357", - "att_dispatch_register_client": "0x0200435d", - "att_dispatch_register_server": "0x02004371", - "att_dispatch_server_can_send_now": "0x02004385", - "att_dispatch_server_request_can_send_now_event": "0x0200438b", - "att_emit_general_event": "0x0200443d", - "att_server_can_send_packet_now": "0x02004b75", - "att_server_deferred_read_response": "0x02004b79", - "att_server_get_mtu": "0x02004b91", - "att_server_indicate": "0x02004c09", - "att_server_init": "0x02004c8d", - "att_server_notify": "0x02004cc9", - "att_server_register_packet_handler": "0x02004de1", - "att_server_request_can_send_now_event": "0x02004ded", - "att_set_db": "0x02004e09", - "att_set_read_callback": "0x02004e1d", - "att_set_write_callback": "0x02004e29", - "bd_addr_cmp": "0x02004ffd", - "bd_addr_copy": "0x02005003", - "bd_addr_to_str": "0x0200500d", - "big_endian_read_16": "0x02005045", - "big_endian_read_32": "0x0200504d", - "big_endian_store_16": "0x02005061", - "big_endian_store_32": "0x0200506d", - "btstack_config": "0x020051b1", - "btstack_memory_pool_create": "0x020052ff", - "btstack_memory_pool_free": "0x02005329", - "btstack_memory_pool_get": "0x02005389", - "btstack_push_user_msg": "0x020053d1", - "btstack_push_user_runnable": "0x020053dd", - "btstack_reset": "0x020053e9", - "char_for_nibble": "0x020056f9", - "gap_add_dev_to_periodic_list": "0x020060e5", - "gap_add_whitelist": "0x020060f5", - "gap_aes_encrypt": "0x02006101", - "gap_clear_white_lists": "0x02006139", - "gap_clr_adv_set": "0x02006145", - "gap_clr_periodic_adv_list": "0x02006151", - "gap_create_connection_cancel": "0x0200615d", - "gap_default_periodic_adv_sync_transfer_param": "0x02006169", - "gap_disconnect": "0x02006181", - "gap_disconnect_all": "0x020061ad", - "gap_ext_create_connection": "0x020061ed", - "gap_get_connection_parameter_range": "0x020062c5", - "gap_le_read_channel_map": "0x02006301", - "gap_periodic_adv_create_sync": "0x0200636d", - "gap_periodic_adv_create_sync_cancel": "0x02006391", - "gap_periodic_adv_set_info_transfer": "0x0200639d", - "gap_periodic_adv_sync_transfer": "0x020063ad", - "gap_periodic_adv_sync_transfer_param": "0x020063bd", - "gap_periodic_adv_term_sync": "0x020063d9", - "gap_read_antenna_info": "0x02006461", - "gap_read_periodic_adv_list_size": "0x0200646d", - "gap_read_phy": "0x02006479", - "gap_read_remote_used_features": "0x02006485", - "gap_read_remote_version": "0x02006491", - "gap_read_rssi": "0x0200649d", - "gap_remove_whitelist": "0x020064a9", - "gap_rmv_adv_set": "0x02006525", - "gap_rmv_dev_from_periodic_list": "0x02006531", - "gap_rx_test_v2": "0x02006541", - "gap_rx_test_v3": "0x02006551", - "gap_set_adv_set_random_addr": "0x0200659d", - "gap_set_callback_for_next_hci": "0x020065d9", - "gap_set_connection_cte_request_enable": "0x020065f9", - "gap_set_connection_cte_response_enable": "0x02006615", - "gap_set_connection_cte_rx_param": "0x02006625", - "gap_set_connection_cte_tx_param": "0x02006679", - "gap_set_connection_parameter_range": "0x020066c5", - "gap_set_connectionless_cte_tx_enable": "0x020066dd", - "gap_set_connectionless_cte_tx_param": "0x020066ed", - "gap_set_connectionless_iq_sampling_enable": "0x02006749", - "gap_set_data_length": "0x020067a5", - "gap_set_def_phy": "0x020067bd", - "gap_set_ext_adv_data": "0x020067cd", - "gap_set_ext_adv_enable": "0x020067e5", - "gap_set_ext_adv_para": "0x02006855", - "gap_set_ext_scan_enable": "0x02006925", - "gap_set_ext_scan_para": "0x0200693d", - "gap_set_ext_scan_response_data": "0x020069dd", - "gap_set_host_channel_classification": "0x020069f5", - "gap_set_periodic_adv_data": "0x02006a05", - "gap_set_periodic_adv_enable": "0x02006a75", - "gap_set_periodic_adv_para": "0x02006a85", - "gap_set_periodic_adv_rx_enable": "0x02006a9d", - "gap_set_phy": "0x02006aad", - "gap_set_random_device_address": "0x02006ac9", - "gap_start_ccm": "0x02006af9", - "gap_test_end": "0x02006b41", - "gap_tx_test_v2": "0x02006b4d", - "gap_tx_test_v4": "0x02006b65", - "gap_update_connection_parameters": "0x02006b89", - "gap_vendor_tx_continuous_wave": "0x02006bcd", - "gatt_client_cancel_write": "0x020070f5", - "gatt_client_discover_characteristic_descriptors": "0x0200711b", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x0200715b", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x020071ab", - "gatt_client_discover_characteristics_for_service": "0x020071fb", - "gatt_client_discover_primary_services": "0x02007231", - "gatt_client_discover_primary_services_by_uuid128": "0x02007263", - "gatt_client_discover_primary_services_by_uuid16": "0x020072a7", - "gatt_client_execute_write": "0x020072e5", - "gatt_client_find_included_services_for_service": "0x0200730b", - "gatt_client_get_mtu": "0x02007339", - "gatt_client_is_ready": "0x020073fd", - "gatt_client_listen_for_characteristic_value_updates": "0x02007413", - "gatt_client_prepare_write": "0x02007435", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x02007471", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x0200749b", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x020074a1", - "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x020074cf", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x020074d5", - "gatt_client_read_multiple_characteristic_values": "0x02007503", - "gatt_client_read_value_of_characteristic_using_value_handle": "0x02007533", - "gatt_client_read_value_of_characteristics_by_uuid128": "0x02007561", - "gatt_client_read_value_of_characteristics_by_uuid16": "0x020075ad", - "gatt_client_register_handler": "0x020075f9", - "gatt_client_reliable_write_long_value_of_characteristic": "0x02007605", - "gatt_client_signed_write_without_response": "0x02007a39", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x02007afd", - "gatt_client_write_client_characteristic_configuration": "0x02007b37", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x02007b89", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x02007b99", - "gatt_client_write_long_value_of_characteristic": "0x02007bd5", - "gatt_client_write_long_value_of_characteristic_with_offset": "0x02007be5", - "gatt_client_write_value_of_characteristic": "0x02007c21", - "gatt_client_write_value_of_characteristic_without_response": "0x02007c57", - "hci_add_event_handler": "0x02009279", - "hci_power_control": "0x02009a21", - "hci_register_acl_packet_handler": "0x02009bd5", - "kv_commit": "0x0200a331", - "kv_get": "0x0200a38d", - "kv_init": "0x0200a399", - "kv_init_backend": "0x0200a419", - "kv_put": "0x0200a42d", - "kv_remove": "0x0200a439", - "kv_remove_all": "0x0200a46d", - "kv_value_modified": "0x0200a49d", - "kv_value_modified_of_key": "0x0200a4b9", - "kv_visit": "0x0200a4c5", - "l2cap_add_event_handler": "0x0200a555", - "l2cap_can_send_packet_now": "0x0200a565", - "l2cap_create_le_credit_based_connection_request": "0x0200a729", - "l2cap_credit_based_send": "0x0200a871", - "l2cap_credit_based_send_continue": "0x0200a89d", - "l2cap_disconnect": "0x0200a919", - "l2cap_get_le_credit_based_connection_credits": "0x0200ab05", - "l2cap_get_peer_mtu_for_local_cid": "0x0200ab21", - "l2cap_init": "0x0200af61", - "l2cap_le_send_flow_control_credit": "0x0200b057", - "l2cap_max_le_mtu": "0x0200b365", - "l2cap_register_packet_handler": "0x0200b48d", - "l2cap_register_service": "0x0200b499", - "l2cap_request_can_send_now_event": "0x0200b5a9", - "l2cap_request_connection_parameter_update": "0x0200b5c3", - "l2cap_send_echo_request": "0x0200baa5", - "l2cap_unregister_service": "0x0200bb85", - "le_device_db_add": "0x0200bbdd", - "le_device_db_find": "0x0200bcb5", - "le_device_db_from_key": "0x0200bce1", - "le_device_db_iter_cur": "0x0200bce9", - "le_device_db_iter_cur_key": "0x0200bced", - "le_device_db_iter_init": "0x0200bcf1", - "le_device_db_iter_next": "0x0200bcf9", - "le_device_db_remove_key": "0x0200bd1f", - "ll_ackable_packet_alloc": "0x0200bd4b", - "ll_ackable_packet_get_status": "0x0200be87", - "ll_ackable_packet_run": "0x0200bef5", - "ll_ackable_packet_set_tx_data": "0x0200bfad", - "ll_adjust_conn_peer_tx_power": "0x0200bfc9", - "ll_aes_encrypt": "0x0200bff5", - "ll_allow_nonstandard_adv_type": "0x0200c069", - "ll_attach_cte_to_adv_set": "0x0200c081", - "ll_channel_monitor_alloc": "0x0200c219", - "ll_channel_monitor_check_each_pdu": "0x0200c29b", - "ll_channel_monitor_run": "0x0200c2fd", - "ll_config": "0x0200c3cd", - "ll_free": "0x0200c623", - "ll_get_conn_events_info": "0x0200c62d", - "ll_get_conn_info": "0x0200c715", - "ll_get_heap_free_size": "0x0200c765", - "ll_hint_on_ce_len": "0x0200c779", - "ll_legacy_adv_set_interval": "0x0200c7b1", - "ll_lock_frequency": "0x0200c7c1", - "ll_malloc": "0x0200c825", - "ll_override_whitening_init_value": "0x0200c82d", - "ll_raw_packet_alloc": "0x0200c955", - "ll_raw_packet_free": "0x0200ca29", - "ll_raw_packet_get_bare_rx_data": "0x0200ca61", - "ll_raw_packet_get_iq_samples": "0x0200cb21", - "ll_raw_packet_get_rx_data": "0x0200cbbb", - "ll_raw_packet_recv": "0x0200cc6d", - "ll_raw_packet_send": "0x0200cd41", - "ll_raw_packet_set_bare_data": "0x0200ce5d", - "ll_raw_packet_set_bare_mode": "0x0200ce9b", - "ll_raw_packet_set_fake_cte_info": "0x0200cf9f", - "ll_raw_packet_set_param": "0x0200cfc1", - "ll_raw_packet_set_rx_cte": "0x0200d023", - "ll_raw_packet_set_tx_cte": "0x0200d0b9", - "ll_raw_packet_set_tx_data": "0x0200d0f9", - "ll_register_hci_acl_previewer": "0x0200d161", - "ll_scan_set_fixed_channel": "0x0200d1c5", - "ll_scanner_enable_iq_sampling": "0x0200d1d1", - "ll_scanner_enable_iq_sampling_on_legacy": "0x0200d279", - "ll_set_adv_access_address": "0x0200d569", - "ll_set_adv_coded_scheme": "0x0200d575", - "ll_set_conn_acl_report_latency": "0x0200d5ad", - "ll_set_conn_coded_scheme": "0x0200d5dd", - "ll_set_conn_interval_unit": "0x0200d609", - "ll_set_conn_latency": "0x0200d615", - "ll_set_conn_tx_power": "0x0200d645", - "ll_set_cte_bit": "0x0200d675", - "ll_set_def_antenna": "0x0200d69d", - "ll_set_initiating_coded_scheme": "0x0200d6bd", - "ll_set_max_conn_number": "0x0200d6c9", - "ll_set_tx_power_range": "0x0200d75d", - "ll_unlock_frequency": "0x0200d785", - "nibble_for_char": "0x02020675", - "platform_32k_rc_auto_tune": "0x0202070d", - "platform_32k_rc_tune": "0x02020759", - "platform_calibrate_32k": "0x02020775", - "platform_config": "0x02020779", - "platform_controller_run": "0x020208a1", - "platform_delete_timer": "0x020208d5", - "platform_enable_irq": "0x020208dd", - "platform_get_gen_os_driver": "0x02020911", - "platform_get_link_layer_interf": "0x0202091d", - "platform_get_task_handle": "0x02020925", - "platform_get_timer_counter": "0x0202093d", - "platform_get_us_time": "0x02020941", - "platform_get_version": "0x02020945", - "platform_hrng": "0x0202094d", - "platform_init_controller": "0x02020955", - "platform_os_idle_resumed_hook": "0x02020971", - "platform_patch_rf_init_data": "0x02020975", - "platform_post_sleep_processing": "0x02020981", - "platform_pre_sleep_processing": "0x02020987", - "platform_pre_suppress_ticks_and_sleep_processing": "0x0202098d", - "platform_printf": "0x02020991", - "platform_raise_assertion": "0x020209a5", - "platform_rand": "0x020209b9", - "platform_read_info": "0x020209bd", - "platform_read_persistent_reg": "0x020209ed", - "platform_reset": "0x020209f9", - "platform_set_abs_timer": "0x02020a0d", - "platform_set_evt_callback": "0x02020a11", - "platform_set_evt_callback_table": "0x02020a25", - "platform_set_irq_callback": "0x02020a31", - "platform_set_irq_callback_table": "0x02020a4d", - "platform_set_rf_clk_source": "0x02020a59", - "platform_set_rf_init_data": "0x02020a65", - "platform_set_rf_power_mapping": "0x02020a71", - "platform_set_timer": "0x02020a7d", - "platform_shutdown": "0x02020a81", - "platform_switch_app": "0x02020a85", - "platform_trace_raw": "0x02020a9d", - "platform_write_persistent_reg": "0x02020ab5", - "printf_hexdump": "0x02020ac9", - "reverse_128": "0x02020e41", - "reverse_24": "0x02020e47", - "reverse_256": "0x02020e4d", - "reverse_48": "0x02020e53", - "reverse_56": "0x02020e59", - "reverse_64": "0x02020e5f", - "reverse_bd_addr": "0x02020e65", - "reverse_bytes": "0x02020e6b", - "sm_add_event_handler": "0x020211f9", - "sm_address_resolution_lookup": "0x02021351", - "sm_authenticated": "0x020216cd", - "sm_authorization_decline": "0x020216db", - "sm_authorization_grant": "0x020216fb", - "sm_authorization_state": "0x0202171b", - "sm_bonding_decline": "0x02021735", - "sm_config": "0x02021b89", - "sm_config_conn": "0x02021ba1", - "sm_encryption_key_size": "0x02021d57", - "sm_just_works_confirm": "0x020222dd", - "sm_le_device_key": "0x02022629", - "sm_passkey_input": "0x020226bf", - "sm_private_random_address_generation_get": "0x02022a79", - "sm_private_random_address_generation_get_mode": "0x02022a81", - "sm_private_random_address_generation_set_mode": "0x02022a8d", - "sm_private_random_address_generation_set_update_period": "0x02022ab5", - "sm_register_external_ltk_callback": "0x02022bf1", - "sm_register_oob_data_callback": "0x02022bfd", - "sm_request_pairing": "0x02022c09", - "sm_send_security_request": "0x020236df", - "sm_set_accepted_stk_generation_methods": "0x02023705", - "sm_set_authentication_requirements": "0x02023711", - "sm_set_encryption_key_size_range": "0x0202371d", - "sscanf_bd_addr": "0x02023af5", - "sysSetPublicDeviceAddr": "0x02023fa5", - "uuid128_to_str": "0x020247ed", - "uuid_add_bluetooth_prefix": "0x02024845", - "uuid_has_bluetooth_prefix": "0x02024865" + "att_dispatch_client_can_send_now": "0x02004399", + "att_dispatch_client_request_can_send_now_event": "0x0200439f", + "att_dispatch_register_client": "0x020043a5", + "att_dispatch_register_server": "0x020043b9", + "att_dispatch_server_can_send_now": "0x020043cd", + "att_dispatch_server_request_can_send_now_event": "0x020043d3", + "att_emit_general_event": "0x02004485", + "att_server_can_send_packet_now": "0x02004bbd", + "att_server_deferred_read_response": "0x02004bc1", + "att_server_get_mtu": "0x02004bd9", + "att_server_indicate": "0x02004c51", + "att_server_init": "0x02004cd5", + "att_server_notify": "0x02004d11", + "att_server_register_packet_handler": "0x02004e29", + "att_server_request_can_send_now_event": "0x02004e35", + "att_set_db": "0x02004e51", + "att_set_read_callback": "0x02004e65", + "att_set_write_callback": "0x02004e71", + "bd_addr_cmp": "0x02005045", + "bd_addr_copy": "0x0200504b", + "bd_addr_to_str": "0x02005055", + "big_endian_read_16": "0x0200508d", + "big_endian_read_32": "0x02005095", + "big_endian_store_16": "0x020050a9", + "big_endian_store_32": "0x020050b5", + "btstack_config": "0x020051f9", + "btstack_memory_pool_create": "0x02005347", + "btstack_memory_pool_free": "0x02005371", + "btstack_memory_pool_get": "0x020053d1", + "btstack_push_user_msg": "0x02005419", + "btstack_push_user_runnable": "0x02005425", + "btstack_reset": "0x02005431", + "char_for_nibble": "0x02005741", + "gap_add_dev_to_periodic_list": "0x0200612d", + "gap_add_whitelist": "0x0200613d", + "gap_aes_encrypt": "0x02006149", + "gap_clear_white_lists": "0x02006181", + "gap_clr_adv_set": "0x0200618d", + "gap_clr_periodic_adv_list": "0x02006199", + "gap_create_connection_cancel": "0x020061a5", + "gap_default_periodic_adv_sync_transfer_param": "0x020061b1", + "gap_disconnect": "0x020061c9", + "gap_disconnect_all": "0x020061f5", + "gap_ext_create_connection": "0x02006235", + "gap_get_connection_parameter_range": "0x0200630d", + "gap_le_read_channel_map": "0x02006349", + "gap_periodic_adv_create_sync": "0x020063b5", + "gap_periodic_adv_create_sync_cancel": "0x020063d9", + "gap_periodic_adv_set_info_transfer": "0x020063e5", + "gap_periodic_adv_sync_transfer": "0x020063f5", + "gap_periodic_adv_sync_transfer_param": "0x02006405", + "gap_periodic_adv_term_sync": "0x02006421", + "gap_read_antenna_info": "0x020064a9", + "gap_read_periodic_adv_list_size": "0x020064b5", + "gap_read_phy": "0x020064c1", + "gap_read_remote_used_features": "0x020064cd", + "gap_read_remote_version": "0x020064d9", + "gap_read_rssi": "0x020064e5", + "gap_remove_whitelist": "0x020064f1", + "gap_rmv_adv_set": "0x0200656d", + "gap_rmv_dev_from_periodic_list": "0x02006579", + "gap_rx_test_v2": "0x02006589", + "gap_rx_test_v3": "0x02006599", + "gap_set_adv_set_random_addr": "0x020065e5", + "gap_set_callback_for_next_hci": "0x02006621", + "gap_set_connection_cte_request_enable": "0x02006641", + "gap_set_connection_cte_response_enable": "0x0200665d", + "gap_set_connection_cte_rx_param": "0x0200666d", + "gap_set_connection_cte_tx_param": "0x020066c1", + "gap_set_connection_parameter_range": "0x0200670d", + "gap_set_connectionless_cte_tx_enable": "0x02006725", + "gap_set_connectionless_cte_tx_param": "0x02006735", + "gap_set_connectionless_iq_sampling_enable": "0x02006791", + "gap_set_data_length": "0x020067ed", + "gap_set_def_phy": "0x02006805", + "gap_set_ext_adv_data": "0x02006815", + "gap_set_ext_adv_enable": "0x0200682d", + "gap_set_ext_adv_para": "0x0200689d", + "gap_set_ext_scan_enable": "0x0200696d", + "gap_set_ext_scan_para": "0x02006985", + "gap_set_ext_scan_response_data": "0x02006a25", + "gap_set_host_channel_classification": "0x02006a3d", + "gap_set_periodic_adv_data": "0x02006a4d", + "gap_set_periodic_adv_enable": "0x02006abd", + "gap_set_periodic_adv_para": "0x02006acd", + "gap_set_periodic_adv_rx_enable": "0x02006ae5", + "gap_set_phy": "0x02006af5", + "gap_set_random_device_address": "0x02006b11", + "gap_start_ccm": "0x02006b41", + "gap_test_end": "0x02006b89", + "gap_tx_test_v2": "0x02006b95", + "gap_tx_test_v4": "0x02006bad", + "gap_update_connection_parameters": "0x02006bd1", + "gap_vendor_tx_continuous_wave": "0x02006c15", + "gatt_client_cancel_write": "0x0200713d", + "gatt_client_discover_characteristic_descriptors": "0x02007163", + "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x020071a3", + "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x020071f3", + "gatt_client_discover_characteristics_for_service": "0x02007243", + "gatt_client_discover_primary_services": "0x02007279", + "gatt_client_discover_primary_services_by_uuid128": "0x020072ab", + "gatt_client_discover_primary_services_by_uuid16": "0x020072ef", + "gatt_client_execute_write": "0x0200732d", + "gatt_client_find_included_services_for_service": "0x02007353", + "gatt_client_get_mtu": "0x02007381", + "gatt_client_is_ready": "0x02007445", + "gatt_client_listen_for_characteristic_value_updates": "0x0200745b", + "gatt_client_prepare_write": "0x0200747d", + "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x020074b9", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x020074e3", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x020074e9", + "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x02007517", + "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x0200751d", + "gatt_client_read_multiple_characteristic_values": "0x0200754b", + "gatt_client_read_value_of_characteristic_using_value_handle": "0x0200757b", + "gatt_client_read_value_of_characteristics_by_uuid128": "0x020075a9", + "gatt_client_read_value_of_characteristics_by_uuid16": "0x020075f5", + "gatt_client_register_handler": "0x02007641", + "gatt_client_reliable_write_long_value_of_characteristic": "0x0200764d", + "gatt_client_signed_write_without_response": "0x02007a81", + "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x02007b45", + "gatt_client_write_client_characteristic_configuration": "0x02007b7f", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x02007bd1", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x02007be1", + "gatt_client_write_long_value_of_characteristic": "0x02007c1d", + "gatt_client_write_long_value_of_characteristic_with_offset": "0x02007c2d", + "gatt_client_write_value_of_characteristic": "0x02007c69", + "gatt_client_write_value_of_characteristic_without_response": "0x02007c9f", + "hci_add_event_handler": "0x020092c1", + "hci_power_control": "0x02009a69", + "hci_register_acl_packet_handler": "0x02009c1d", + "kv_commit": "0x0200a379", + "kv_get": "0x0200a3d5", + "kv_init": "0x0200a3e1", + "kv_init_backend": "0x0200a461", + "kv_put": "0x0200a475", + "kv_remove": "0x0200a481", + "kv_remove_all": "0x0200a4b5", + "kv_value_modified": "0x0200a4e5", + "kv_value_modified_of_key": "0x0200a501", + "kv_visit": "0x0200a50d", + "l2cap_add_event_handler": "0x0200a59d", + "l2cap_can_send_packet_now": "0x0200a5ad", + "l2cap_create_le_credit_based_connection_request": "0x0200a771", + "l2cap_credit_based_send": "0x0200a8b9", + "l2cap_credit_based_send_continue": "0x0200a8e5", + "l2cap_disconnect": "0x0200a961", + "l2cap_get_le_credit_based_connection_credits": "0x0200ab4d", + "l2cap_get_peer_mtu_for_local_cid": "0x0200ab69", + "l2cap_init": "0x0200afa9", + "l2cap_le_send_flow_control_credit": "0x0200b09f", + "l2cap_max_le_mtu": "0x0200b3ad", + "l2cap_register_packet_handler": "0x0200b4d5", + "l2cap_register_service": "0x0200b4e1", + "l2cap_request_can_send_now_event": "0x0200b5f1", + "l2cap_request_connection_parameter_update": "0x0200b60b", + "l2cap_send_echo_request": "0x0200baed", + "l2cap_unregister_service": "0x0200bbcd", + "le_device_db_add": "0x0200bc25", + "le_device_db_find": "0x0200bcfd", + "le_device_db_from_key": "0x0200bd29", + "le_device_db_iter_cur": "0x0200bd31", + "le_device_db_iter_cur_key": "0x0200bd35", + "le_device_db_iter_init": "0x0200bd39", + "le_device_db_iter_next": "0x0200bd41", + "le_device_db_remove_key": "0x0200bd67", + "ll_ackable_packet_alloc": "0x0200bd93", + "ll_ackable_packet_get_status": "0x0200becf", + "ll_ackable_packet_run": "0x0200bf3d", + "ll_ackable_packet_set_tx_data": "0x0200bff5", + "ll_adjust_conn_peer_tx_power": "0x0200c011", + "ll_aes_encrypt": "0x0200c03d", + "ll_allow_nonstandard_adv_type": "0x0200c0b1", + "ll_attach_cte_to_adv_set": "0x0200c0c9", + "ll_channel_monitor_alloc": "0x0200c261", + "ll_channel_monitor_check_each_pdu": "0x0200c2e3", + "ll_channel_monitor_run": "0x0200c345", + "ll_config": "0x0200c415", + "ll_free": "0x0200c66b", + "ll_get_conn_events_info": "0x0200c675", + "ll_get_conn_info": "0x0200c75d", + "ll_get_heap_free_size": "0x0200c7ad", + "ll_hint_on_ce_len": "0x0200c7c1", + "ll_legacy_adv_set_interval": "0x0200c7f9", + "ll_lock_frequency": "0x0200c809", + "ll_malloc": "0x0200c86d", + "ll_override_whitening_init_value": "0x0200c875", + "ll_raw_packet_alloc": "0x0200c99d", + "ll_raw_packet_free": "0x0200ca71", + "ll_raw_packet_get_bare_rx_data": "0x0200caa9", + "ll_raw_packet_get_iq_samples": "0x0200cb69", + "ll_raw_packet_get_rx_data": "0x0200cc03", + "ll_raw_packet_recv": "0x0200ccb5", + "ll_raw_packet_send": "0x0200cd89", + "ll_raw_packet_set_bare_data": "0x0200cea5", + "ll_raw_packet_set_bare_mode": "0x0200cee3", + "ll_raw_packet_set_fake_cte_info": "0x0200cfe7", + "ll_raw_packet_set_param": "0x0200d009", + "ll_raw_packet_set_rx_cte": "0x0200d06b", + "ll_raw_packet_set_tx_cte": "0x0200d101", + "ll_raw_packet_set_tx_data": "0x0200d141", + "ll_register_hci_acl_previewer": "0x0200d1a9", + "ll_scan_set_fixed_channel": "0x0200d20d", + "ll_scanner_enable_iq_sampling": "0x0200d219", + "ll_scanner_enable_iq_sampling_on_legacy": "0x0200d2c1", + "ll_set_adv_access_address": "0x0200d5b1", + "ll_set_adv_coded_scheme": "0x0200d5bd", + "ll_set_conn_acl_report_latency": "0x0200d5f5", + "ll_set_conn_coded_scheme": "0x0200d625", + "ll_set_conn_interval_unit": "0x0200d651", + "ll_set_conn_latency": "0x0200d65d", + "ll_set_conn_tx_power": "0x0200d68d", + "ll_set_cte_bit": "0x0200d6bd", + "ll_set_def_antenna": "0x0200d6e5", + "ll_set_initiating_coded_scheme": "0x0200d705", + "ll_set_max_conn_number": "0x0200d711", + "ll_set_tx_power_range": "0x0200d7a5", + "ll_unlock_frequency": "0x0200d7cd", + "nibble_for_char": "0x020206bd", + "platform_32k_rc_auto_tune": "0x02020755", + "platform_32k_rc_tune": "0x020207a1", + "platform_calibrate_32k": "0x020207bd", + "platform_call_on_stack": "0x0200213f", + "platform_config": "0x020207c1", + "platform_controller_run": "0x020208e9", + "platform_delete_timer": "0x0202091d", + "platform_enable_irq": "0x02020925", + "platform_get_gen_os_driver": "0x02020959", + "platform_get_link_layer_interf": "0x02020965", + "platform_get_task_handle": "0x0202096d", + "platform_get_timer_counter": "0x02020985", + "platform_get_us_time": "0x02020989", + "platform_get_version": "0x0202098d", + "platform_hrng": "0x02020995", + "platform_init_controller": "0x0202099d", + "platform_os_idle_resumed_hook": "0x020209b9", + "platform_patch_rf_init_data": "0x020209bd", + "platform_post_sleep_processing": "0x020209c9", + "platform_pre_sleep_processing": "0x020209cf", + "platform_pre_suppress_ticks_and_sleep_processing": "0x020209d5", + "platform_printf": "0x020209d9", + "platform_raise_assertion": "0x020209ed", + "platform_rand": "0x02020a01", + "platform_read_info": "0x02020a05", + "platform_read_persistent_reg": "0x02020a35", + "platform_reset": "0x02020a41", + "platform_set_abs_timer": "0x02020a55", + "platform_set_evt_callback": "0x02020a59", + "platform_set_evt_callback_table": "0x02020a6d", + "platform_set_irq_callback": "0x02020a79", + "platform_set_irq_callback_table": "0x02020a95", + "platform_set_rf_clk_source": "0x02020aa1", + "platform_set_rf_init_data": "0x02020aad", + "platform_set_rf_power_mapping": "0x02020ab9", + "platform_set_timer": "0x02020ac5", + "platform_shutdown": "0x02020ac9", + "platform_switch_app": "0x02020acd", + "platform_trace_raw": "0x02020ae5", + "platform_write_persistent_reg": "0x02020afd", + "printf_hexdump": "0x02020b11", + "reverse_128": "0x02020e89", + "reverse_24": "0x02020e8f", + "reverse_256": "0x02020e95", + "reverse_48": "0x02020e9b", + "reverse_56": "0x02020ea1", + "reverse_64": "0x02020ea7", + "reverse_bd_addr": "0x02020ead", + "reverse_bytes": "0x02020eb3", + "sm_add_event_handler": "0x02021241", + "sm_address_resolution_lookup": "0x02021399", + "sm_authenticated": "0x02021715", + "sm_authorization_decline": "0x02021723", + "sm_authorization_grant": "0x02021743", + "sm_authorization_state": "0x02021763", + "sm_bonding_decline": "0x0202177d", + "sm_config": "0x02021bd1", + "sm_config_conn": "0x02021be9", + "sm_encryption_key_size": "0x02021d9f", + "sm_just_works_confirm": "0x02022325", + "sm_le_device_key": "0x02022671", + "sm_passkey_input": "0x02022707", + "sm_private_random_address_generation_get": "0x02022ac1", + "sm_private_random_address_generation_get_mode": "0x02022ac9", + "sm_private_random_address_generation_set_mode": "0x02022ad5", + "sm_private_random_address_generation_set_update_period": "0x02022afd", + "sm_register_external_ltk_callback": "0x02022c39", + "sm_register_oob_data_callback": "0x02022c45", + "sm_request_pairing": "0x02022c51", + "sm_send_security_request": "0x02023727", + "sm_set_accepted_stk_generation_methods": "0x0202374d", + "sm_set_authentication_requirements": "0x02023759", + "sm_set_encryption_key_size_range": "0x02023765", + "sscanf_bd_addr": "0x02023b3d", + "sysSetPublicDeviceAddr": "0x02023fed", + "uuid128_to_str": "0x02024835", + "uuid_add_bluetooth_prefix": "0x0202488d", + "uuid_has_bluetooth_prefix": "0x020248ad" } \ No newline at end of file diff --git a/bundles/noos_extension/ING9168xx/meta.json b/bundles/noos_extension/ING9168xx/meta.json index 669061a6f..1bbc7c043 100644 --- a/bundles/noos_extension/ING9168xx/meta.json +++ b/bundles/noos_extension/ING9168xx/meta.json @@ -8,11 +8,11 @@ }, "rom": { "base": 33562624, - "size": 150796 + "size": 150868 }, "version": [ 2, 2, - 50 + 52 ] } \ No newline at end of file diff --git a/bundles/noos_extension/ING9168xx/platform.bin b/bundles/noos_extension/ING9168xx/platform.bin index 4a5dcbdfd6d7f68277b3055ae4ab0d366119b926..2e99cf6dff4108f08379548f7a149a14d8361b0b 100644 GIT binary patch delta 7970 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 delta 7690 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 delta 7568 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 delta 29400 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 diff --git a/bundles/noos_mini/inc/platform_api.h b/bundles/noos_mini/inc/platform_api.h index 630aec5e4..6700b4a48 100644 --- a/bundles/noos_mini/inc/platform_api.h +++ b/bundles/noos_mini/inc/platform_api.h @@ -753,7 +753,7 @@ void platform_delete_timer(f_platform_timer_callback callback); * the generic OS interface. * * @param[in] id task identifier - * @param[in] start start address of the new stack + * @param[in] start start (lowest) address of the new stack * @param[in] size size of the new stack in bytes **************************************************************************************** */ @@ -841,6 +841,21 @@ typedef struct platform_hci_link_layer_interf */ const platform_hci_link_layer_interf_t *platform_get_link_layer_interf(void); +typedef void (*f_platform_function)(void *user_data); + +/** + **************************************************************************************** + * @brief Call a function on a separate dedicated stack + * + * @param[in] f the function to be called + * @param[in] user_data user data passed to `f` + * @param[in] start start (lowest) address of the dedicated stack + * @param[in] size size of the dedicated stack in bytes + **************************************************************************************** + */ +void platform_call_on_stack(f_platform_function f, void *user_data, + void *stack_start, uint32_t stack_size); + #ifdef __cplusplus } #endif diff --git a/bundles/noos_typical/ING9168xx/apis.json b/bundles/noos_typical/ING9168xx/apis.json index 25f5b7b3c..68076e5ba 100644 --- a/bundles/noos_typical/ING9168xx/apis.json +++ b/bundles/noos_typical/ING9168xx/apis.json @@ -1,266 +1,267 @@ { - "att_dispatch_client_can_send_now": "0x02004351", - "att_dispatch_client_request_can_send_now_event": "0x02004357", - "att_dispatch_register_client": "0x0200435d", - "att_dispatch_register_server": "0x02004371", - "att_dispatch_server_can_send_now": "0x02004385", - "att_dispatch_server_request_can_send_now_event": "0x0200438b", - "att_emit_general_event": "0x0200443d", - "att_server_can_send_packet_now": "0x02004b75", - "att_server_deferred_read_response": "0x02004b79", - "att_server_get_mtu": "0x02004b91", - "att_server_indicate": "0x02004c09", - "att_server_init": "0x02004c8d", - "att_server_notify": "0x02004cc9", - "att_server_register_packet_handler": "0x02004de1", - "att_server_request_can_send_now_event": "0x02004ded", - "att_set_db": "0x02004e09", - "att_set_read_callback": "0x02004e1d", - "att_set_write_callback": "0x02004e29", - "bd_addr_cmp": "0x02004ffd", - "bd_addr_copy": "0x02005003", - "bd_addr_to_str": "0x0200500d", - "big_endian_read_16": "0x02005045", - "big_endian_read_32": "0x0200504d", - "big_endian_store_16": "0x02005061", - "big_endian_store_32": "0x0200506d", - "btstack_config": "0x020051b1", - "btstack_memory_pool_create": "0x020052ff", - "btstack_memory_pool_free": "0x02005329", - "btstack_memory_pool_get": "0x02005389", - "btstack_push_user_msg": "0x020053d1", - "btstack_push_user_runnable": "0x020053dd", - "btstack_reset": "0x020053e9", - "char_for_nibble": "0x020056c3", - "gap_add_dev_to_periodic_list": "0x020060a9", - "gap_add_whitelist": "0x020060b9", - "gap_aes_encrypt": "0x020060c5", - "gap_clear_white_lists": "0x020060fd", - "gap_clr_adv_set": "0x02006109", - "gap_clr_periodic_adv_list": "0x02006115", - "gap_create_connection_cancel": "0x02006121", - "gap_default_periodic_adv_sync_transfer_param": "0x0200612d", - "gap_disconnect": "0x02006145", - "gap_disconnect_all": "0x02006171", - "gap_ext_create_connection": "0x020061b1", - "gap_get_connection_parameter_range": "0x02006289", - "gap_le_read_channel_map": "0x020062c5", - "gap_periodic_adv_create_sync": "0x02006331", - "gap_periodic_adv_create_sync_cancel": "0x02006355", - "gap_periodic_adv_set_info_transfer": "0x02006361", - "gap_periodic_adv_sync_transfer": "0x02006371", - "gap_periodic_adv_sync_transfer_param": "0x02006381", - "gap_periodic_adv_term_sync": "0x0200639d", - "gap_read_antenna_info": "0x02006425", - "gap_read_periodic_adv_list_size": "0x02006431", - "gap_read_phy": "0x0200643d", - "gap_read_remote_used_features": "0x02006449", - "gap_read_remote_version": "0x02006455", - "gap_read_rssi": "0x02006461", - "gap_remove_whitelist": "0x0200646d", - "gap_rmv_adv_set": "0x020064e9", - "gap_rmv_dev_from_periodic_list": "0x020064f5", - "gap_rx_test_v2": "0x02006505", - "gap_rx_test_v3": "0x02006515", - "gap_set_adv_set_random_addr": "0x02006561", - "gap_set_callback_for_next_hci": "0x0200659d", - "gap_set_connection_cte_request_enable": "0x020065bd", - "gap_set_connection_cte_response_enable": "0x020065d9", - "gap_set_connection_cte_rx_param": "0x020065e9", - "gap_set_connection_cte_tx_param": "0x0200663d", - "gap_set_connection_parameter_range": "0x02006689", - "gap_set_connectionless_cte_tx_enable": "0x020066a1", - "gap_set_connectionless_cte_tx_param": "0x020066b1", - "gap_set_connectionless_iq_sampling_enable": "0x0200670d", - "gap_set_data_length": "0x02006769", - "gap_set_def_phy": "0x02006781", - "gap_set_ext_adv_data": "0x02006791", - "gap_set_ext_adv_enable": "0x020067a9", - "gap_set_ext_adv_para": "0x02006819", - "gap_set_ext_scan_enable": "0x020068e9", - "gap_set_ext_scan_para": "0x02006901", - "gap_set_ext_scan_response_data": "0x020069a1", - "gap_set_host_channel_classification": "0x020069b9", - "gap_set_periodic_adv_data": "0x020069c9", - "gap_set_periodic_adv_enable": "0x02006a39", - "gap_set_periodic_adv_para": "0x02006a49", - "gap_set_periodic_adv_rx_enable": "0x02006a61", - "gap_set_phy": "0x02006a71", - "gap_set_random_device_address": "0x02006a8d", - "gap_start_ccm": "0x02006abd", - "gap_test_end": "0x02006b05", - "gap_tx_test_v2": "0x02006b11", - "gap_tx_test_v4": "0x02006b29", - "gap_update_connection_parameters": "0x02006b4d", - "gap_vendor_tx_continuous_wave": "0x02006b91", - "gatt_client_cancel_write": "0x020070b9", - "gatt_client_discover_characteristic_descriptors": "0x020070df", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x0200711f", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x0200716f", - "gatt_client_discover_characteristics_for_service": "0x020071bf", - "gatt_client_discover_primary_services": "0x020071f5", - "gatt_client_discover_primary_services_by_uuid128": "0x02007227", - "gatt_client_discover_primary_services_by_uuid16": "0x0200726b", - "gatt_client_execute_write": "0x020072a9", - "gatt_client_find_included_services_for_service": "0x020072cf", - "gatt_client_get_mtu": "0x020072fd", - "gatt_client_is_ready": "0x020073c1", - "gatt_client_listen_for_characteristic_value_updates": "0x020073d7", - "gatt_client_prepare_write": "0x020073f9", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x02007435", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x0200745f", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x02007465", - "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x02007493", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x02007499", - "gatt_client_read_multiple_characteristic_values": "0x020074c7", - "gatt_client_read_value_of_characteristic_using_value_handle": "0x020074f7", - "gatt_client_read_value_of_characteristics_by_uuid128": "0x02007525", - "gatt_client_read_value_of_characteristics_by_uuid16": "0x02007571", - "gatt_client_register_handler": "0x020075bd", - "gatt_client_reliable_write_long_value_of_characteristic": "0x020075c9", - "gatt_client_signed_write_without_response": "0x020079fd", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x02007ac1", - "gatt_client_write_client_characteristic_configuration": "0x02007afb", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x02007b4d", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x02007b5d", - "gatt_client_write_long_value_of_characteristic": "0x02007b99", - "gatt_client_write_long_value_of_characteristic_with_offset": "0x02007ba9", - "gatt_client_write_value_of_characteristic": "0x02007be5", - "gatt_client_write_value_of_characteristic_without_response": "0x02007c1b", - "hci_add_event_handler": "0x02009211", - "hci_power_control": "0x020099b9", - "hci_register_acl_packet_handler": "0x02009b6d", - "kv_commit": "0x0200a2c9", - "kv_get": "0x0200a325", - "kv_init": "0x0200a331", - "kv_init_backend": "0x0200a3b1", - "kv_put": "0x0200a3c5", - "kv_remove": "0x0200a3d1", - "kv_remove_all": "0x0200a405", - "kv_value_modified": "0x0200a435", - "kv_value_modified_of_key": "0x0200a451", - "kv_visit": "0x0200a45d", - "l2cap_add_event_handler": "0x0200a4ed", - "l2cap_can_send_packet_now": "0x0200a4fd", - "l2cap_create_le_credit_based_connection_request": "0x0200a6c1", - "l2cap_credit_based_send": "0x0200a809", - "l2cap_credit_based_send_continue": "0x0200a835", - "l2cap_disconnect": "0x0200a8b1", - "l2cap_get_le_credit_based_connection_credits": "0x0200aa9d", - "l2cap_get_peer_mtu_for_local_cid": "0x0200aab9", - "l2cap_init": "0x0200aef9", - "l2cap_le_send_flow_control_credit": "0x0200afef", - "l2cap_max_le_mtu": "0x0200b2fd", - "l2cap_register_packet_handler": "0x0200b425", - "l2cap_register_service": "0x0200b431", - "l2cap_request_can_send_now_event": "0x0200b541", - "l2cap_request_connection_parameter_update": "0x0200b55b", - "l2cap_send_echo_request": "0x0200ba3d", - "l2cap_unregister_service": "0x0200bb1d", - "le_device_db_add": "0x0200bb75", - "le_device_db_find": "0x0200bc4d", - "le_device_db_from_key": "0x0200bc79", - "le_device_db_iter_cur": "0x0200bc81", - "le_device_db_iter_cur_key": "0x0200bc85", - "le_device_db_iter_init": "0x0200bc89", - "le_device_db_iter_next": "0x0200bc91", - "le_device_db_remove_key": "0x0200bcb7", - "ll_adjust_conn_peer_tx_power": "0x0200bce5", - "ll_aes_encrypt": "0x0200bd11", - "ll_config": "0x0200bd85", - "ll_free": "0x0200bdbb", - "ll_get_heap_free_size": "0x0200bdc5", - "ll_hint_on_ce_len": "0x0200bdd9", - "ll_legacy_adv_set_interval": "0x0200be11", - "ll_malloc": "0x0200be21", - "ll_register_hci_acl_previewer": "0x0200bf39", - "ll_scan_set_fixed_channel": "0x0200bf9d", - "ll_set_adv_access_address": "0x0200c1b5", - "ll_set_adv_coded_scheme": "0x0200c1c1", - "ll_set_conn_acl_report_latency": "0x0200c1f9", - "ll_set_conn_coded_scheme": "0x0200c229", - "ll_set_conn_latency": "0x0200c255", - "ll_set_conn_tx_power": "0x0200c285", - "ll_set_def_antenna": "0x0200c2c1", - "ll_set_initiating_coded_scheme": "0x0200c2e1", - "ll_set_max_conn_number": "0x0200c2ed", - "ll_set_tx_power_range": "0x0200c381", - "nibble_for_char": "0x0201edd5", - "platform_32k_rc_auto_tune": "0x0201ee6d", - "platform_32k_rc_tune": "0x0201eeb9", - "platform_calibrate_32k": "0x0201eed5", - "platform_config": "0x0201eed9", - "platform_controller_run": "0x0201f001", - "platform_delete_timer": "0x0201f035", - "platform_enable_irq": "0x0201f03d", - "platform_get_gen_os_driver": "0x0201f071", - "platform_get_link_layer_interf": "0x0201f07d", - "platform_get_task_handle": "0x0201f085", - "platform_get_timer_counter": "0x0201f09d", - "platform_get_us_time": "0x0201f0a1", - "platform_get_version": "0x0201f0a5", - "platform_hrng": "0x0201f0ad", - "platform_init_controller": "0x0201f0b5", - "platform_os_idle_resumed_hook": "0x0201f0d1", - "platform_patch_rf_init_data": "0x0201f0d5", - "platform_post_sleep_processing": "0x0201f0e1", - "platform_pre_sleep_processing": "0x0201f0e7", - "platform_pre_suppress_ticks_and_sleep_processing": "0x0201f0ed", - "platform_printf": "0x0201f0f1", - "platform_raise_assertion": "0x0201f105", - "platform_rand": "0x0201f119", - "platform_read_info": "0x0201f11d", - "platform_read_persistent_reg": "0x0201f14d", - "platform_reset": "0x0201f159", - "platform_set_abs_timer": "0x0201f16d", - "platform_set_evt_callback": "0x0201f171", - "platform_set_evt_callback_table": "0x0201f185", - "platform_set_irq_callback": "0x0201f191", - "platform_set_irq_callback_table": "0x0201f1ad", - "platform_set_rf_clk_source": "0x0201f1b9", - "platform_set_rf_init_data": "0x0201f1c5", - "platform_set_rf_power_mapping": "0x0201f1d1", - "platform_set_timer": "0x0201f1dd", - "platform_shutdown": "0x0201f1e1", - "platform_switch_app": "0x0201f1e5", - "platform_trace_raw": "0x0201f1fd", - "platform_write_persistent_reg": "0x0201f215", - "printf_hexdump": "0x0201f229", - "reverse_128": "0x0201f5a1", - "reverse_24": "0x0201f5a7", - "reverse_256": "0x0201f5ad", - "reverse_48": "0x0201f5b3", - "reverse_56": "0x0201f5b9", - "reverse_64": "0x0201f5bf", - "reverse_bd_addr": "0x0201f5c5", - "reverse_bytes": "0x0201f5cb", - "sm_add_event_handler": "0x0201f929", - "sm_address_resolution_lookup": "0x0201fa81", - "sm_authenticated": "0x0201fdfd", - "sm_authorization_decline": "0x0201fe0b", - "sm_authorization_grant": "0x0201fe2b", - "sm_authorization_state": "0x0201fe4b", - "sm_bonding_decline": "0x0201fe65", - "sm_config": "0x020202b9", - "sm_config_conn": "0x020202d1", - "sm_encryption_key_size": "0x02020487", - "sm_just_works_confirm": "0x02020a0d", - "sm_le_device_key": "0x02020d59", - "sm_passkey_input": "0x02020def", - "sm_private_random_address_generation_get": "0x020211a9", - "sm_private_random_address_generation_get_mode": "0x020211b1", - "sm_private_random_address_generation_set_mode": "0x020211bd", - "sm_private_random_address_generation_set_update_period": "0x020211e5", - "sm_register_external_ltk_callback": "0x02021321", - "sm_register_oob_data_callback": "0x0202132d", - "sm_request_pairing": "0x02021339", - "sm_send_security_request": "0x02021e0f", - "sm_set_accepted_stk_generation_methods": "0x02021e35", - "sm_set_authentication_requirements": "0x02021e41", - "sm_set_encryption_key_size_range": "0x02021e4d", - "sscanf_bd_addr": "0x020221ad", - "sysSetPublicDeviceAddr": "0x0202265d", - "uuid128_to_str": "0x02022ea5", - "uuid_add_bluetooth_prefix": "0x02022efd", - "uuid_has_bluetooth_prefix": "0x02022f1d" + "att_dispatch_client_can_send_now": "0x02004399", + "att_dispatch_client_request_can_send_now_event": "0x0200439f", + "att_dispatch_register_client": "0x020043a5", + "att_dispatch_register_server": "0x020043b9", + "att_dispatch_server_can_send_now": "0x020043cd", + "att_dispatch_server_request_can_send_now_event": "0x020043d3", + "att_emit_general_event": "0x02004485", + "att_server_can_send_packet_now": "0x02004bbd", + "att_server_deferred_read_response": "0x02004bc1", + "att_server_get_mtu": "0x02004bd9", + "att_server_indicate": "0x02004c51", + "att_server_init": "0x02004cd5", + "att_server_notify": "0x02004d11", + "att_server_register_packet_handler": "0x02004e29", + "att_server_request_can_send_now_event": "0x02004e35", + "att_set_db": "0x02004e51", + "att_set_read_callback": "0x02004e65", + "att_set_write_callback": "0x02004e71", + "bd_addr_cmp": "0x02005045", + "bd_addr_copy": "0x0200504b", + "bd_addr_to_str": "0x02005055", + "big_endian_read_16": "0x0200508d", + "big_endian_read_32": "0x02005095", + "big_endian_store_16": "0x020050a9", + "big_endian_store_32": "0x020050b5", + "btstack_config": "0x020051f9", + "btstack_memory_pool_create": "0x02005347", + "btstack_memory_pool_free": "0x02005371", + "btstack_memory_pool_get": "0x020053d1", + "btstack_push_user_msg": "0x02005419", + "btstack_push_user_runnable": "0x02005425", + "btstack_reset": "0x02005431", + "char_for_nibble": "0x0200570b", + "gap_add_dev_to_periodic_list": "0x020060f1", + "gap_add_whitelist": "0x02006101", + "gap_aes_encrypt": "0x0200610d", + "gap_clear_white_lists": "0x02006145", + "gap_clr_adv_set": "0x02006151", + "gap_clr_periodic_adv_list": "0x0200615d", + "gap_create_connection_cancel": "0x02006169", + "gap_default_periodic_adv_sync_transfer_param": "0x02006175", + "gap_disconnect": "0x0200618d", + "gap_disconnect_all": "0x020061b9", + "gap_ext_create_connection": "0x020061f9", + "gap_get_connection_parameter_range": "0x020062d1", + "gap_le_read_channel_map": "0x0200630d", + "gap_periodic_adv_create_sync": "0x02006379", + "gap_periodic_adv_create_sync_cancel": "0x0200639d", + "gap_periodic_adv_set_info_transfer": "0x020063a9", + "gap_periodic_adv_sync_transfer": "0x020063b9", + "gap_periodic_adv_sync_transfer_param": "0x020063c9", + "gap_periodic_adv_term_sync": "0x020063e5", + "gap_read_antenna_info": "0x0200646d", + "gap_read_periodic_adv_list_size": "0x02006479", + "gap_read_phy": "0x02006485", + "gap_read_remote_used_features": "0x02006491", + "gap_read_remote_version": "0x0200649d", + "gap_read_rssi": "0x020064a9", + "gap_remove_whitelist": "0x020064b5", + "gap_rmv_adv_set": "0x02006531", + "gap_rmv_dev_from_periodic_list": "0x0200653d", + "gap_rx_test_v2": "0x0200654d", + "gap_rx_test_v3": "0x0200655d", + "gap_set_adv_set_random_addr": "0x020065a9", + "gap_set_callback_for_next_hci": "0x020065e5", + "gap_set_connection_cte_request_enable": "0x02006605", + "gap_set_connection_cte_response_enable": "0x02006621", + "gap_set_connection_cte_rx_param": "0x02006631", + "gap_set_connection_cte_tx_param": "0x02006685", + "gap_set_connection_parameter_range": "0x020066d1", + "gap_set_connectionless_cte_tx_enable": "0x020066e9", + "gap_set_connectionless_cte_tx_param": "0x020066f9", + "gap_set_connectionless_iq_sampling_enable": "0x02006755", + "gap_set_data_length": "0x020067b1", + "gap_set_def_phy": "0x020067c9", + "gap_set_ext_adv_data": "0x020067d9", + "gap_set_ext_adv_enable": "0x020067f1", + "gap_set_ext_adv_para": "0x02006861", + "gap_set_ext_scan_enable": "0x02006931", + "gap_set_ext_scan_para": "0x02006949", + "gap_set_ext_scan_response_data": "0x020069e9", + "gap_set_host_channel_classification": "0x02006a01", + "gap_set_periodic_adv_data": "0x02006a11", + "gap_set_periodic_adv_enable": "0x02006a81", + "gap_set_periodic_adv_para": "0x02006a91", + "gap_set_periodic_adv_rx_enable": "0x02006aa9", + "gap_set_phy": "0x02006ab9", + "gap_set_random_device_address": "0x02006ad5", + "gap_start_ccm": "0x02006b05", + "gap_test_end": "0x02006b4d", + "gap_tx_test_v2": "0x02006b59", + "gap_tx_test_v4": "0x02006b71", + "gap_update_connection_parameters": "0x02006b95", + "gap_vendor_tx_continuous_wave": "0x02006bd9", + "gatt_client_cancel_write": "0x02007101", + "gatt_client_discover_characteristic_descriptors": "0x02007127", + "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x02007167", + "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x020071b7", + "gatt_client_discover_characteristics_for_service": "0x02007207", + "gatt_client_discover_primary_services": "0x0200723d", + "gatt_client_discover_primary_services_by_uuid128": "0x0200726f", + "gatt_client_discover_primary_services_by_uuid16": "0x020072b3", + "gatt_client_execute_write": "0x020072f1", + "gatt_client_find_included_services_for_service": "0x02007317", + "gatt_client_get_mtu": "0x02007345", + "gatt_client_is_ready": "0x02007409", + "gatt_client_listen_for_characteristic_value_updates": "0x0200741f", + "gatt_client_prepare_write": "0x02007441", + "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x0200747d", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x020074a7", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x020074ad", + "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x020074db", + "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x020074e1", + "gatt_client_read_multiple_characteristic_values": "0x0200750f", + "gatt_client_read_value_of_characteristic_using_value_handle": "0x0200753f", + "gatt_client_read_value_of_characteristics_by_uuid128": "0x0200756d", + "gatt_client_read_value_of_characteristics_by_uuid16": "0x020075b9", + "gatt_client_register_handler": "0x02007605", + "gatt_client_reliable_write_long_value_of_characteristic": "0x02007611", + "gatt_client_signed_write_without_response": "0x02007a45", + "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x02007b09", + "gatt_client_write_client_characteristic_configuration": "0x02007b43", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x02007b95", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x02007ba5", + "gatt_client_write_long_value_of_characteristic": "0x02007be1", + "gatt_client_write_long_value_of_characteristic_with_offset": "0x02007bf1", + "gatt_client_write_value_of_characteristic": "0x02007c2d", + "gatt_client_write_value_of_characteristic_without_response": "0x02007c63", + "hci_add_event_handler": "0x02009259", + "hci_power_control": "0x02009a01", + "hci_register_acl_packet_handler": "0x02009bb5", + "kv_commit": "0x0200a311", + "kv_get": "0x0200a36d", + "kv_init": "0x0200a379", + "kv_init_backend": "0x0200a3f9", + "kv_put": "0x0200a40d", + "kv_remove": "0x0200a419", + "kv_remove_all": "0x0200a44d", + "kv_value_modified": "0x0200a47d", + "kv_value_modified_of_key": "0x0200a499", + "kv_visit": "0x0200a4a5", + "l2cap_add_event_handler": "0x0200a535", + "l2cap_can_send_packet_now": "0x0200a545", + "l2cap_create_le_credit_based_connection_request": "0x0200a709", + "l2cap_credit_based_send": "0x0200a851", + "l2cap_credit_based_send_continue": "0x0200a87d", + "l2cap_disconnect": "0x0200a8f9", + "l2cap_get_le_credit_based_connection_credits": "0x0200aae5", + "l2cap_get_peer_mtu_for_local_cid": "0x0200ab01", + "l2cap_init": "0x0200af41", + "l2cap_le_send_flow_control_credit": "0x0200b037", + "l2cap_max_le_mtu": "0x0200b345", + "l2cap_register_packet_handler": "0x0200b46d", + "l2cap_register_service": "0x0200b479", + "l2cap_request_can_send_now_event": "0x0200b589", + "l2cap_request_connection_parameter_update": "0x0200b5a3", + "l2cap_send_echo_request": "0x0200ba85", + "l2cap_unregister_service": "0x0200bb65", + "le_device_db_add": "0x0200bbbd", + "le_device_db_find": "0x0200bc95", + "le_device_db_from_key": "0x0200bcc1", + "le_device_db_iter_cur": "0x0200bcc9", + "le_device_db_iter_cur_key": "0x0200bccd", + "le_device_db_iter_init": "0x0200bcd1", + "le_device_db_iter_next": "0x0200bcd9", + "le_device_db_remove_key": "0x0200bcff", + "ll_adjust_conn_peer_tx_power": "0x0200bd2d", + "ll_aes_encrypt": "0x0200bd59", + "ll_config": "0x0200bdcd", + "ll_free": "0x0200be03", + "ll_get_heap_free_size": "0x0200be0d", + "ll_hint_on_ce_len": "0x0200be21", + "ll_legacy_adv_set_interval": "0x0200be59", + "ll_malloc": "0x0200be69", + "ll_register_hci_acl_previewer": "0x0200bf81", + "ll_scan_set_fixed_channel": "0x0200bfe5", + "ll_set_adv_access_address": "0x0200c1fd", + "ll_set_adv_coded_scheme": "0x0200c209", + "ll_set_conn_acl_report_latency": "0x0200c241", + "ll_set_conn_coded_scheme": "0x0200c271", + "ll_set_conn_latency": "0x0200c29d", + "ll_set_conn_tx_power": "0x0200c2cd", + "ll_set_def_antenna": "0x0200c309", + "ll_set_initiating_coded_scheme": "0x0200c329", + "ll_set_max_conn_number": "0x0200c335", + "ll_set_tx_power_range": "0x0200c3c9", + "nibble_for_char": "0x0201ee1d", + "platform_32k_rc_auto_tune": "0x0201eeb5", + "platform_32k_rc_tune": "0x0201ef01", + "platform_calibrate_32k": "0x0201ef1d", + "platform_call_on_stack": "0x0200213f", + "platform_config": "0x0201ef21", + "platform_controller_run": "0x0201f049", + "platform_delete_timer": "0x0201f07d", + "platform_enable_irq": "0x0201f085", + "platform_get_gen_os_driver": "0x0201f0b9", + "platform_get_link_layer_interf": "0x0201f0c5", + "platform_get_task_handle": "0x0201f0cd", + "platform_get_timer_counter": "0x0201f0e5", + "platform_get_us_time": "0x0201f0e9", + "platform_get_version": "0x0201f0ed", + "platform_hrng": "0x0201f0f5", + "platform_init_controller": "0x0201f0fd", + "platform_os_idle_resumed_hook": "0x0201f119", + "platform_patch_rf_init_data": "0x0201f11d", + "platform_post_sleep_processing": "0x0201f129", + "platform_pre_sleep_processing": "0x0201f12f", + "platform_pre_suppress_ticks_and_sleep_processing": "0x0201f135", + "platform_printf": "0x0201f139", + "platform_raise_assertion": "0x0201f14d", + "platform_rand": "0x0201f161", + "platform_read_info": "0x0201f165", + "platform_read_persistent_reg": "0x0201f195", + "platform_reset": "0x0201f1a1", + "platform_set_abs_timer": "0x0201f1b5", + "platform_set_evt_callback": "0x0201f1b9", + "platform_set_evt_callback_table": "0x0201f1cd", + "platform_set_irq_callback": "0x0201f1d9", + "platform_set_irq_callback_table": "0x0201f1f5", + "platform_set_rf_clk_source": "0x0201f201", + "platform_set_rf_init_data": "0x0201f20d", + "platform_set_rf_power_mapping": "0x0201f219", + "platform_set_timer": "0x0201f225", + "platform_shutdown": "0x0201f229", + "platform_switch_app": "0x0201f22d", + "platform_trace_raw": "0x0201f245", + "platform_write_persistent_reg": "0x0201f25d", + "printf_hexdump": "0x0201f271", + "reverse_128": "0x0201f5e9", + "reverse_24": "0x0201f5ef", + "reverse_256": "0x0201f5f5", + "reverse_48": "0x0201f5fb", + "reverse_56": "0x0201f601", + "reverse_64": "0x0201f607", + "reverse_bd_addr": "0x0201f60d", + "reverse_bytes": "0x0201f613", + "sm_add_event_handler": "0x0201f971", + "sm_address_resolution_lookup": "0x0201fac9", + "sm_authenticated": "0x0201fe45", + "sm_authorization_decline": "0x0201fe53", + "sm_authorization_grant": "0x0201fe73", + "sm_authorization_state": "0x0201fe93", + "sm_bonding_decline": "0x0201fead", + "sm_config": "0x02020301", + "sm_config_conn": "0x02020319", + "sm_encryption_key_size": "0x020204cf", + "sm_just_works_confirm": "0x02020a55", + "sm_le_device_key": "0x02020da1", + "sm_passkey_input": "0x02020e37", + "sm_private_random_address_generation_get": "0x020211f1", + "sm_private_random_address_generation_get_mode": "0x020211f9", + "sm_private_random_address_generation_set_mode": "0x02021205", + "sm_private_random_address_generation_set_update_period": "0x0202122d", + "sm_register_external_ltk_callback": "0x02021369", + "sm_register_oob_data_callback": "0x02021375", + "sm_request_pairing": "0x02021381", + "sm_send_security_request": "0x02021e57", + "sm_set_accepted_stk_generation_methods": "0x02021e7d", + "sm_set_authentication_requirements": "0x02021e89", + "sm_set_encryption_key_size_range": "0x02021e95", + "sscanf_bd_addr": "0x020221f5", + "sysSetPublicDeviceAddr": "0x020226a5", + "uuid128_to_str": "0x02022eed", + "uuid_add_bluetooth_prefix": "0x02022f45", + "uuid_has_bluetooth_prefix": "0x02022f65" } \ No newline at end of file diff --git a/bundles/noos_typical/ING9168xx/meta.json b/bundles/noos_typical/ING9168xx/meta.json index 5297256f5..55d2c4933 100644 --- a/bundles/noos_typical/ING9168xx/meta.json +++ b/bundles/noos_typical/ING9168xx/meta.json @@ -8,11 +8,11 @@ }, "rom": { "base": 33562624, - "size": 144188 + "size": 144260 }, "version": [ 2, 2, - 50 + 52 ] } \ No newline at end of file diff --git a/bundles/noos_typical/ING9168xx/platform.bin b/bundles/noos_typical/ING9168xx/platform.bin index 3099c12a3b6b35d855c80d31ab5314e53d445a42..9c8ecdb84bfd5c4ced605c899765650deccc3e59 100644 GIT binary patch delta 7597 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 YhjXwqY>+HBJu@sxi?i6qY`}{A6a9NHw*UYD delta 7624 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 UEBq!|Mm`mss13D@-Vmt%7dSKL6aWAK diff --git a/bundles/typical/inc/platform_api.h b/bundles/typical/inc/platform_api.h index 82abb7536..f670fd75a 100644 --- a/bundles/typical/inc/platform_api.h +++ b/bundles/typical/inc/platform_api.h @@ -761,7 +761,7 @@ void platform_delete_timer(f_platform_timer_callback callback); * the generic OS interface. * * @param[in] id task identifier - * @param[in] start start address of the new stack + * @param[in] start start (lowest) address of the new stack * @param[in] size size of the new stack in bytes **************************************************************************************** */ @@ -845,6 +845,21 @@ typedef struct platform_hci_link_layer_interf */ const platform_hci_link_layer_interf_t *platform_get_link_layer_interf(void); +typedef void (*f_platform_function)(void *user_data); + +/** + **************************************************************************************** + * @brief Call a function on a separate dedicated stack + * + * @param[in] f the function to be called + * @param[in] user_data user data passed to `f` + * @param[in] start start (lowest) address of the dedicated stack + * @param[in] size size of the dedicated stack in bytes + **************************************************************************************** + */ +void platform_call_on_stack(f_platform_function f, void *user_data, + void *stack_start, uint32_t stack_size); + #ifdef __cplusplus } #endif diff --git a/examples-iar/peripheral_ibeacon/generic_cortex.icf b/examples-iar/peripheral_ibeacon/generic_cortex.icf index 0ea29969b..d045a1473 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__ = 536900792; +define symbol __ICFEDIT_region_IRAM1_start__ = 536900792; 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/peripheral_console/peripheral_console.uvoptx b/examples/peripheral_console/peripheral_console.uvoptx index 9ee986912..5381d66c4 100644 --- a/examples/peripheral_console/peripheral_console.uvoptx +++ b/examples/peripheral_console/peripheral_console.uvoptx @@ -283,8 +283,8 @@ 0 0 0 - .\src\startup_ing91600.s - startup_ing91600.s + .\src\startup_ing91800.s + startup_ing91800.s 0 0 @@ -295,7 +295,7 @@ 0 0 0 - ..\..\bundles\mini\ING9168xx\symdefs.m + ..\..\bundles\mini\ING9187xx\symdefs.m symdefs.m 0 0 diff --git a/examples/peripheral_console/peripheral_console.uvprojx b/examples/peripheral_console/peripheral_console.uvprojx index 65010af25..761293bab 100644 --- a/examples/peripheral_console/peripheral_console.uvprojx +++ b/examples/peripheral_console/peripheral_console.uvprojx @@ -171,7 +171,7 @@ 1 0 0 - "Cortex-M4" + "Cortex-M3" 0 0 @@ -180,7 +180,7 @@ 1 0 0 - 2 + 0 0 0 0 @@ -244,12 +244,12 @@ 0 0x20000000 - 0x8000 + 0x10000 1 - 0x2000000 - 0x200000 + 0x4000 + 0x40000 0 diff --git a/examples/peripheral_console_realtime/peripheral_console_realtime.ingw b/examples/peripheral_console_realtime/peripheral_console_realtime.ingw index 9ba5aa609..df66fe7f7 100644 --- a/examples/peripheral_console_realtime/peripheral_console_realtime.ingw +++ b/examples/peripheral_console_realtime/peripheral_console_realtime.ingw @@ -2,18 +2,18 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 144688, + "size": 144728, "base": 33562624 }, "ram": { - "size": 17020, + "size": 16996, "base": 536870912 }, "app": { "base": 33710080 }, "version": [ - 2,2,50] + 2,2,52] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -70,8 +70,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 15744, - "app_ram_addr": 536887936, + "app_ram_size": 40344, + "app_ram_addr": 536887912, "k5_cc_ver": "6", "printf_enable": true, "ota_ver_patch": "0", diff --git a/examples/peripheral_console_realtime/peripheral_console_realtime.sct b/examples/peripheral_console_realtime/peripheral_console_realtime.sct index 670d1f6db..ab444859a 100644 --- a/examples/peripheral_console_realtime/peripheral_console_realtime.sct +++ b/examples/peripheral_console_realtime/peripheral_console_realtime.sct @@ -9,7 +9,7 @@ LR_IROM1 0x02026000 0x0005A000 { ; load region size_region .ANY (+RO) .ANY (+XO) } -RW_IRAM1 0x20004280 0x00003D80 { ; RW data +RW_IRAM1 0x20004268 0x00009D98 { ; RW data *(.ram_code) *(Veneer$$Code) .ANY (+RW +ZI) diff --git a/examples/peripheral_console_realtime/peripheral_console_realtime.uvproj b/examples/peripheral_console_realtime/peripheral_console_realtime.uvproj index c2da66307..7868dae3b 100644 --- a/examples/peripheral_console_realtime/peripheral_console_realtime.uvproj +++ b/examples/peripheral_console_realtime/peripheral_console_realtime.uvproj @@ -319,8 +319,8 @@ 0 - 536887936 - 15744 + 536887912 + 40344 0 diff --git a/examples/peripheral_console_realtime/peripheral_console_realtime.uvprojx b/examples/peripheral_console_realtime/peripheral_console_realtime.uvprojx index 5a6290bcd..592f3f397 100644 --- a/examples/peripheral_console_realtime/peripheral_console_realtime.uvprojx +++ b/examples/peripheral_console_realtime/peripheral_console_realtime.uvprojx @@ -298,8 +298,8 @@ 0 - 536887936 - 15744 + 536887912 + 40344 0 diff --git a/examples/voice_remote_ctrl/flash_download.ini b/examples/voice_remote_ctrl/flash_download.ini index 36867ca9a..f2353c2d3 100644 --- a/examples/voice_remote_ctrl/flash_download.ini +++ b/examples/voice_remote_ctrl/flash_download.ini @@ -8,7 +8,7 @@ launch=1 batch=1 batch.current=120 batch.limit=-1 -protection.enabled=1 +protection.enabled=0 protection.unlock=1 UseScript=0 script= diff --git a/examples/voice_remote_ctrl/src/audio_input_sim.c b/examples/voice_remote_ctrl/src/audio_input_sim.c index 9850c5cbb..ef1f6deed 100644 --- a/examples/voice_remote_ctrl/src/audio_input_sim.c +++ b/examples/voice_remote_ctrl/src/audio_input_sim.c @@ -38,7 +38,10 @@ uint32_t audio_sample_isr(void *user_data) sample = pcm[pcm_index++]; } else - pcm_index = 0; + { + sample = pcm[0]; + pcm_index = 1; + } audio_rx_sample(sample); diff --git a/examples/voice_remote_ctrl/src/audio_service.c b/examples/voice_remote_ctrl/src/audio_service.c index 1ded4c430..f2dc8b304 100644 --- a/examples/voice_remote_ctrl/src/audio_service.c +++ b/examples/voice_remote_ctrl/src/audio_service.c @@ -16,21 +16,22 @@ static adpcm_enc_t adpcm; #elif (AUDIO_CODEC_ALG == AUDIO_CODEC_ALG_SBC) #include "audio_sbc.h" -static sbc_enc_ctx_t sbc = + +static const struct sbc_frame frame_param = { - .frame = { - #if (EFFECTIVE_SAMPLING_RATE == 16000) - .freq = SBC_FREQ_16K, - #elif - #error unsupported EFFECTIVE_SAMPLING_RATE - #endif - .mode = SBC_MODE_MONO, - .nsubbands = 4, - .nblocks = 8, - .bam = SBC_BAM_LOUDNESS, - .bitpool = 35 - } +#if (EFFECTIVE_SAMPLING_RATE == 16000) + .freq = SBC_FREQ_16K, +#elif + #error unsupported EFFECTIVE_SAMPLING_RATE +#endif + .mode = SBC_MODE_MONO, + .nsubbands = 4, + .nblocks = 8, + .bam = SBC_BAM_LOUDNESS, + .bitpool = 16 }; + +static sbc_enc_ctx_t sbc; #else #error unknown AUDIO_CODEC_ALG #endif @@ -48,8 +49,8 @@ uint16_t byte_index; uint16_t seq_cnt; int8_t mic_dig_gain = 0; -#define SAMPLE_BUF_LEN 128 -#define SAMPLE_BUF_CNT 5 +#define SAMPLE_BUF_LEN 32 +#define SAMPLE_BUF_CNT 15 pcm_sample_t sample_buf[SAMPLE_BUF_CNT][SAMPLE_BUF_LEN]; @@ -69,11 +70,12 @@ void enc_output_cb(uint8_t output, void *param) if (byte_index >= VOICE_BUF_BLOCK_SIZE) { + byte_index = 0; block_index++; - audio_trigger_send(); if (block_index >= VOICE_BUF_BLOCK_NUM) block_index = 0; - byte_index = 0; + + audio_trigger_send(); } } @@ -140,21 +142,25 @@ pcm_sample_t fir_push_run(fir_t *fir, pcm_sample_t x) return r >> 7; } +static void enc_state_reset(void); + void audio_start(void) { LOG_PRINTF(LOG_LEVEL_DEBUG,"Start audio input."); + xQueueReset(xSampleQueue); sample_buf_index = 0; sample_index = 0; block_index = 0; byte_index = 0; + enc_state_reset(); audio_input_start(); } void audio_stop(void) { LOG_PRINTF(LOG_LEVEL_DEBUG,"Stop audio input."); - xQueueReset(xSampleQueue); audio_input_stop(); + xQueueReset(xSampleQueue); } static void audio_task(void *pdata) @@ -170,7 +176,7 @@ static void audio_task(void *pdata) pcm_sample_t *buf; for (;;) { - int16_t index; + int16_t index; if (xQueueReceive(xSampleQueue, &index, portMAX_DELAY ) != pdPASS) continue; @@ -239,6 +245,11 @@ void audio_rx_sample(pcm_sample_t sample) } } +#define STACK_DEPTH (2000/4) + +static StackType_t uxStackBuffer[STACK_DEPTH]; +static StaticTask_t xTaskBuffer; + static void enc_state_init(audio_encoder_t *enc_t); void audio_init(void) @@ -252,17 +263,29 @@ void audio_init(void) ucQueueStorageArea, &xStaticSampleQueue); - xTaskCreate(audio_task, + xTaskCreateStatic(audio_task, "b", - 1024, + STACK_DEPTH, NULL, - (configMAX_PRIORITIES - 14), - NULL); + 2, + uxStackBuffer, + &xTaskBuffer); audio_input_setup(); LOG_PRINTF(LOG_LEVEL_INFO,"Initialization completed."); } +static void enc_state_reset(void) +{ +#if (AUDIO_CODEC_ALG == AUDIO_CODEC_ALG_ADPCM) + +#elif (AUDIO_CODEC_ALG == AUDIO_CODEC_ALG_SBC) + memset(&sbc, 0, sizeof(sbc)); + sbc.frame = frame_param; + sbc_enc_init(&sbc, enc_output_cb, 0); +#endif +} + static void enc_state_init(audio_encoder_t *enc_t) { #if (AUDIO_CODEC_ALG == AUDIO_CODEC_ALG_ADPCM) @@ -271,7 +294,7 @@ static void enc_state_init(audio_encoder_t *enc_t) enc = &adpcm; adpcm_enc_init(enc, enc_output_cb, 0); enc_t->type = ADPCM_ENCODER; - enc_t->sample_buf.num = 2; + enc_t->sample_buf.num = SAMPLE_BUF_CNT; enc_t->sample_buf.size = SAMPLE_BUF_LEN; enc_t->encoder = (fun_encoder)adpcm_encode; LOG_PRINTF_TAB(LOG_LEVEL_INFO,"Parameter configured successfully."); @@ -280,9 +303,9 @@ static void enc_state_init(audio_encoder_t *enc_t) enc_t->type = SBC_ENCODER; LOG_PRINTF_TAB(LOG_LEVEL_INFO,"Encoder-->[SBC]"); enc = &sbc; - sbc_enc_init(enc, enc_output_cb, 0); + enc_state_reset(); LOG_PRINTF_TAB(LOG_LEVEL_INFO,"Configure encode's parameter..."); - enc_t->sample_buf.num = 2; + enc_t->sample_buf.num = SAMPLE_BUF_CNT; enc_t->sample_buf.size = sbc_get_n_of_samples(&sbc); LOG_PRINTF_TAB(LOG_LEVEL_INFO,"Parameter configured successfully."); enc_t->encoder = (fun_encoder)sbc_enc; diff --git a/examples/voice_remote_ctrl/src/audio_service.h b/examples/voice_remote_ctrl/src/audio_service.h index bc24c1693..94a12bd8f 100644 --- a/examples/voice_remote_ctrl/src/audio_service.h +++ b/examples/voice_remote_ctrl/src/audio_service.h @@ -8,7 +8,7 @@ #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 +#define VOICE_BUF_BLOCK_NUM (2100 / VOICE_BUF_BLOCK_SIZE) // total buffer: 4.1KB #elif (APP_TYPE == APP_ANDROID) #define VOICE_BUF_BLOCK_SIZE (128 + 6) #define VOICE_BUF_BLOCK_NUM (4000 / VOICE_BUF_BLOCK_SIZE) diff --git a/examples/voice_remote_ctrl/src/main.c b/examples/voice_remote_ctrl/src/main.c index 306bd0ed8..7854b8e3a 100644 --- a/examples/voice_remote_ctrl/src/main.c +++ b/examples/voice_remote_ctrl/src/main.c @@ -13,6 +13,24 @@ #define PRINT_PORT APB_UART0 +uint32_t cb_hard_fault(hard_fault_info_t *info, void *_) +{ + platform_printf("HARDFAULT:\nPC : 0x%08X\nLR : 0x%08X\nPSR: 0x%08X\n" + "R0 : 0x%08X\nR1 : 0x%08X\nR2 : 0x%08X\nP3 : 0x%08X\n" + "R12: 0x%08X\n", + info->pc, info->lr, info->psr, + info->r0, info->r1, info->r2, info->r3, info->r12); + for (;;); +} + +uint32_t cb_assertion(assertion_info_t *info, void *_) +{ + platform_printf("[ASSERTION] @ %s:%d\n", + info->file_name, + info->line_no); + for (;;); +} + uint32_t cb_putc(char *c, void *dummy) { while (apUART_Check_TXFIFO_FULL(PRINT_PORT) == 1); @@ -160,6 +178,8 @@ int app_main() setup_peripherals(); + platform_set_evt_callback(PLATFORM_CB_EVT_HARD_FAULT, (f_platform_evt_cb)cb_hard_fault, NULL); + platform_set_evt_callback(PLATFORM_CB_EVT_ASSERTION, (f_platform_evt_cb)cb_assertion, NULL); platform_set_evt_callback(PLATFORM_CB_EVT_PROFILE_INIT, setup_profile, NULL); // setup deep sleep handlers @@ -168,8 +188,6 @@ int app_main() // setup putc handle platform_set_evt_callback(PLATFORM_CB_EVT_PUTC, (f_platform_evt_cb)cb_putc, NULL); - audio_init(); - #if (BOARD == BOARD_REM) platform_set_irq_callback(PLATFORM_CB_IRQ_TIMER2, kb_scan_isr, NULL); TMR_Enable(APB_TMR2); diff --git a/examples/voice_remote_ctrl/src/profile.c b/examples/voice_remote_ctrl/src/profile.c index c3b7489f6..d8faa3689 100644 --- a/examples/voice_remote_ctrl/src/profile.c +++ b/examples/voice_remote_ctrl/src/profile.c @@ -128,15 +128,13 @@ static void send_audio_data() return; uint16_t curr = audio_get_curr_block(); - if (next_block != curr) + while (next_block != curr) { if (att_server_notify(handle_send, HANDLE_VOICE_OUTPUT, audio_get_block_buff(next_block), VOICE_BUF_BLOCK_SIZE) != 0) - { - att_server_request_can_send_now_event(handle_send); - return; - } + break; + next_block++; - if (next_block >= VOICE_BUF_BLOCK_NUM) next_block = 0; + if (next_block >= VOICE_BUF_BLOCK_NUM) next_block = 0; } } @@ -215,10 +213,13 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin setup_adv(); break; - case ATT_EVENT_CAN_SEND_NOW: + case HCI_EVENT_NUMBER_OF_COMPLETED_PACKETS: send_audio_data(); break; + case ATT_EVENT_CAN_SEND_NOW: + 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); @@ -229,10 +230,10 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin } } -void test_encoder(void); - uint32_t setup_profile(void *data, void *user_data) { + audio_init(); + att_server_init(att_read_callback, att_write_callback); hci_event_callback_registration.callback = &user_packet_handler; hci_add_event_handler(&hci_event_callback_registration); diff --git a/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj b/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj index 9bfbe1d7f..6318e9920 100644 --- a/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj +++ b/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj @@ -1,10 +1,7 @@ - + - 1.1 -
### uVision Project, (C) Keil Software
- Target 1 @@ -15,27 +12,27 @@ ing91600 INGCHIPS CLOCK(128000000) CPUTYPE("Cortex-M4") FPU2 ELITTLE IROM(0x2000000-0x2200000) IRAM(0x20000000-0x20008000) - - - + + + 0 - - - - - - - - - - - + + + + + + + + + + + 0 - - - - - + + + + + 0 0 @@ -57,8 +54,8 @@ 0 0 - - + + 0 0 0 @@ -67,8 +64,8 @@ 0 0 - - + + 0 0 @@ -76,12 +73,12 @@ 1 0 fromelf.exe --bin -o voice_remote_ctrl.bin ./output/voice_remote_ctrl.axf - + 0 0 0 - + 0 @@ -95,16 +92,16 @@ 0 0 3 - - + + SARMCM3.DLL - + DCM.DLL -pCM3 SARMCM3.DLL - + TCM.DLL -pCM3 @@ -141,17 +138,17 @@ 0 1 - - - - + + + + ..\map.ini - - - - + + + + .\init.ini BIN\UL2CM3.DLL @@ -168,7 +165,7 @@ 1 BIN\UL2CM3.DLL "" () - + @@ -200,7 +197,7 @@ 0 0 "Cortex-M4" - + 0 0 0 @@ -297,8 +294,8 @@ 1 - 0x2028000 - 0x58000 + 33718272 + 360448 1 @@ -322,8 +319,8 @@ 0 - 0x20005448 - 0x2bb8 + 536892488 + 11192 0 @@ -331,7 +328,7 @@ 0x0 - + 1 @@ -350,8 +347,8 @@ --gnu USE_STDPERIPH_DRIVER,AUDIO_INPUT=0,AUDIO_CODEC_ALG=0 - - ../../bundles/typical/inc;../../bundles/typical/inc/os;../../src/BSP;../../src/FWlib;../../src/StartUP/ing916;../../src/Tools;../../src;.\libsbc\include + + .\libsbc\include;../../bundles/typical/inc;../../bundles/typical/inc/os;../../src/BSP;../../src/FWlib;../../src/StartUP/ing916;../../src/Tools;../../src @@ -364,10 +361,10 @@ 0 0 - - - - + + + + @@ -379,12 +376,12 @@ 0 0x00000000 0x00000000 - - - - - - + + + + + + @@ -537,5 +534,4 @@ -
diff --git a/examples/voice_remote_ctrl/voice_remote_ctrl.uvprojx b/examples/voice_remote_ctrl/voice_remote_ctrl.uvprojx index 78c19a7e3..bdd48d967 100644 --- a/examples/voice_remote_ctrl/voice_remote_ctrl.uvprojx +++ b/examples/voice_remote_ctrl/voice_remote_ctrl.uvprojx @@ -1,10 +1,7 @@ - + - 2.1 -
### uVision Project, (C) Keil Software
- Target 1 @@ -19,28 +16,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com IRAM(0x20000000,0x00008000) IROM(0x2000000,0x00200000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ing91600$SVD\ing91600.svd 0 0 - - - - - + + + + + 0 0 @@ -62,8 +59,8 @@ 0 0 - - + + 0 0 0 @@ -72,8 +69,8 @@ 0 0 - - + + 0 0 0 @@ -83,14 +80,14 @@ 1 0 fromelf.exe --bin -o voice_remote_ctrl.bin ./output/voice_remote_ctrl.axf - + 0 0 0 0 0 - + 0 @@ -104,8 +101,8 @@ 0 0 3 - - + + 1 @@ -139,10 +136,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -175,7 +172,7 @@ 0 0 "Cortex-M4" - + 0 0 0 @@ -276,8 +273,8 @@ 1 - 0x2028000 - 0x58000 + 33718272 + 360448 1 @@ -301,8 +298,8 @@ 0 - 0x20005448 - 0x2bb8 + 536892488 + 11192 0 @@ -310,7 +307,7 @@ 0x0 - + 1 @@ -337,10 +334,10 @@ 0 0 - + USE_STDPERIPH_DRIVER,AUDIO_INPUT=0,AUDIO_CODEC_ALG=1 - - ../../bundles/typical/inc;../../bundles/typical/inc/os;../../src/BSP;../../src/FWlib;../../src/StartUP/ing916;../../src/Tools;../../src;.\libsbc\include + + .\libsbc\include;../../bundles/typical/inc;../../bundles/typical/inc/os;../../src/BSP;../../src/FWlib;../../src/StartUP/ing916;../../src/Tools;../../src @@ -355,10 +352,10 @@ 0 4 - - - - + + + + @@ -370,13 +367,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -532,12 +529,11 @@ - - + @@ -545,5 +541,4 @@ -
diff --git a/src/FWlib/peripheral_dma.c b/src/FWlib/peripheral_dma.c index 61bb6de2c..b83b57959 100644 --- a/src/FWlib/peripheral_dma.c +++ b/src/FWlib/peripheral_dma.c @@ -268,12 +268,12 @@ int DMA_PreparePeripheral2Mem(DMA_Descriptor *pDesc, { int status = 0; int req = SYSCTRL_GetDmaId(src); - int width = DMA_GetPeripheralWidth(src); + DMA_TransferWidth width = DMA_GetPeripheralWidth(src); DMA_TransferWidth dest_width; uint8_t src_burst_size; uint32_t peri_addr = (uint32_t)DMA_GetPeripheralDataAddr(src); - if ((req < 0) | (width < 0) | (peri_addr == 0)) return -1; + if ((req < 0) | (peri_addr == 0)) return -1; status = DMA_GetCtrlConfigSrc(src, width, &dest_width, &src_burst_size, size, (uint32_t)dst); if(status) return status; @@ -300,12 +300,12 @@ int DMA_PrepareMem2Peripheral(DMA_Descriptor *pDesc, { int status = 0; int req = SYSCTRL_GetDmaId(dst); - int width = DMA_GetPeripheralWidth(dst); + DMA_TransferWidth width = DMA_GetPeripheralWidth(dst); DMA_TransferWidth src_width; uint8_t src_burst_size; uint32_t peri_addr = (uint32_t)DMA_GetPeripheralDataAddr(dst); - if ((req < 0) | (width < 0) | (peri_addr == 0)) return -1; + if ((req < 0) | (peri_addr == 0)) return -1; status = DMA_GetCtrlConfigDst(dst, &src_width, width, &src_burst_size, size, (uint32_t)src); if(status) return status; @@ -331,16 +331,16 @@ int DMA_PreparePeripheral2Peripheral(DMA_Descriptor *pDesc, { int status = 0; int dst_req = SYSCTRL_GetDmaId(dst); - int dst_width = DMA_GetPeripheralWidth(dst); + DMA_TransferWidth dst_width = DMA_GetPeripheralWidth(dst); uint32_t dst_addr = (uint32_t)DMA_GetPeripheralDataAddr(dst); int src_req = SYSCTRL_GetDmaId(src); - int src_width = DMA_GetPeripheralWidth(src); + DMA_TransferWidth src_width = DMA_GetPeripheralWidth(src); uint32_t src_addr = (uint32_t)DMA_GetPeripheralDataAddr(src); uint8_t src_burst_size; - if ((dst_req < 0) | (dst_width < 0) | (dst_addr == 0)) return -1; - if ((src_req < 0) | (src_width < 0) | (src_addr == 0)) return -2; + if ((dst_req < 0) | (dst_addr == 0)) return -1; + if ((src_req < 0) | (src_addr == 0)) return -2; status = DMA_GetCtrlConfigSrcDst(src_width, dst_width, &src_burst_size, size); if(status) return status; diff --git a/src/FWlib/peripheral_sysctrl.h b/src/FWlib/peripheral_sysctrl.h index 932e1f0ed..e26b70f39 100644 --- a/src/FWlib/peripheral_sysctrl.h +++ b/src/FWlib/peripheral_sysctrl.h @@ -994,16 +994,49 @@ void SYSCTRL_EnablePcapMode(const uint8_t channel_index, uint8_t enable); typedef enum { + // SYS RAM block #0, 16KiB starting from 0x20000000 (0x20000000~0x20003fff) + // This block is always ON, and can't be turned off. + SYSCTRL_SYS_MEM_BLOCK_0 = 0x10, + // SYS RAM block #1, 16KiB following block #0 (0x20004000~0x20007fff) + SYSCTRL_SYS_MEM_BLOCK_1 = 0x08, + // SYS RAM block #2, 16KiB following block #1 (0x20008000~0x2000bfff) + // remapped from `SYSCTRL_MEM_REMAPPABLE_BLOCK_0` + SYSCTRL_SYS_MEM_BLOCK_2 = 0x02, + // SYS RAM block #3, 8KiB following block #2 (0x2000c000~0x2000dfff) + // remapped from `SYSCTRL_MEM_REMAPPABLE_BLOCK_1` + SYSCTRL_SYS_MEM_BLOCK_3 = 0x04, + + // SHARE RAM block #0, 8KiB starting from 0x40120000 (0x40120000~0x0x40121fff) + // This shall not be turned off. + SYSCTRL_SHARE_MEM_BLOCK_0 = 0x01, + // SHARE RAM block #1, 8KiB following block #0 (0x40122000~0x0x40123fff) + // remapped from `SYSCTRL_MEM_REMAPPABLE_BLOCK_1` + SYSCTRL_SHARE_MEM_BLOCK_1 = 0x04, + // SHARE RAM block #2,16KiB following block #1 (0x40124000~0x0x40127fff) + // remapped from `SYSCTRL_MEM_REMAPPABLE_BLOCK_0` + SYSCTRL_SHARE_MEM_BLOCK_2 = 0x02, + + // remapppable memory block 0, 16KiB + // for `mini` and `noos_mini` bundles, this block is mapped to `SYSCTRL_SYS_MEM_BLOCK_2` + // for other variants, this block is mapped to `SYSCTRL_SHARE_MEM_BLOCK_2` + SYSCTRL_MEM_REMAPPABLE_BLOCK_0 = 0x02, + // remapppable memory block 1, 8KiB + // for `mini` and `noos_mini` bundles, this block is mapped to `SYSCTRL_SYS_MEM_BLOCK_3` + // for other variants, this block is mapped to `SYSCTRL_SHARE_MEM_BLOCK_1` + SYSCTRL_MEM_REMAPPABLE_BLOCK_1 = 0x04, + + // below definitions are kept for compatibility SYSCTRL_MEM_BLOCK_0 = 0x10, // block 0 is 16KiB starting from 0x20000000 // This block is always ON, and can't be turned off. SYSCTRL_MEM_BLOCK_1 = 0x08, // block 1 is 16KiB following block 0 + SYSCTRL_SHARE_BLOCK_0 = 0x01, // share memory block 0 is 8KiB starting from 0x40120000 SYSCTRL_SHARE_BLOCK_1 = 0x02, // share memory block 1 is 16KiB following block 2 (0x40124000) SYSCTRL_SHARE_BLOCK_2 = 0x04, // share memory block 2 is 8KiB following block 0 (0x40122000) } SYSCTRL_MemBlock; // this blocks (16 + 8) KiB are reversed in _mini_bundles -#define SYSCTRL_RESERVED_MEM_BLOCKS (SYSCTRL_MEM_BLOCK_0 | SYSCTRL_MEM_BLOCK_1 | SYSCTRL_SHARE_BLOCK_0) +#define SYSCTRL_RESERVED_MEM_BLOCKS (SYSCTRL_SYS_MEM_BLOCK_0 | SYSCTRL_SYS_MEM_BLOCK_1 | SYSCTRL_SHARE_MEM_BLOCK_0) typedef enum { @@ -1016,8 +1049,8 @@ typedef enum * system memory. * * Address and size of each block when used as system memory: - * 1. D-Cache: 8KiB starting from 0x2000E000 - * 2. I-Cache: 8KiB starting from 0x20010000 + * 1. D-Cache: 8KiB starting from `SYSCTRL_D_CACHE_AS_MEM_BASE_ADDR` + * 2. I-Cache: 8KiB starting from `SYSCTRL_I_CACHE_AS_MEM_BASE_ADDR` * * CAUTION: * 1. When used as system memory, more RAM are available, but performance might be degraded; @@ -1030,6 +1063,9 @@ typedef enum */ void SYSCTRL_CacheControl(SYSCTRL_CacheMemCtrl i_cache, SYSCTRL_CacheMemCtrl d_cache); +#define SYSCTRL_D_CACHE_AS_MEM_BASE_ADDR 0x2000E000 +#define SYSCTRL_I_CACHE_AS_MEM_BASE_ADDR 0x20010000 + #endif /** diff --git a/src/Tools/trace.c b/src/Tools/trace.c index 5236b02b3..a03e94af1 100644 --- a/src/Tools/trace.c +++ b/src/Tools/trace.c @@ -423,29 +423,38 @@ static void hex_dump(char *str, uint8_t *buf, f_trace_puts f_puts, uint32_t base } } -void trace_full_dump(f_trace_puts f_puts, int size) +void trace_full_dump2(f_trace_puts f_puts, int sys_size, int share_size) { static char str[46]; static uint8_t buf[HEX_REC_SIZE + 4]; - if (0 == size) + if (0 == sys_size) { #if (INGCHIPS_FAMILY == INGCHIPS_FAMILY_918) - size = 64; + sys_size = 64; #elif (INGCHIPS_FAMILY == INGCHIPS_FAMILY_916) - size = 32; + sys_size = 32; #endif } - sprintf(str, " PC: %08x", (uint32_t)trace_full_dump); f_puts(str); + if (0 == share_size) + { +#if (INGCHIPS_FAMILY == INGCHIPS_FAMILY_918) + share_size = 64; +#elif (INGCHIPS_FAMILY == INGCHIPS_FAMILY_916) + share_size = 32; +#endif + } + + sprintf(str, " PC: %08x", (uint32_t)trace_full_dump2); f_puts(str); sprintf(str, "MSP: %08x", __get_MSP()); f_puts(str); sprintf(str, "PSP: %08x", __get_PSP()); f_puts(str); sprintf(str, "CTL: %08x", __get_CONTROL()); f_puts(str); str[0] = ':'; - hex_dump(str, buf, f_puts, 0x20000000, size); + hex_dump(str, buf, f_puts, 0x20000000, sys_size); #if (INGCHIPS_FAMILY == INGCHIPS_FAMILY_918) - hex_dump(str, buf, f_puts, 0x400A0000, size); + hex_dump(str, buf, f_puts, 0x400A0000, share_size); #elif (INGCHIPS_FAMILY == INGCHIPS_FAMILY_916) - hex_dump(str, buf, f_puts, 0x40120000, size); + hex_dump(str, buf, f_puts, 0x40120000, share_size); #else #error unknown or unsupported chip family #endif diff --git a/src/Tools/trace.h b/src/Tools/trace.h index db840536e..2d54dee4f 100644 --- a/src/Tools/trace.h +++ b/src/Tools/trace.h @@ -216,11 +216,24 @@ typedef int (* f_trace_puts)(const char *str); * @brief dump full memory & registers for later analysis * * @param[in] f_puts callback function for print strings (ending with '\n\0', w/o '\n' or '\r') - * @param[in] size memory block size (64 or 32 or 0) - * when set to 0, actual size is derived from chip family. + * @param[in] sys_size size for SYS RAM in KiB + * For ING918: 64; + * For ING916: + * mini, noos_min: 56 + * others: 32 + * @param[in] share_size size for SHARE RAM in KiB + * For ING918: 64; + * For ING916: + * mini, noos_min: 8 + * others: 32 + * + * These two sizes can be set to 0, then actual size is derived from chip family, which + * may not work for ING916xx as shown above. **************************************************************************************** */ -void trace_full_dump(f_trace_puts f_puts, int size); +void trace_full_dump2(f_trace_puts f_puts, int sys_size, int share_size); + +#define trace_full_dump(f_puts, size) trace_full_dump2(f_puts, size, size) #ifdef __cplusplus } From 49ac3ab7628a8ec263bc5aa1d1dba1853765f0a7 Mon Sep 17 00:00:00 2001 From: unrulife Date: Mon, 30 Oct 2023 14:05:51 +0800 Subject: [PATCH 04/10] Fixed an issue where FLASH would be erased every time it was started when having more than two KV pairs in the FLASH. --- examples/hid_keyboard/src/kv_impl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/hid_keyboard/src/kv_impl.c b/examples/hid_keyboard/src/kv_impl.c index dbfa99e7b..ee23845d8 100644 --- a/examples/hid_keyboard/src/kv_impl.c +++ b/examples/hid_keyboard/src/kv_impl.c @@ -72,7 +72,7 @@ static int kv_flash_repair(uint32_t start, uint32_t end) uint32_t next = next_item(item); if (next >= end) break; - start = end; + start = next; item = (struct kv_item *)start; } From 1f80351fc8b08ef2dccc6e15f29cce5d65efb761 Mon Sep 17 00:00:00 2001 From: zjli2019 Date: Mon, 30 Oct 2023 14:20:21 +0800 Subject: [PATCH 05/10] fix EnableDeepSleepWakeupSource and misc updates --- example_host/rpc_client/app/shell.cpp | 1 - example_host/rpc_client/lib/brpc.c | 15 ++++++++++--- .../peripheral_ibeacon/generic_cortex.icf | 6 ++--- examples/bqb_rf/bqb_rf.ingw | 4 ++-- examples/uart_console/README.md | 1 + examples/uart_console/doc/index.md | 9 ++++++++ .../voice_remote_ctrl/voice_remote_ctrl.ingw | 4 ++-- src/FWlib/peripheral_gpio.c | 22 ++++++++----------- src/FWlib/peripheral_gpio.h | 5 ++++- src/FWlib/peripheral_sysctrl.h | 9 ++++---- src/Tools/port_gen_os_driver.h | 2 +- 11 files changed, 47 insertions(+), 31 deletions(-) diff --git a/example_host/rpc_client/app/shell.cpp b/example_host/rpc_client/app/shell.cpp index 464806a02..a42f4e4db 100644 --- a/example_host/rpc_client/app/shell.cpp +++ b/example_host/rpc_client/app/shell.cpp @@ -221,7 +221,6 @@ 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, addr); gap_set_adv_set_random_addr(0, addr); gap_set_ext_adv_para(0, CONNECTABLE_ADV_BIT | SCANNABLE_ADV_BIT | LEGACY_PDU_BIT, diff --git a/example_host/rpc_client/lib/brpc.c b/example_host/rpc_client/lib/brpc.c index 35f3335c5..99eb2b8d3 100644 --- a/example_host/rpc_client/lib/brpc.c +++ b/example_host/rpc_client/lib/brpc.c @@ -825,8 +825,17 @@ uint32_t sys_aligned_read(uint32_t addr) void sys_aligned_write_mem(uint32_t addr, void *p, int len) { - uint8_t _param[len]; - memcpy(_param, p, len); + #pragma pack (push, 1) + struct _param + { + uint32_t addr; + uint32_t data[len]; + } _param = + { + .addr = addr, + } + #pragma pack (pop) + memcpy(_param.data, p, len); call_void_fun(ID_sys_aligned_write_mem, &_param, sizeof(_param)); } @@ -908,7 +917,7 @@ const uint8_t *sm_private_random_address_generation_get(void) bd_addr_t addr; }; #pragma pack (pop) - struct node * _node = call_fun(ID_gatt_client_get_mtu, NULL, 0); + struct node * _node = call_fun(ID_sm_private_random_address_generation_get, NULL, 0); memcpy(random_address, extract_ret_param(_node, NULL), BD_ADDR_LEN); GEN_OS()->free(_node); return random_address; diff --git a/examples-iar/peripheral_ibeacon/generic_cortex.icf b/examples-iar/peripheral_ibeacon/generic_cortex.icf index d045a1473..8007fef74 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__ = 536900792; +define symbol __ICFEDIT_region_IRAM1_start__ = 536900792; 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/bqb_rf/bqb_rf.ingw b/examples/bqb_rf/bqb_rf.ingw index 724ac16e6..d5150c23c 100644 --- a/examples/bqb_rf/bqb_rf.ingw +++ b/examples/bqb_rf/bqb_rf.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 161672, + "size": 161748, "base": 33562624 }, "ram": { @@ -13,7 +13,7 @@ "base": 33726464 }, "version": [ - 2,2,50] + 2,2,52] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/uart_console/README.md b/examples/uart_console/README.md index 464ca5355..ece1135bb 100644 --- a/examples/uart_console/README.md +++ b/examples/uart_console/README.md @@ -8,6 +8,7 @@ This example demonstrates how to: * Trace Demo: SWD/UART/Flash/Air. * Power Control * Subrating +* Dump through UART Note: Use a serial tool to communicate. CR/LF is used to mark the end of a command. diff --git a/examples/uart_console/doc/index.md b/examples/uart_console/doc/index.md index d8aed2b41..7ff135bba 100644 --- a/examples/uart_console/doc/index.md +++ b/examples/uart_console/doc/index.md @@ -10,6 +10,7 @@ This example demonstrates lots of BLE functionalities controlled through UART: * Different trace sink driver * Power Control * Subrating +* Dump through UART ## Commands @@ -164,6 +165,14 @@ This example has 4 trace sink drivers (i.e. how to export/save trace data): * **FLASH** is selected if `TRACE_TO_FLASH` is defined * **Over the Air (BLE)** is selected if `TRACE_TO_AIR` is defined +## Dump + +Memory dump can be used by Axf Tool for runtime analysis. +This example dumps memory through UART when an assertion is raised. Use `assert` command to +trigger an assertion manually. + +For further information on memory dump, see `trace_full_dump2` in `trace.c`. + ## Test Download this example to a Dev-Board (C), and test varies commands. diff --git a/examples/voice_remote_ctrl/voice_remote_ctrl.ingw b/examples/voice_remote_ctrl/voice_remote_ctrl.ingw index ae5a1ea9a..68cd606e0 100644 --- a/examples/voice_remote_ctrl/voice_remote_ctrl.ingw +++ b/examples/voice_remote_ctrl/voice_remote_ctrl.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 155064, + "size": 155136, "base": 33562624 }, "ram": { @@ -12,7 +12,7 @@ "base": 33718272 }, "version": [ - 2,2,50] + 2,2,52] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/src/FWlib/peripheral_gpio.c b/src/FWlib/peripheral_gpio.c index f4c363ef3..95b2b5002 100644 --- a/src/FWlib/peripheral_gpio.c +++ b/src/FWlib/peripheral_gpio.c @@ -303,20 +303,16 @@ int GIO_EnableDeepSleepWakeupSource(GIO_Index_t io_index, uint8_t enable, else GIO_MaskedWrite((volatile uint32_t *)(AON2_CTRL_BASE + 0x64), io_index - 32, enable); - if (enable == 0) return 0; - - if (pull != PINCTRL_PULL_DISABLE) + uint8_t en = pull != PINCTRL_PULL_DISABLE ? 1 : 0; + if (io_index <= 31) + { + GIO_MaskedWrite((volatile uint32_t *)(AON2_CTRL_BASE + 0x68), io_index, en); + GIO_MaskedWrite((volatile uint32_t *)(AON2_CTRL_BASE + 0x70), io_index, pull == PINCTRL_PULL_UP ? 1 : 0); + } + else { - if (io_index <= 31) - { - GIO_MaskedWrite((volatile uint32_t *)(AON2_CTRL_BASE + 0x68), io_index, 1); - GIO_MaskedWrite((volatile uint32_t *)(AON2_CTRL_BASE + 0x70), io_index, pull == PINCTRL_PULL_UP ? 1 : 0); - } - else - { - GIO_MaskedWrite((volatile uint32_t *)(AON2_CTRL_BASE + 0x6c), io_index - 32, 1); - GIO_MaskedWrite((volatile uint32_t *)(AON2_CTRL_BASE + 0x74), io_index - 32, pull == PINCTRL_PULL_UP ? 1 : 0); - } + GIO_MaskedWrite((volatile uint32_t *)(AON2_CTRL_BASE + 0x6c), io_index - 32, en); + GIO_MaskedWrite((volatile uint32_t *)(AON2_CTRL_BASE + 0x74), io_index - 32, pull == PINCTRL_PULL_UP ? 1 : 0); } } return 0; diff --git a/src/FWlib/peripheral_gpio.h b/src/FWlib/peripheral_gpio.h index 8cb22f855..321845f73 100644 --- a/src/FWlib/peripheral_gpio.h +++ b/src/FWlib/peripheral_gpio.h @@ -291,7 +291,7 @@ void GIO_EnableRetentionGroupB(uint8_t enable); * are kept in HighZ mode even in power saving modes. * * Note: For USB IOs, there are extra internal pull-down resisters, - * so the corresponding GPIOs will be affected by them and can be put into + * so the corresponding GPIOs will be affected by them and can't be put into * High-Z mode actually. * * After enabled, all other GPIO configuration will not take @@ -325,6 +325,9 @@ void GIO_EnableHighZGroupB(uint8_t enable); * 1. `pull` is ignored for GPIO in Group A, for which `pull` shall be configured * by `PINCTRL_Pull(...)`. * + * 1. `pull` for Group B is a dedicated pull circuit which takes effects simultaneously with + * `PINCTRL_Pull`. + * * @param[in] io_index the GPIO ({0-17, 21-25, 29-37}) * @param[in] enable Enable(1)/Disable(0) * @param[in] mode see `GIO_WAKEUP_MODE_...` diff --git a/src/FWlib/peripheral_sysctrl.h b/src/FWlib/peripheral_sysctrl.h index e26b70f39..4d7dfcd49 100644 --- a/src/FWlib/peripheral_sysctrl.h +++ b/src/FWlib/peripheral_sysctrl.h @@ -1006,13 +1006,13 @@ typedef enum // remapped from `SYSCTRL_MEM_REMAPPABLE_BLOCK_1` SYSCTRL_SYS_MEM_BLOCK_3 = 0x04, - // SHARE RAM block #0, 8KiB starting from 0x40120000 (0x40120000~0x0x40121fff) + // SHARE RAM block #0, 8KiB starting from 0x40120000 (0x40120000~0x40121fff) // This shall not be turned off. SYSCTRL_SHARE_MEM_BLOCK_0 = 0x01, - // SHARE RAM block #1, 8KiB following block #0 (0x40122000~0x0x40123fff) + // SHARE RAM block #1, 8KiB following block #0 (0x40122000~0x40123fff) // remapped from `SYSCTRL_MEM_REMAPPABLE_BLOCK_1` SYSCTRL_SHARE_MEM_BLOCK_1 = 0x04, - // SHARE RAM block #2,16KiB following block #1 (0x40124000~0x0x40127fff) + // SHARE RAM block #2,16KiB following block #1 (0x40124000~0x40127fff) // remapped from `SYSCTRL_MEM_REMAPPABLE_BLOCK_0` SYSCTRL_SHARE_MEM_BLOCK_2 = 0x02, @@ -1055,8 +1055,7 @@ typedef enum * CAUTION: * 1. When used as system memory, more RAM are available, but performance might be degraded; * 2. When used as system memory, contents are *NOT* retained in sleep modes; - * 3. These settings are not kept in sleep modes and will restore to defaults during waking up, - * so this function needs to be called each time the system wakes up. + * 3. These settings are not kept in sleep modes and will restore to defaults during waking up. * * @param[in] i_cache usage of I-Cache (default: AS_CACHE) * @param[in] d_cache usage of D-Cache (default: AS_CACHE) diff --git a/src/Tools/port_gen_os_driver.h b/src/Tools/port_gen_os_driver.h index 1c565397e..1aba05424 100644 --- a/src/Tools/port_gen_os_driver.h +++ b/src/Tools/port_gen_os_driver.h @@ -125,7 +125,7 @@ typedef struct gen_os_driver /** **************************************************************************************** -* @brief Get the RTOS driver from an implentation +* @brief Get the RTOS driver from an implementation **************************************************************************************** */ const gen_os_driver_t *os_impl_get_driver(void); From cb15b704d1275f795fdbfd214e6025c35a846133 Mon Sep 17 00:00:00 2001 From: zjli2019 Date: Thu, 2 Nov 2023 11:56:13 +0800 Subject: [PATCH 06/10] prepare v8.4.5 rc --- bundles/exp/ING9187xx/apis.json | 724 ++++++++--------- bundles/exp/ING9187xx/meta.json | 4 +- bundles/exp/ING9187xx/platform.bin | Bin 147100 -> 147176 bytes bundles/exp/ING9188xx/apis.json | 762 +++++++++--------- bundles/exp/ING9188xx/meta.json | 4 +- bundles/exp/ING9188xx/platform.bin | Bin 154008 -> 154084 bytes bundles/exp/inc/gap.h | 4 +- bundles/exp/inc/ll_api.h | 51 ++ bundles/exp/inc/platform_api.h | 17 +- bundles/extension/ING9168xx/apis.json | 1 + bundles/extension/ING9168xx/meta.json | 2 +- bundles/extension/ING9168xx/platform.bin | Bin 161748 -> 161748 bytes bundles/extension/ING9187xx/apis.json | 697 ++++++++-------- bundles/extension/ING9187xx/meta.json | 4 +- bundles/extension/ING9187xx/platform.bin | Bin 139120 -> 139196 bytes bundles/extension/ING9188xx/apis.json | 737 ++++++++--------- bundles/extension/ING9188xx/meta.json | 4 +- bundles/extension/ING9188xx/platform.bin | Bin 146392 -> 146464 bytes bundles/extension/inc/gap.h | 4 +- bundles/extension/inc/ll_api.h | 51 ++ bundles/mass_conn/ING9168xx/meta.json | 2 +- bundles/mass_conn/ING9168xx/platform.bin | Bin 155136 -> 155136 bytes bundles/mass_conn/ING9187xx/apis.json | 657 +++++++-------- bundles/mass_conn/ING9187xx/meta.json | 4 +- bundles/mass_conn/ING9187xx/platform.bin | Bin 135768 -> 135844 bytes bundles/mass_conn/ING9188xx/apis.json | 685 ++++++++-------- bundles/mass_conn/ING9188xx/meta.json | 4 +- bundles/mass_conn/ING9188xx/platform.bin | Bin 141812 -> 141884 bytes bundles/mass_conn/inc/gap.h | 4 +- bundles/mass_conn/inc/ll_api.h | 53 ++ bundles/mini/ING9168xx/meta.json | 2 +- bundles/mini/ING9168xx/platform.bin | Bin 155620 -> 155620 bytes bundles/mini/ING9187xx/apis.json | 657 +++++++-------- bundles/mini/ING9187xx/meta.json | 4 +- bundles/mini/ING9187xx/platform.bin | Bin 135212 -> 135284 bytes bundles/mini/ING9188xx/apis.json | 685 ++++++++-------- bundles/mini/ING9188xx/meta.json | 4 +- bundles/mini/ING9188xx/platform.bin | Bin 141248 -> 141316 bytes bundles/mini/inc/gap.h | 4 +- bundles/mini/inc/ll_api.h | 53 ++ bundles/noos_exp/ING9187xx/apis.json | 566 ++++++------- bundles/noos_exp/ING9187xx/meta.json | 4 +- bundles/noos_exp/ING9187xx/platform.bin | Bin 136316 -> 136384 bytes bundles/noos_exp/ING9188xx/apis.json | 604 +++++++------- bundles/noos_exp/ING9188xx/meta.json | 4 +- bundles/noos_exp/ING9188xx/platform.bin | Bin 143220 -> 143292 bytes bundles/noos_exp/inc/gap.h | 4 +- bundles/noos_exp/inc/ll_api.h | 51 ++ bundles/noos_exp/inc/platform_api.h | 17 +- bundles/noos_extension/ING9168xx/apis.json | 1 + bundles/noos_extension/ING9168xx/meta.json | 2 +- bundles/noos_extension/ING9168xx/platform.bin | Bin 150868 -> 150868 bytes bundles/noos_extension/ING9187xx/apis.json | 539 ++++++------- bundles/noos_extension/ING9187xx/meta.json | 4 +- bundles/noos_extension/ING9187xx/platform.bin | Bin 128340 -> 128416 bytes bundles/noos_extension/ING9188xx/apis.json | 579 ++++++------- bundles/noos_extension/ING9188xx/meta.json | 4 +- bundles/noos_extension/ING9188xx/platform.bin | Bin 135612 -> 135684 bytes bundles/noos_extension/inc/gap.h | 4 +- bundles/noos_extension/inc/ll_api.h | 51 ++ bundles/noos_mass_conn/ING9168xx/meta.json | 2 +- bundles/noos_mass_conn/ING9168xx/platform.bin | Bin 144264 -> 144264 bytes bundles/noos_mass_conn/ING9187xx/apis.json | 499 ++++++------ bundles/noos_mass_conn/ING9187xx/meta.json | 4 +- bundles/noos_mass_conn/ING9187xx/platform.bin | Bin 124988 -> 125060 bytes bundles/noos_mass_conn/ING9188xx/apis.json | 527 ++++++------ bundles/noos_mass_conn/ING9188xx/meta.json | 6 +- bundles/noos_mass_conn/ING9188xx/platform.bin | Bin 131032 -> 131104 bytes bundles/noos_mass_conn/inc/gap.h | 4 +- bundles/noos_mass_conn/inc/ll_api.h | 53 ++ bundles/noos_mini/ING9168xx/meta.json | 2 +- bundles/noos_mini/ING9168xx/platform.bin | Bin 144728 -> 144728 bytes bundles/noos_mini/ING9187xx/apis.json | 499 ++++++------ bundles/noos_mini/ING9187xx/meta.json | 4 +- bundles/noos_mini/ING9187xx/platform.bin | Bin 124432 -> 124504 bytes bundles/noos_mini/ING9188xx/apis.json | 527 ++++++------ bundles/noos_mini/ING9188xx/meta.json | 4 +- bundles/noos_mini/ING9188xx/platform.bin | Bin 130468 -> 130536 bytes bundles/noos_mini/inc/gap.h | 4 +- bundles/noos_mini/inc/ll_api.h | 53 ++ bundles/noos_typical/ING9168xx/meta.json | 2 +- bundles/noos_typical/ING9168xx/platform.bin | Bin 144260 -> 144260 bytes bundles/noos_typical/ING9187xx/apis.json | 499 ++++++------ bundles/noos_typical/ING9187xx/meta.json | 4 +- bundles/noos_typical/ING9187xx/platform.bin | Bin 124912 -> 124984 bytes bundles/noos_typical/ING9188xx/apis.json | 527 ++++++------ bundles/noos_typical/ING9188xx/meta.json | 4 +- bundles/noos_typical/ING9188xx/platform.bin | Bin 130960 -> 131028 bytes bundles/noos_typical/inc/gap.h | 4 +- bundles/noos_typical/inc/ll_api.h | 53 ++ bundles/typical/ING9168xx/meta.json | 2 +- bundles/typical/ING9168xx/platform.bin | Bin 155136 -> 155136 bytes bundles/typical/ING9187xx/apis.json | 657 +++++++-------- bundles/typical/ING9187xx/meta.json | 4 +- bundles/typical/ING9187xx/platform.bin | Bin 135692 -> 135764 bytes bundles/typical/ING9188xx/apis.json | 685 ++++++++-------- bundles/typical/ING9188xx/meta.json | 4 +- bundles/typical/ING9188xx/platform.bin | Bin 141740 -> 141808 bytes bundles/typical/inc/gap.h | 4 +- bundles/typical/inc/ll_api.h | 53 ++ example_host/rpc_client/inc/brpc_calls.inc | 612 +++++++------- .../rpc_client/inc/brpc_fun_names.inc | 6 + example_host/rpc_client/lib/brpc.c | 16 +- examples-gcc/central_fota/central_fota.ingw | 4 +- examples-gcc/get_started/get_started.ingw | 4 +- .../peripheral_console_liteos.ingw | 4 +- .../peripheral_ibeacon.ingw | 4 +- .../smart_home_hub/smart_home_hub.ingw | 4 +- .../peripheral_ibeacon/generic_cortex.icf | 6 +- .../peripheral_ibeacon.ingw | 4 +- .../peripheral_ibeacon.ingw | 4 +- .../peripheral_ibeacon.ingw | 4 +- examples/.gitignore | 1 - examples/anti_lost_mas/anti_lost_mas.ingw | 4 +- examples/anti_lost_sla/anti_lost_sla.ingw | 4 +- examples/ble_rpc/ble_rpc.ingw | 4 +- examples/ble_rpc/flash_download.ini | 1 + examples/ble_rpc/src/brpc.c | 17 +- examples/ble_rpc/src/brpc_defs.h | 2 +- examples/bqb_rf/bqb_rf.ingw | 2 +- examples/central_cte/central_cte.ingw | 4 +- examples/central_fota/central_fota.ingw | 4 +- .../central_mass_conn/central_mass_conn.ingw | 4 +- .../central_throughput.ingw | 4 +- examples/coremark/coremark.ingw | 4 +- examples/data_logger/data_logger.ingw | 4 +- examples/direct_conn/README.md | 5 + examples/direct_conn/data/advertising.adv | 2 + examples/direct_conn/data/advertising.const | 1 + .../direct_conn/data/advertising.const.tmpl | 2 + examples/direct_conn/data/cube.dat | 45 ++ examples/direct_conn/data/gatt.const | 2 + examples/direct_conn/data/gatt.const.tmpl | 4 + examples/direct_conn/data/gatt.profile | 2 + examples/direct_conn/data/scan_response.adv | 2 + examples/direct_conn/data/scan_response.const | 1 + .../direct_conn/data/scan_response.const.tmpl | 2 + examples/direct_conn/data/setup_soc.cgen | 35 + examples/direct_conn/direct_conn.ingw | 81 ++ examples/direct_conn/direct_conn.uvopt | 368 +++++++++ examples/direct_conn/direct_conn.uvoptx | 353 ++++++++ examples/direct_conn/direct_conn.uvproj | 464 +++++++++++ examples/direct_conn/direct_conn.uvprojx | 466 +++++++++++ examples/direct_conn/doc/index.md | 19 + examples/direct_conn/flash_download.ini | 63 ++ examples/direct_conn/init.ini | 3 + examples/direct_conn/src/main.c | 137 ++++ examples/direct_conn/src/profile.c | 298 +++++++ examples/direct_conn/src/profile.h | 10 + examples/direct_conn/src/startup_ing91800.s | 102 +++ .../ext_ackable_packet.ingw | 4 +- examples/ext_raw_packet/ext_raw_packet.ingw | 4 +- .../ext_raw_packet_noos.ingw | 4 +- examples/gatt_relay/gatt_relay.ingw | 4 +- examples/get_started/get_started.ingw | 4 +- examples/hid_keyboard/hid_keyboard.ingw | 4 +- examples/hid_mouse/hid_mouse.ingw | 4 +- examples/ibeacon_scanner/ibeacon_scanner.ingw | 4 +- examples/io_over_ble_mas/io_over_ble_mas.ingw | 4 +- examples/io_over_ble_sla/io_over_ble_sla.ingw | 4 +- examples/l2cap_psm/l2cap_psm.ingw | 4 +- examples/littleVGL/littleVGL.ingw | 4 +- examples/llsync_light/llsync_light.ingw | 4 +- examples/mesh-light/mesh-light.ingw | 4 +- .../periodic_advertiser.ingw | 4 +- .../periodic_scanner/periodic_scanner.ingw | 4 +- examples/peripheral_ancs/peripheral_ancs.ingw | 4 +- examples/peripheral_band/peripheral_band.ingw | 4 +- .../peripheral_battery.ingw | 4 +- .../peripheral_console.ingw | 4 +- .../peripheral_console_freertos.ingw | 4 +- .../peripheral_console_realtime.ingw | 2 +- .../peripheral_console_rt-thread.ingw | 4 +- examples/peripheral_etag/peripheral_etag.ingw | 4 +- .../peripheral_ibeacon.ingw | 4 +- examples/peripheral_irc/peripheral_irc.ingw | 4 +- examples/peripheral_led/peripheral_led.ingw | 4 +- .../peripheral_mass_conn.ingw | 4 +- .../peripheral_pedometer.ingw | 4 +- .../peripheral_piano/peripheral_piano.ingw | 4 +- .../peripheral_throughput.ingw | 4 +- examples/reset_handler/reset_handler.ingw | 4 +- examples/secondary_fota/secondary_fota.ingw | 4 +- examples/smart_meter/smart_meter.ingw | 4 +- examples/thermo_ota/thermo_ota.ingw | 4 +- examples/uart_console/uart_console.ingw | 4 +- .../voice_remote_ctrl/voice_remote_ctrl.ingw | 2 +- src/Tools/btstack_mt.h | 4 +- src/Tools/btstack_mt.inc | 12 +- 189 files changed, 9716 insertions(+), 6650 deletions(-) create mode 100644 examples/direct_conn/README.md create mode 100644 examples/direct_conn/data/advertising.adv create mode 100644 examples/direct_conn/data/advertising.const create mode 100644 examples/direct_conn/data/advertising.const.tmpl create mode 100644 examples/direct_conn/data/cube.dat create mode 100644 examples/direct_conn/data/gatt.const create mode 100644 examples/direct_conn/data/gatt.const.tmpl create mode 100644 examples/direct_conn/data/gatt.profile create mode 100644 examples/direct_conn/data/scan_response.adv create mode 100644 examples/direct_conn/data/scan_response.const create mode 100644 examples/direct_conn/data/scan_response.const.tmpl create mode 100644 examples/direct_conn/data/setup_soc.cgen create mode 100644 examples/direct_conn/direct_conn.ingw create mode 100644 examples/direct_conn/direct_conn.uvopt create mode 100644 examples/direct_conn/direct_conn.uvoptx create mode 100644 examples/direct_conn/direct_conn.uvproj create mode 100644 examples/direct_conn/direct_conn.uvprojx create mode 100644 examples/direct_conn/doc/index.md create mode 100644 examples/direct_conn/flash_download.ini create mode 100644 examples/direct_conn/init.ini create mode 100644 examples/direct_conn/src/main.c create mode 100644 examples/direct_conn/src/profile.c create mode 100644 examples/direct_conn/src/profile.h create mode 100644 examples/direct_conn/src/startup_ing91800.s diff --git a/bundles/exp/ING9187xx/apis.json b/bundles/exp/ING9187xx/apis.json index 2aaa61e6a..416ac810b 100644 --- a/bundles/exp/ING9187xx/apis.json +++ b/bundles/exp/ING9187xx/apis.json @@ -1,363 +1,365 @@ { - "att_dispatch_client_can_send_now": "0x00005751", - "att_dispatch_client_request_can_send_now_event": "0x00005757", - "att_dispatch_register_client": "0x0000575d", - "att_dispatch_register_server": "0x00005771", - "att_dispatch_server_can_send_now": "0x00005785", - "att_dispatch_server_request_can_send_now_event": "0x0000578b", - "att_emit_general_event": "0x0000583d", - "att_server_can_send_packet_now": "0x00005f6d", - "att_server_deferred_read_response": "0x00005f71", - "att_server_get_mtu": "0x00005f89", - "att_server_indicate": "0x00006001", - "att_server_init": "0x00006085", - "att_server_notify": "0x000060c1", - "att_server_register_packet_handler": "0x000061d9", - "att_server_request_can_send_now_event": "0x000061e5", - "att_set_db": "0x00006201", - "att_set_read_callback": "0x00006215", - "att_set_write_callback": "0x00006221", - "bd_addr_cmp": "0x00006391", - "bd_addr_copy": "0x00006397", - "bd_addr_to_str": "0x000063a1", - "big_endian_read_16": "0x000063d9", - "big_endian_read_32": "0x000063e1", - "big_endian_store_16": "0x000063f5", - "big_endian_store_32": "0x00006401", - "btstack_config": "0x00006555", - "btstack_memory_pool_create": "0x00006693", - "btstack_memory_pool_free": "0x000066bd", - "btstack_memory_pool_get": "0x0000671d", - "btstack_push_user_msg": "0x00006785", - "btstack_push_user_runnable": "0x00006791", - "btstack_reset": "0x0000679d", - "char_for_nibble": "0x00006aaf", - "eTaskConfirmSleepModeStatus": "0x00006d95", - "gap_add_dev_to_periodic_list": "0x00007391", - "gap_add_whitelist": "0x000073a1", - "gap_aes_encrypt": "0x000073ad", - "gap_clear_white_lists": "0x000073e5", - "gap_clr_adv_set": "0x000073f1", - "gap_clr_periodic_adv_list": "0x000073fd", - "gap_create_connection_cancel": "0x00007409", - "gap_disconnect": "0x00007415", - "gap_disconnect_all": "0x00007441", - "gap_ext_create_connection": "0x00007481", - "gap_get_connection_parameter_range": "0x00007575", - "gap_le_read_channel_map": "0x000075b1", - "gap_periodic_adv_create_sync": "0x0000761d", - "gap_periodic_adv_create_sync_cancel": "0x00007641", - "gap_periodic_adv_term_sync": "0x0000764d", - "gap_read_local_tx_power_level": "0x000076e1", - "gap_read_periodic_adv_list_size": "0x000076f1", - "gap_read_phy": "0x000076fd", - "gap_read_remote_tx_power_level": "0x00007709", - "gap_read_remote_used_features": "0x00007719", - "gap_read_remote_version": "0x00007725", - "gap_read_rssi": "0x00007731", - "gap_remove_whitelist": "0x0000773d", - "gap_rmv_adv_set": "0x000077b9", - "gap_rmv_dev_from_periodic_list": "0x000077c5", - "gap_rx_test_v2": "0x000077d5", - "gap_set_adv_set_random_addr": "0x0000780d", - "gap_set_callback_for_next_hci": "0x00007849", - "gap_set_connection_parameter_range": "0x00007869", - "gap_set_data_length": "0x00007881", - "gap_set_def_phy": "0x00007899", - "gap_set_default_subrate": "0x000078a9", - "gap_set_ext_adv_data": "0x000078c5", - "gap_set_ext_adv_enable": "0x000078dd", - "gap_set_ext_adv_para": "0x0000794d", - "gap_set_ext_scan_enable": "0x00007a25", - "gap_set_ext_scan_para": "0x00007a3d", - "gap_set_ext_scan_response_data": "0x00007add", - "gap_set_host_channel_classification": "0x00007af5", - "gap_set_path_loss_reporting_enable": "0x00007b05", - "gap_set_path_loss_reporting_param": "0x00007b15", - "gap_set_periodic_adv_data": "0x00007b31", - "gap_set_periodic_adv_enable": "0x00007ba1", - "gap_set_periodic_adv_para": "0x00007bb1", - "gap_set_phy": "0x00007bc9", - "gap_set_random_device_address": "0x00007be5", - "gap_set_tx_power_reporting_enable": "0x00007c05", - "gap_start_ccm": "0x00007c25", - "gap_subrate_request": "0x00007c6d", - "gap_test_end": "0x00007c89", - "gap_tx_test_v2": "0x00007c95", - "gap_tx_test_v4": "0x00007cad", - "gap_update_connection_parameters": "0x00007cd1", - "gap_vendor_tx_continuous_wave": "0x00007d15", - "gatt_client_cancel_write": "0x0000823d", - "gatt_client_discover_characteristic_descriptors": "0x00008263", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x000082a3", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x000082f3", - "gatt_client_discover_characteristics_for_service": "0x00008343", - "gatt_client_discover_primary_services": "0x00008379", - "gatt_client_discover_primary_services_by_uuid128": "0x000083ab", - "gatt_client_discover_primary_services_by_uuid16": "0x000083ef", - "gatt_client_execute_write": "0x0000842b", - "gatt_client_find_included_services_for_service": "0x00008451", - "gatt_client_get_mtu": "0x0000847f", - "gatt_client_is_ready": "0x00008521", - "gatt_client_listen_for_characteristic_value_updates": "0x00008537", - "gatt_client_prepare_write": "0x00008559", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x00008595", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x000085bf", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x000085c5", - "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x000085f3", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x000085f9", - "gatt_client_read_multiple_characteristic_values": "0x00008627", - "gatt_client_read_value_of_characteristic_using_value_handle": "0x00008657", - "gatt_client_read_value_of_characteristics_by_uuid128": "0x00008685", - "gatt_client_read_value_of_characteristics_by_uuid16": "0x000086d1", - "gatt_client_register_handler": "0x0000871d", - "gatt_client_reliable_write_long_value_of_characteristic": "0x00008729", - "gatt_client_signed_write_without_response": "0x00008b59", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x00008c1d", - "gatt_client_write_client_characteristic_configuration": "0x00008c57", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x00008ca9", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008cb9", - "gatt_client_write_long_value_of_characteristic": "0x00008cf5", - "gatt_client_write_long_value_of_characteristic_with_offset": "0x00008d05", - "gatt_client_write_value_of_characteristic": "0x00008d41", - "gatt_client_write_value_of_characteristic_without_response": "0x00008d77", - "hci_add_event_handler": "0x0000a309", - "hci_power_control": "0x0000aab9", - "hci_register_acl_packet_handler": "0x0000ac6d", - "kv_commit": "0x0000b3e1", - "kv_get": "0x0000b43d", - "kv_init": "0x0000b449", - "kv_init_backend": "0x0000b4c9", - "kv_put": "0x0000b4dd", - "kv_remove": "0x0000b4e9", - "kv_remove_all": "0x0000b51d", - "kv_value_modified": "0x0000b54d", - "kv_value_modified_of_key": "0x0000b569", - "kv_visit": "0x0000b575", - "l2cap_add_event_handler": "0x0000b605", - "l2cap_can_send_packet_now": "0x0000b615", - "l2cap_create_le_credit_based_connection_request": "0x0000b7d1", - "l2cap_credit_based_send": "0x0000b915", - "l2cap_credit_based_send_continue": "0x0000b941", - "l2cap_disconnect": "0x0000b9bd", - "l2cap_get_le_credit_based_connection_credits": "0x0000bc0d", - "l2cap_get_peer_mtu_for_local_cid": "0x0000bc29", - "l2cap_init": "0x0000bffd", - "l2cap_le_send_flow_control_credit": "0x0000c0f3", - "l2cap_max_le_mtu": "0x0000c3fd", - "l2cap_register_packet_handler": "0x0000c525", - "l2cap_register_service": "0x0000c531", - "l2cap_request_can_send_now_event": "0x0000c641", - "l2cap_request_connection_parameter_update": "0x0000c65b", - "l2cap_send_echo_request": "0x0000cb35", - "l2cap_unregister_service": "0x0000cbf5", - "le_device_db_add": "0x0000cc4d", - "le_device_db_find": "0x0000cd25", - "le_device_db_from_key": "0x0000cd51", - "le_device_db_iter_cur": "0x0000cd59", - "le_device_db_iter_cur_key": "0x0000cd5d", - "le_device_db_iter_init": "0x0000cd61", - "le_device_db_iter_next": "0x0000cd69", - "le_device_db_remove_key": "0x0000cd8f", - "ll_ackable_packet_alloc": "0x0000cdbb", - "ll_ackable_packet_get_status": "0x0000cef5", - "ll_ackable_packet_run": "0x0000cf65", - "ll_ackable_packet_set_tx_data": "0x0000d009", - "ll_adjust_conn_peer_tx_power": "0x0000d031", - "ll_aes_encrypt": "0x0000d05d", - "ll_channel_monitor_alloc": "0x0000d0d9", - "ll_channel_monitor_check_each_pdu": "0x0000d15b", - "ll_channel_monitor_run": "0x0000d1c1", - "ll_config": "0x0000d275", - "ll_dhkey_generated": "0x0000d4c9", - "ll_free": "0x0000d4fd", - "ll_get_conn_events_info": "0x0000d509", - "ll_get_conn_info": "0x0000d5ed", - "ll_get_heap_free_size": "0x0000d639", - "ll_hint_on_ce_len": "0x0000d64d", - "ll_install_ecc_engine": "0x0000d685", - "ll_legacy_adv_set_interval": "0x0000d691", - "ll_lock_frequency": "0x0000d6a1", - "ll_malloc": "0x0000d705", - "ll_p256_key_pair_generated": "0x0000d70d", - "ll_raw_packet_alloc": "0x0000d8c1", - "ll_raw_packet_free": "0x0000d995", - "ll_raw_packet_get_bare_rx_data": "0x0000d9cd", - "ll_raw_packet_get_rx_data": "0x0000da93", - "ll_raw_packet_recv": "0x0000db35", - "ll_raw_packet_send": "0x0000dbf1", - "ll_raw_packet_set_bare_data": "0x0000dcd9", - "ll_raw_packet_set_bare_mode": "0x0000dd17", - "ll_raw_packet_set_param": "0x0000de1d", - "ll_raw_packet_set_tx_data": "0x0000de7b", - "ll_register_hci_acl_previewer": "0x0000dee1", - "ll_scan_set_fixed_channel": "0x0000df45", - "ll_set_adv_access_address": "0x0000e15d", - "ll_set_adv_coded_scheme": "0x0000e169", - "ll_set_conn_acl_report_latency": "0x0000e199", - "ll_set_conn_coded_scheme": "0x0000e1c9", - "ll_set_conn_interval_unit": "0x0000e1f5", - "ll_set_conn_latency": "0x0000e201", - "ll_set_conn_tx_power": "0x0000e231", - "ll_set_def_antenna": "0x0000e26d", - "ll_set_initiating_coded_scheme": "0x0000e289", - "ll_set_max_conn_number": "0x0000e295", - "ll_set_tx_power_range": "0x0000e329", - "ll_unlock_frequency": "0x0000e351", - "nibble_for_char": "0x0001fca5", - "platform_32k_rc_auto_tune": "0x0001fd55", - "platform_32k_rc_tune": "0x0001fdd1", - "platform_calibrate_32k": "0x0001fde5", - "platform_config": "0x0001fde9", - "platform_delete_timer": "0x0001ff0d", - "platform_enable_irq": "0x0001ff15", - "platform_get_current_task": "0x0001ff4d", - "platform_get_gen_os_driver": "0x0001ff71", - "platform_get_heap_status": "0x0001ff79", - "platform_get_link_layer_interf": "0x0001ff91", - "platform_get_task_handle": "0x0001ff99", - "platform_get_timer_counter": "0x0001ffb9", - "platform_get_us_time": "0x0001ffbd", - "platform_get_version": "0x0001ffc1", - "platform_hrng": "0x0001ffc9", - "platform_install_isr_stack": "0x0001ffd1", - "platform_install_task_stack": "0x0001ffdd", - "platform_patch_rf_init_data": "0x00020015", - "platform_printf": "0x00020021", - "platform_raise_assertion": "0x00020035", - "platform_rand": "0x00020049", - "platform_read_info": "0x0002004d", - "platform_read_persistent_reg": "0x0002007d", - "platform_reset": "0x0002008d", - "platform_set_abs_timer": "0x000200b1", - "platform_set_evt_callback": "0x000200b5", - "platform_set_evt_callback_table": "0x000200c9", - "platform_set_irq_callback": "0x000200d5", - "platform_set_irq_callback_table": "0x000200f1", - "platform_set_rf_clk_source": "0x000200fd", - "platform_set_rf_init_data": "0x00020109", - "platform_set_rf_power_mapping": "0x00020115", - "platform_set_timer": "0x00020121", - "platform_shutdown": "0x00020125", - "platform_switch_app": "0x00020129", - "platform_trace_raw": "0x00020155", - "platform_write_persistent_reg": "0x0002016d", - "printf_hexdump": "0x00020321", - "pvPortMalloc": "0x00020e15", - "pvTaskIncrementMutexHeldCount": "0x00020efd", - "pvTimerGetTimerID": "0x00020f15", - "pxPortInitialiseStack": "0x00020f41", - "reverse_128": "0x000210e9", - "reverse_24": "0x000210ef", - "reverse_256": "0x000210f5", - "reverse_48": "0x000210fb", - "reverse_56": "0x00021101", - "reverse_64": "0x00021107", - "reverse_bd_addr": "0x0002110d", - "reverse_bytes": "0x00021113", - "sm_add_event_handler": "0x00021301", - "sm_address_resolution_lookup": "0x00021459", - "sm_authenticated": "0x000217d5", - "sm_authorization_decline": "0x000217e3", - "sm_authorization_grant": "0x00021803", - "sm_authorization_state": "0x00021823", - "sm_bonding_decline": "0x0002183d", - "sm_config": "0x00021c99", - "sm_config_conn": "0x00021cb1", - "sm_encryption_key_size": "0x00021e67", - "sm_just_works_confirm": "0x000223ed", - "sm_le_device_key": "0x00022739", - "sm_passkey_input": "0x000227cf", - "sm_private_random_address_generation_get": "0x00022b89", - "sm_private_random_address_generation_get_mode": "0x00022b91", - "sm_private_random_address_generation_set_mode": "0x00022b9d", - "sm_private_random_address_generation_set_update_period": "0x00022bc5", - "sm_register_external_ltk_callback": "0x00022d01", - "sm_register_oob_data_callback": "0x00022d0d", - "sm_request_pairing": "0x00022d19", - "sm_send_security_request": "0x000237ef", - "sm_set_accepted_stk_generation_methods": "0x00023815", - "sm_set_authentication_requirements": "0x00023821", - "sm_set_encryption_key_size_range": "0x0002382d", - "sscanf_bd_addr": "0x00023bfd", - "sysSetPublicDeviceAddr": "0x00023fb1", - "uuid128_to_str": "0x000245e5", - "uuid_add_bluetooth_prefix": "0x0002463d", - "uuid_has_bluetooth_prefix": "0x0002465d", - "uxListRemove": "0x00024679", - "uxQueueMessagesWaiting": "0x000246a1", - "uxQueueMessagesWaitingFromISR": "0x000246c9", - "uxQueueSpacesAvailable": "0x000246e5", - "uxTaskGetStackHighWaterMark": "0x00024711", - "uxTaskPriorityGet": "0x00024731", - "uxTaskPriorityGetFromISR": "0x0002474d", - "vListInitialise": "0x00024807", - "vListInitialiseItem": "0x0002481d", - "vListInsert": "0x00024823", - "vListInsertEnd": "0x00024853", - "vPortEndScheduler": "0x0002486d", - "vPortEnterCritical": "0x00024899", - "vPortExitCritical": "0x000248dd", - "vPortFree": "0x00024911", - "vPortSuppressTicksAndSleep": "0x000249a5", - "vPortValidateInterruptPriority": "0x00024acd", - "vQueueDelete": "0x00024b29", - "vQueueWaitForMessageRestricted": "0x00024b55", - "vTaskDelay": "0x00024b9d", - "vTaskInternalSetTimeOutState": "0x00024be9", - "vTaskMissedYield": "0x00024bf9", - "vTaskPlaceOnEventList": "0x00024c05", - "vTaskPlaceOnEventListRestricted": "0x00024c3d", - "vTaskPriorityDisinheritAfterTimeout": "0x00024c7d", - "vTaskPrioritySet": "0x00024d29", - "vTaskResume": "0x00024df1", - "vTaskStartScheduler": "0x00024e75", - "vTaskStepTick": "0x00024f05", - "vTaskSuspend": "0x00024f35", - "vTaskSuspendAll": "0x00024ff1", - "vTaskSwitchContext": "0x00025001", - "xPortStartScheduler": "0x000250a9", - "xQueueAddToSet": "0x00025171", - "xQueueCreateCountingSemaphore": "0x00025195", - "xQueueCreateCountingSemaphoreStatic": "0x000251d1", - "xQueueCreateMutex": "0x00025215", - "xQueueCreateMutexStatic": "0x0002522b", - "xQueueCreateSet": "0x00025245", - "xQueueGenericCreate": "0x0002524d", - "xQueueGenericCreateStatic": "0x00025299", - "xQueueGenericReset": "0x00025301", - "xQueueGenericSend": "0x0002538d", - "xQueueGenericSendFromISR": "0x000254f9", - "xQueueGiveFromISR": "0x000255b9", - "xQueueGiveMutexRecursive": "0x0002565d", - "xQueueIsQueueEmptyFromISR": "0x0002569d", - "xQueueIsQueueFullFromISR": "0x000256c1", - "xQueuePeek": "0x000256e9", - "xQueuePeekFromISR": "0x00025811", - "xQueueReceive": "0x0002587d", - "xQueueReceiveFromISR": "0x000259a9", - "xQueueRemoveFromSet": "0x00025a3d", - "xQueueSelectFromSet": "0x00025a5f", - "xQueueSelectFromSetFromISR": "0x00025a71", - "xQueueSemaphoreTake": "0x00025a85", - "xQueueTakeMutexRecursive": "0x00025bf1", - "xTaskCheckForTimeOut": "0x00025c35", - "xTaskCreate": "0x00025ca5", - "xTaskCreateStatic": "0x00025d01", - "xTaskGetCurrentTaskHandle": "0x00025d71", - "xTaskGetSchedulerState": "0x00025d7d", - "xTaskGetTickCount": "0x00025d99", - "xTaskGetTickCountFromISR": "0x00025da5", - "xTaskIncrementTick": "0x00025db5", - "xTaskPriorityDisinherit": "0x00025e81", - "xTaskPriorityInherit": "0x00025f15", - "xTaskRemoveFromEventList": "0x00025fa9", - "xTaskResumeAll": "0x00026029", - "xTaskResumeFromISR": "0x000260f1", - "xTimerCreate": "0x0002617d", - "xTimerCreateStatic": "0x000261b1", - "xTimerCreateTimerTask": "0x000261e9", - "xTimerGenericCommand": "0x00026255", - "xTimerGetExpiryTime": "0x000262c5", - "xTimerGetTimerDaemonTaskHandle": "0x000262e5" + "att_dispatch_client_can_send_now": "0x00005799", + "att_dispatch_client_request_can_send_now_event": "0x0000579f", + "att_dispatch_register_client": "0x000057a5", + "att_dispatch_register_server": "0x000057b9", + "att_dispatch_server_can_send_now": "0x000057cd", + "att_dispatch_server_request_can_send_now_event": "0x000057d3", + "att_emit_general_event": "0x00005885", + "att_server_can_send_packet_now": "0x00005fb5", + "att_server_deferred_read_response": "0x00005fb9", + "att_server_get_mtu": "0x00005fd1", + "att_server_indicate": "0x00006049", + "att_server_init": "0x000060cd", + "att_server_notify": "0x00006109", + "att_server_register_packet_handler": "0x00006221", + "att_server_request_can_send_now_event": "0x0000622d", + "att_set_db": "0x00006249", + "att_set_read_callback": "0x0000625d", + "att_set_write_callback": "0x00006269", + "bd_addr_cmp": "0x000063d9", + "bd_addr_copy": "0x000063df", + "bd_addr_to_str": "0x000063e9", + "big_endian_read_16": "0x00006421", + "big_endian_read_32": "0x00006429", + "big_endian_store_16": "0x0000643d", + "big_endian_store_32": "0x00006449", + "btstack_config": "0x0000659d", + "btstack_memory_pool_create": "0x000066db", + "btstack_memory_pool_free": "0x00006705", + "btstack_memory_pool_get": "0x00006765", + "btstack_push_user_msg": "0x000067cd", + "btstack_push_user_runnable": "0x000067d9", + "btstack_reset": "0x000067e5", + "char_for_nibble": "0x00006af7", + "eTaskConfirmSleepModeStatus": "0x00006ddd", + "gap_add_dev_to_periodic_list": "0x000073d9", + "gap_add_whitelist": "0x000073e9", + "gap_aes_encrypt": "0x000073f5", + "gap_clear_white_lists": "0x0000742d", + "gap_clr_adv_set": "0x00007439", + "gap_clr_periodic_adv_list": "0x00007445", + "gap_create_connection_cancel": "0x00007451", + "gap_disconnect": "0x0000745d", + "gap_disconnect_all": "0x00007489", + "gap_ext_create_connection": "0x000074c9", + "gap_get_connection_parameter_range": "0x000075bd", + "gap_le_read_channel_map": "0x000075f9", + "gap_periodic_adv_create_sync": "0x00007665", + "gap_periodic_adv_create_sync_cancel": "0x00007689", + "gap_periodic_adv_term_sync": "0x00007695", + "gap_read_local_tx_power_level": "0x00007729", + "gap_read_periodic_adv_list_size": "0x00007739", + "gap_read_phy": "0x00007745", + "gap_read_remote_tx_power_level": "0x00007751", + "gap_read_remote_used_features": "0x00007761", + "gap_read_remote_version": "0x0000776d", + "gap_read_rssi": "0x00007779", + "gap_remove_whitelist": "0x00007785", + "gap_rmv_adv_set": "0x00007801", + "gap_rmv_dev_from_periodic_list": "0x0000780d", + "gap_rx_test_v2": "0x0000781d", + "gap_set_adv_set_random_addr": "0x00007855", + "gap_set_callback_for_next_hci": "0x00007891", + "gap_set_connection_parameter_range": "0x000078b1", + "gap_set_data_length": "0x000078c9", + "gap_set_def_phy": "0x000078e1", + "gap_set_default_subrate": "0x000078f1", + "gap_set_ext_adv_data": "0x0000790d", + "gap_set_ext_adv_enable": "0x00007925", + "gap_set_ext_adv_para": "0x00007995", + "gap_set_ext_scan_enable": "0x00007a6d", + "gap_set_ext_scan_para": "0x00007a85", + "gap_set_ext_scan_response_data": "0x00007b25", + "gap_set_host_channel_classification": "0x00007b3d", + "gap_set_path_loss_reporting_enable": "0x00007b4d", + "gap_set_path_loss_reporting_param": "0x00007b5d", + "gap_set_periodic_adv_data": "0x00007b79", + "gap_set_periodic_adv_enable": "0x00007be9", + "gap_set_periodic_adv_para": "0x00007bf9", + "gap_set_phy": "0x00007c11", + "gap_set_random_device_address": "0x00007c2d", + "gap_set_tx_power_reporting_enable": "0x00007c4d", + "gap_start_ccm": "0x00007c6d", + "gap_subrate_request": "0x00007cb5", + "gap_test_end": "0x00007cd1", + "gap_tx_test_v2": "0x00007cdd", + "gap_tx_test_v4": "0x00007cf5", + "gap_update_connection_parameters": "0x00007d19", + "gap_vendor_tx_continuous_wave": "0x00007d5d", + "gatt_client_cancel_write": "0x00008285", + "gatt_client_discover_characteristic_descriptors": "0x000082ab", + "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x000082eb", + "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x0000833b", + "gatt_client_discover_characteristics_for_service": "0x0000838b", + "gatt_client_discover_primary_services": "0x000083c1", + "gatt_client_discover_primary_services_by_uuid128": "0x000083f3", + "gatt_client_discover_primary_services_by_uuid16": "0x00008437", + "gatt_client_execute_write": "0x00008473", + "gatt_client_find_included_services_for_service": "0x00008499", + "gatt_client_get_mtu": "0x000084c7", + "gatt_client_is_ready": "0x00008569", + "gatt_client_listen_for_characteristic_value_updates": "0x0000857f", + "gatt_client_prepare_write": "0x000085a1", + "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x000085dd", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x00008607", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x0000860d", + "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x0000863b", + "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x00008641", + "gatt_client_read_multiple_characteristic_values": "0x0000866f", + "gatt_client_read_value_of_characteristic_using_value_handle": "0x0000869f", + "gatt_client_read_value_of_characteristics_by_uuid128": "0x000086cd", + "gatt_client_read_value_of_characteristics_by_uuid16": "0x00008719", + "gatt_client_register_handler": "0x00008765", + "gatt_client_reliable_write_long_value_of_characteristic": "0x00008771", + "gatt_client_signed_write_without_response": "0x00008ba1", + "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x00008c65", + "gatt_client_write_client_characteristic_configuration": "0x00008c9f", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x00008cf1", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008d01", + "gatt_client_write_long_value_of_characteristic": "0x00008d3d", + "gatt_client_write_long_value_of_characteristic_with_offset": "0x00008d4d", + "gatt_client_write_value_of_characteristic": "0x00008d89", + "gatt_client_write_value_of_characteristic_without_response": "0x00008dbf", + "hci_add_event_handler": "0x0000a351", + "hci_power_control": "0x0000ab01", + "hci_register_acl_packet_handler": "0x0000acb5", + "kv_commit": "0x0000b429", + "kv_get": "0x0000b485", + "kv_init": "0x0000b491", + "kv_init_backend": "0x0000b511", + "kv_put": "0x0000b525", + "kv_remove": "0x0000b531", + "kv_remove_all": "0x0000b565", + "kv_value_modified": "0x0000b595", + "kv_value_modified_of_key": "0x0000b5b1", + "kv_visit": "0x0000b5bd", + "l2cap_add_event_handler": "0x0000b64d", + "l2cap_can_send_packet_now": "0x0000b65d", + "l2cap_create_le_credit_based_connection_request": "0x0000b819", + "l2cap_credit_based_send": "0x0000b95d", + "l2cap_credit_based_send_continue": "0x0000b989", + "l2cap_disconnect": "0x0000ba05", + "l2cap_get_le_credit_based_connection_credits": "0x0000bc55", + "l2cap_get_peer_mtu_for_local_cid": "0x0000bc71", + "l2cap_init": "0x0000c045", + "l2cap_le_send_flow_control_credit": "0x0000c13b", + "l2cap_max_le_mtu": "0x0000c445", + "l2cap_register_packet_handler": "0x0000c56d", + "l2cap_register_service": "0x0000c579", + "l2cap_request_can_send_now_event": "0x0000c689", + "l2cap_request_connection_parameter_update": "0x0000c6a3", + "l2cap_send_echo_request": "0x0000cb7d", + "l2cap_unregister_service": "0x0000cc3d", + "le_device_db_add": "0x0000cc95", + "le_device_db_find": "0x0000cd6d", + "le_device_db_from_key": "0x0000cd99", + "le_device_db_iter_cur": "0x0000cda1", + "le_device_db_iter_cur_key": "0x0000cda5", + "le_device_db_iter_init": "0x0000cda9", + "le_device_db_iter_next": "0x0000cdb1", + "le_device_db_remove_key": "0x0000cdd7", + "ll_ackable_packet_alloc": "0x0000ce03", + "ll_ackable_packet_get_status": "0x0000cf3d", + "ll_ackable_packet_run": "0x0000cfad", + "ll_ackable_packet_set_tx_data": "0x0000d051", + "ll_adjust_conn_peer_tx_power": "0x0000d079", + "ll_aes_encrypt": "0x0000d0a5", + "ll_channel_monitor_alloc": "0x0000d121", + "ll_channel_monitor_check_each_pdu": "0x0000d1a3", + "ll_channel_monitor_run": "0x0000d209", + "ll_config": "0x0000d2bd", + "ll_create_conn": "0x0000d2d9", + "ll_dhkey_generated": "0x0000d511", + "ll_free": "0x0000d545", + "ll_get_conn_events_info": "0x0000d551", + "ll_get_conn_info": "0x0000d635", + "ll_get_heap_free_size": "0x0000d681", + "ll_hint_on_ce_len": "0x0000d695", + "ll_install_ecc_engine": "0x0000d6cd", + "ll_legacy_adv_set_interval": "0x0000d6d9", + "ll_lock_frequency": "0x0000d6e9", + "ll_malloc": "0x0000d74d", + "ll_p256_key_pair_generated": "0x0000d755", + "ll_raw_packet_alloc": "0x0000d909", + "ll_raw_packet_free": "0x0000d9dd", + "ll_raw_packet_get_bare_rx_data": "0x0000da15", + "ll_raw_packet_get_rx_data": "0x0000dadb", + "ll_raw_packet_recv": "0x0000db7d", + "ll_raw_packet_send": "0x0000dc39", + "ll_raw_packet_set_bare_data": "0x0000dd21", + "ll_raw_packet_set_bare_mode": "0x0000dd5f", + "ll_raw_packet_set_param": "0x0000de65", + "ll_raw_packet_set_tx_data": "0x0000dec3", + "ll_register_hci_acl_previewer": "0x0000df29", + "ll_scan_set_fixed_channel": "0x0000df8d", + "ll_set_adv_access_address": "0x0000e1a5", + "ll_set_adv_coded_scheme": "0x0000e1b1", + "ll_set_conn_acl_report_latency": "0x0000e1e1", + "ll_set_conn_coded_scheme": "0x0000e211", + "ll_set_conn_interval_unit": "0x0000e23d", + "ll_set_conn_latency": "0x0000e249", + "ll_set_conn_tx_power": "0x0000e279", + "ll_set_def_antenna": "0x0000e2b5", + "ll_set_initiating_coded_scheme": "0x0000e2d1", + "ll_set_max_conn_number": "0x0000e2dd", + "ll_set_tx_power_range": "0x0000e371", + "ll_unlock_frequency": "0x0000e399", + "nibble_for_char": "0x0001fced", + "platform_32k_rc_auto_tune": "0x0001fd9d", + "platform_32k_rc_tune": "0x0001fe19", + "platform_calibrate_32k": "0x0001fe2d", + "platform_call_on_stack": "0x00004183", + "platform_config": "0x0001fe31", + "platform_delete_timer": "0x0001ff55", + "platform_enable_irq": "0x0001ff5d", + "platform_get_current_task": "0x0001ff95", + "platform_get_gen_os_driver": "0x0001ffb9", + "platform_get_heap_status": "0x0001ffc1", + "platform_get_link_layer_interf": "0x0001ffd9", + "platform_get_task_handle": "0x0001ffe1", + "platform_get_timer_counter": "0x00020001", + "platform_get_us_time": "0x00020005", + "platform_get_version": "0x00020009", + "platform_hrng": "0x00020011", + "platform_install_isr_stack": "0x00020019", + "platform_install_task_stack": "0x00020025", + "platform_patch_rf_init_data": "0x0002005d", + "platform_printf": "0x00020069", + "platform_raise_assertion": "0x0002007d", + "platform_rand": "0x00020091", + "platform_read_info": "0x00020095", + "platform_read_persistent_reg": "0x000200c5", + "platform_reset": "0x000200d5", + "platform_set_abs_timer": "0x000200f9", + "platform_set_evt_callback": "0x000200fd", + "platform_set_evt_callback_table": "0x00020111", + "platform_set_irq_callback": "0x0002011d", + "platform_set_irq_callback_table": "0x00020139", + "platform_set_rf_clk_source": "0x00020145", + "platform_set_rf_init_data": "0x00020151", + "platform_set_rf_power_mapping": "0x0002015d", + "platform_set_timer": "0x00020169", + "platform_shutdown": "0x0002016d", + "platform_switch_app": "0x00020171", + "platform_trace_raw": "0x0002019d", + "platform_write_persistent_reg": "0x000201b5", + "printf_hexdump": "0x00020369", + "pvPortMalloc": "0x00020e5d", + "pvTaskIncrementMutexHeldCount": "0x00020f45", + "pvTimerGetTimerID": "0x00020f5d", + "pxPortInitialiseStack": "0x00020f89", + "reverse_128": "0x00021131", + "reverse_24": "0x00021137", + "reverse_256": "0x0002113d", + "reverse_48": "0x00021143", + "reverse_56": "0x00021149", + "reverse_64": "0x0002114f", + "reverse_bd_addr": "0x00021155", + "reverse_bytes": "0x0002115b", + "sm_add_event_handler": "0x00021349", + "sm_address_resolution_lookup": "0x000214a1", + "sm_authenticated": "0x0002181d", + "sm_authorization_decline": "0x0002182b", + "sm_authorization_grant": "0x0002184b", + "sm_authorization_state": "0x0002186b", + "sm_bonding_decline": "0x00021885", + "sm_config": "0x00021ce1", + "sm_config_conn": "0x00021cf9", + "sm_encryption_key_size": "0x00021eaf", + "sm_just_works_confirm": "0x00022435", + "sm_le_device_key": "0x00022781", + "sm_passkey_input": "0x00022817", + "sm_private_random_address_generation_get": "0x00022bd1", + "sm_private_random_address_generation_get_mode": "0x00022bd9", + "sm_private_random_address_generation_set_mode": "0x00022be5", + "sm_private_random_address_generation_set_update_period": "0x00022c0d", + "sm_register_external_ltk_callback": "0x00022d49", + "sm_register_oob_data_callback": "0x00022d55", + "sm_request_pairing": "0x00022d61", + "sm_send_security_request": "0x00023837", + "sm_set_accepted_stk_generation_methods": "0x0002385d", + "sm_set_authentication_requirements": "0x00023869", + "sm_set_encryption_key_size_range": "0x00023875", + "sscanf_bd_addr": "0x00023c45", + "sysSetPublicDeviceAddr": "0x00023ff9", + "uuid128_to_str": "0x0002462d", + "uuid_add_bluetooth_prefix": "0x00024685", + "uuid_has_bluetooth_prefix": "0x000246a5", + "uxListRemove": "0x000246c1", + "uxQueueMessagesWaiting": "0x000246e9", + "uxQueueMessagesWaitingFromISR": "0x00024711", + "uxQueueSpacesAvailable": "0x0002472d", + "uxTaskGetStackHighWaterMark": "0x00024759", + "uxTaskPriorityGet": "0x00024779", + "uxTaskPriorityGetFromISR": "0x00024795", + "vListInitialise": "0x0002484f", + "vListInitialiseItem": "0x00024865", + "vListInsert": "0x0002486b", + "vListInsertEnd": "0x0002489b", + "vPortEndScheduler": "0x000248b5", + "vPortEnterCritical": "0x000248e1", + "vPortExitCritical": "0x00024925", + "vPortFree": "0x00024959", + "vPortSuppressTicksAndSleep": "0x000249ed", + "vPortValidateInterruptPriority": "0x00024b15", + "vQueueDelete": "0x00024b71", + "vQueueWaitForMessageRestricted": "0x00024b9d", + "vTaskDelay": "0x00024be5", + "vTaskInternalSetTimeOutState": "0x00024c31", + "vTaskMissedYield": "0x00024c41", + "vTaskPlaceOnEventList": "0x00024c4d", + "vTaskPlaceOnEventListRestricted": "0x00024c85", + "vTaskPriorityDisinheritAfterTimeout": "0x00024cc5", + "vTaskPrioritySet": "0x00024d71", + "vTaskResume": "0x00024e39", + "vTaskStartScheduler": "0x00024ebd", + "vTaskStepTick": "0x00024f4d", + "vTaskSuspend": "0x00024f7d", + "vTaskSuspendAll": "0x00025039", + "vTaskSwitchContext": "0x00025049", + "xPortStartScheduler": "0x000250f1", + "xQueueAddToSet": "0x000251b9", + "xQueueCreateCountingSemaphore": "0x000251dd", + "xQueueCreateCountingSemaphoreStatic": "0x00025219", + "xQueueCreateMutex": "0x0002525d", + "xQueueCreateMutexStatic": "0x00025273", + "xQueueCreateSet": "0x0002528d", + "xQueueGenericCreate": "0x00025295", + "xQueueGenericCreateStatic": "0x000252e1", + "xQueueGenericReset": "0x00025349", + "xQueueGenericSend": "0x000253d5", + "xQueueGenericSendFromISR": "0x00025541", + "xQueueGiveFromISR": "0x00025601", + "xQueueGiveMutexRecursive": "0x000256a5", + "xQueueIsQueueEmptyFromISR": "0x000256e5", + "xQueueIsQueueFullFromISR": "0x00025709", + "xQueuePeek": "0x00025731", + "xQueuePeekFromISR": "0x00025859", + "xQueueReceive": "0x000258c5", + "xQueueReceiveFromISR": "0x000259f1", + "xQueueRemoveFromSet": "0x00025a85", + "xQueueSelectFromSet": "0x00025aa7", + "xQueueSelectFromSetFromISR": "0x00025ab9", + "xQueueSemaphoreTake": "0x00025acd", + "xQueueTakeMutexRecursive": "0x00025c39", + "xTaskCheckForTimeOut": "0x00025c7d", + "xTaskCreate": "0x00025ced", + "xTaskCreateStatic": "0x00025d49", + "xTaskGetCurrentTaskHandle": "0x00025db9", + "xTaskGetSchedulerState": "0x00025dc5", + "xTaskGetTickCount": "0x00025de1", + "xTaskGetTickCountFromISR": "0x00025ded", + "xTaskIncrementTick": "0x00025dfd", + "xTaskPriorityDisinherit": "0x00025ec9", + "xTaskPriorityInherit": "0x00025f5d", + "xTaskRemoveFromEventList": "0x00025ff1", + "xTaskResumeAll": "0x00026071", + "xTaskResumeFromISR": "0x00026139", + "xTimerCreate": "0x000261c5", + "xTimerCreateStatic": "0x000261f9", + "xTimerCreateTimerTask": "0x00026231", + "xTimerGenericCommand": "0x0002629d", + "xTimerGetExpiryTime": "0x0002630d", + "xTimerGetTimerDaemonTaskHandle": "0x0002632d" } \ No newline at end of file diff --git a/bundles/exp/ING9187xx/meta.json b/bundles/exp/ING9187xx/meta.json index f84a42543..18acb5d35 100644 --- a/bundles/exp/ING9187xx/meta.json +++ b/bundles/exp/ING9187xx/meta.json @@ -8,11 +8,11 @@ }, "rom": { "base": 16384, - "size": 147100 + "size": 147176 }, "version": [ 1, 9, - 38 + 39 ] } \ No newline at end of file diff --git a/bundles/exp/ING9187xx/platform.bin b/bundles/exp/ING9187xx/platform.bin index 339b2e36705ef513b518ea88bcad632266d47649..7e1737c71842f51e9bace0d7060e49c4991134af 100644 GIT binary patch delta 7235 zcmZ{p33yahmdDSzwWKN=*(w_ZUJ@gO5J`X#LRbnm98Kirmh(&aF?~7@C^-;+e^RGKSqejosrn;ZXvYtiqnerm0zdoVva{*&%g#-_ z-%qYvT{v>ZwJ;!)L)l^%+uWnVZSG37f6QDEC^K?6M znX5fHfyvCr^;tn_A;wf9E>+{G^OJ+eJzIkQ?zChqQ2HU4roZais)kg1Mn&Jp(XLrU zs-$?XHBlAYJOAawgG8EZmgn)9-`Z7PmFM2xW0+TZYWl>mN`F{?TpQ%vRZesSRvSI- z+S^KvnCDrX{FK$+G+$9zjefK5<0_<7U*B&zH+e4gyQZ91iiwtDlD2y;r9EwTy;7~H zcx=h=f(Hv8m^wTqW6)znP5S0RxeBE}88n+a^wh!0w%8g)ujrEomxdHCRHO>I*wPvQ zezCrLaQ2|bkSFOIZA5vdd>Qg}Q@#kf9HqqOJmg_Ddc=_aifZ&xLq-YK5BZ&~9}JrG z)U2NA-;3u5sI%b)^|N-ge;1agP%y78tR0@AN`-lQ{`!lwv`9Q%mKDQIdUIBCqV$-( zjzzRp!_HFTtR7dV=I*;*9=4%rX;G7YJZnjOhUv(s7};SWdrKTSn72@WaOnKTwpB!% z7LzufNfUpchFON$j}4H2LL-5NzC!g#@0Uhl_bBAKcdM&C_zueW?W&OX!CmKOA6zQ+ zd7CXi=(sCSKB(2GKyzrvADpNcWUo!^M0RAMzasm=iD<%~R-LyGJ*%J2F11O||5eW% z7MUZGWn5%+?7Xn*{CT8#$4HvSSU9RM29T{Ks@hqdfBmlm$5fA-+f==2u8d8?u$c7U z|Ex9Dx$V$FqEXFO z`G}sLyClMadi=I=$O~Jjzm*%EKv4g0@94I8_mO@&w`YpP;i8A!lW*(8t$N$7_1ah#3ASefNlD-liWPF_z2q@R2=vk0*WPuLF>1 zzkj;Zxe-Hw-B<5PD9E<+MbEU-Tq{gkCUjZ&C(q_73#=jcELU^{?^loF)w%rTUurzN z%g-xyf1Uoq%wM^N)G7LMIcbm7R?Vrdtf{=Ol4zDE^Wo`=Kl3!t{-X;2MQtk-ec+i@ zVQ`4_Rc3iprOakxWgqN{{K~QT+*p~7&-TjEhydM{PqV11p2la$e90)7pN!9%`E&4j zZ2mQT9$v5jpQ+V4#=pJVx4bI#keaprpz>VJI2fF)$xfWLo5<3+@O{;}yq$`d7M0if z_viQK=w>dI{aLaw&E;L2-o0B(A6;$=^X=c}g=xq?u+YF~-J&JDGI;&N6NwuRe3_}vP zM0!}iWJ0(&B0=Px>#KZDdQL9+LUFCWZ~1vOV4nWcqdRz=p0nZ!=d}GqXED1~o}()k z*?EtixwaC~eaqTxt2F#?jq_~>upp0la+-EpxZHE{3B!hYYH6OMRNf-bkI&ed+w>dH zPOyEnNKu`qY_p;GjK}u;BE_G2mc8(VRYk4wT>Z^etBUzv|L>R20iMsdy=NEobFW@? z@HWrJJ>LZIYo4n8X(3opEr&g^+~6tr>wmB<32UXnlkim!m#oQ4XRKVMhhH_g%5&^$ zky1%@dc=*d0nd*&dRtV&6i-C=a{+OG!W31FWSjubyc39YflEpI{KMwwT8uU;R|fJC zcR~-|$>-edJ@{2_F)G6NV|K+2W5Sxu%9vAITe+l8mL;{hM@I0kd8KhYf+KOx8K)!p z&x+fOebM|3^OMHNSRRN9jk+XW>*N=W3u%1E$@|>VM|%h z)M{+aVJ!7d_oZCki4iki7{P@R+-jVBfP<8Bo;1!)zgzGXFF3Q>JhL zhTcdo=R1n880j;4tb^AX%PKh_j!zr)>v*gJ+t+ihvQ@p$)L?Ws@l1y8jK|TYGv`a( z9!`o6ZBOzaInXPkiJUKur=H^5K`6ZO1?~~ZE$%Jb(Cro@WjjC0{H%NH4t^8bf}K1T zoo(L9eU!4Ualg^ZPuVY=VM;%14E-&~Tf7r?+?ckDu}Y>IA#Y0aA?}(z+=st6n)hIw zog-_BzV#5TcF%Z=U*^5WmAAOk65jd~(~%W8l1eNZb)IOOWz@XOYnk6PzV&cVt9|bx zqWm8W`$0ZuhTvynBS-3dC$y{F#daxy;yolAmw}9__7YQa?rM3C7SfJe2vmQFoS~4sjO5DC!=d zXr;UR66ZR%A~^zE<%B!`M{dMqAO4X?Tb(Oiik?RZ-sE;(<202yz!-Xs-(&uF0(7GVEY58(r8ImZ>z&^5U@C?!oU>CR^ya~<*e*#l9cYd~tGd{joUE%&xQ-YN!7&Tjh$@{DWLy@*c`SdoF zj9BkJ*H86s42M1fX<;N71xA6rKo=F$vJs&91SyNHZs@19 zfAt9`>_%c2-mQ4$Y5sz!vsez4BMFdRIX>WCrT4<=<9E&K; zW^W!8C*X0=9}&ZR)# z+m!Fs^78t446zW4f@Y;?>IhQHt z!N+LGGIRMDkb&^At(CB+?Dh=P-?7?=5izh?@)BWhg@$H|-rbs^V&c9)GeuZxsitW$ zgO;!BQJ+%60H40;41LD;qah8$(ekD*DIDc3_EZOUsjYoj&BOsv(Wc^j5W*P+r_v-=HNU|^QnzIM%f1 zTfKWHnR<20W{We2s0$lqmz(G|=-P$|&2~-FUFleImA!}tk*V?DKH2 z$t)k89CmCc3goLWZ@$ywqr(<+Zz4nsyR7NK&R2xCs4nza3MOM=-bVf@Gwl*$NUz8gSmU&j*aEk4 z5>5fTVBg2v!L{BIy@?amTd%{VO+vdjsWIBCxQPP3IgHfC%FqNyYxUw7Huxe*OT$Qa z1tn<{q(U^9@+xS{xZ9)ird_Jo*;n1w=Sn>&zgx`tp1FWQ3NrE@NT}H_vh6^8vFHlq;4zHlG-H=bFtOU{H2fN-(at^srxtu{M zedUD0FMrTCO6=c@(@k7swg;vN1{Y+#7(i228Otq8#H_I!5GW+JJmB-FR0a0U{g)BsgqG0f`IW;w+W@ zKFi586x{a{Iw*bmKYE^x{E+YP8xmLs=71y7vEkt6P^Mh)(jdm27(ZP~9^Q`I82?ca zW-!wL@RY_h8r)pTln17QW59$erm=&tsYjc7xNv zY1K>*f~hr3)4>j~9JE0{1I$^#^bptz&IG#`GCd4t)nZh^yap&{O9m8k!0q5%a2I+| z0lH9d5|+yq3w}Dr;BW8CGzd&@#iClN$la2wdNuZfR0gdrGRhU7n(Mu|9DYDnjfK)D z%BrzY_yk!s7Rmub!D-Nkflg3v6uSy#wOD8i%E=|+B<$pzt^wtM-v!FyoYWP=maxiFE=V18cYNaz)?ATQ_7g+;H?_ZBqz|WLfk6kGPrLHlUxLEfcJu_B}{$6 zm7v@#j+HW{f%!$U+TbYk{lEe^kPg~FIi@=>5^_WzL;60+$B4*@?ktwEx6olw&f=q} zN6y~1x$sEN$P{=a2lkuD@EbggbPgJx1vY@Q!30z|2Q*+O`>A=dFOtMf@kNq4^msp_ z%`oKd!S($w?wlMoI=SSGm|5w{fBA}?_NEnm3rYa0I>X*?J|Q2}ka&g<8E~jmi+}pM_qozsE0=cc%v9 z-YBx{R=LTGoDW&SNMzZ)F)_GzNCpy|Qd&zbxC?Us$%Z6E|Y9mu>Br zWo!HGWqbQ&+2VG)&tA5 z2?KsvLV>@mgaf}UA;E^3IPPxFRRg1?YKaPdza%m!l*3yrm&a zu<*+gFM@D)7aNHgep%v%zifr6mw8UduRCanDnOaNbi+5#?fXTKlhK2NNG3ZA3Ypwf z2P9PBhnL?=sK7V5J#xT+yCr16?rjMfL>u0ekb$p;u!{uwbqN_LzfVF2QQ12ZG7zkg zmYesi-^mWg*#OEHokX+~19rd8)z~n&MC_6ff(Y{FMxJX$%t{Y^2^ zcSu9ljw~gzjzRvWVrJ>gU0T^blLI3~& delta 7093 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 delta 20 ccmccep7Y9k&I$h+O_~_n7#X)QGF>SH0A{%eYXATM diff --git a/bundles/extension/ING9187xx/apis.json b/bundles/extension/ING9187xx/apis.json index 919248091..592ce373f 100644 --- a/bundles/extension/ING9187xx/apis.json +++ b/bundles/extension/ING9187xx/apis.json @@ -1,350 +1,351 @@ { - "att_dispatch_client_can_send_now": "0x00005751", - "att_dispatch_client_request_can_send_now_event": "0x00005757", - "att_dispatch_register_client": "0x0000575d", - "att_dispatch_register_server": "0x00005771", - "att_dispatch_server_can_send_now": "0x00005785", - "att_dispatch_server_request_can_send_now_event": "0x0000578b", - "att_emit_general_event": "0x0000583d", - "att_server_can_send_packet_now": "0x00005f6d", - "att_server_deferred_read_response": "0x00005f71", - "att_server_get_mtu": "0x00005f89", - "att_server_indicate": "0x00006001", - "att_server_init": "0x00006085", - "att_server_notify": "0x000060c1", - "att_server_register_packet_handler": "0x000061d9", - "att_server_request_can_send_now_event": "0x000061e5", - "att_set_db": "0x00006201", - "att_set_read_callback": "0x00006215", - "att_set_write_callback": "0x00006221", - "bd_addr_cmp": "0x00006391", - "bd_addr_copy": "0x00006397", - "bd_addr_to_str": "0x000063a1", - "big_endian_read_16": "0x000063d9", - "big_endian_read_32": "0x000063e1", - "big_endian_store_16": "0x000063f5", - "big_endian_store_32": "0x00006401", - "btstack_config": "0x00006555", - "btstack_memory_pool_create": "0x00006693", - "btstack_memory_pool_free": "0x000066bd", - "btstack_memory_pool_get": "0x0000671d", - "btstack_push_user_msg": "0x00006785", - "btstack_push_user_runnable": "0x00006791", - "btstack_reset": "0x0000679d", - "char_for_nibble": "0x00006a79", - "eTaskConfirmSleepModeStatus": "0x00006d61", - "gap_add_dev_to_periodic_list": "0x0000735d", - "gap_add_whitelist": "0x0000736d", - "gap_aes_encrypt": "0x00007379", - "gap_clear_white_lists": "0x000073b1", - "gap_clr_adv_set": "0x000073bd", - "gap_clr_periodic_adv_list": "0x000073c9", - "gap_create_connection_cancel": "0x000073d5", - "gap_disconnect": "0x000073e1", - "gap_disconnect_all": "0x0000740d", - "gap_ext_create_connection": "0x0000744d", - "gap_get_connection_parameter_range": "0x00007525", - "gap_le_read_channel_map": "0x00007561", - "gap_periodic_adv_create_sync": "0x000075cd", - "gap_periodic_adv_create_sync_cancel": "0x000075f1", - "gap_periodic_adv_term_sync": "0x000075fd", - "gap_read_periodic_adv_list_size": "0x00007685", - "gap_read_phy": "0x00007691", - "gap_read_remote_used_features": "0x0000769d", - "gap_read_remote_version": "0x000076a9", - "gap_read_rssi": "0x000076b5", - "gap_remove_whitelist": "0x000076c1", - "gap_rmv_adv_set": "0x0000773d", - "gap_rmv_dev_from_periodic_list": "0x00007749", - "gap_rx_test_v2": "0x00007759", - "gap_set_adv_set_random_addr": "0x00007791", - "gap_set_callback_for_next_hci": "0x000077cd", - "gap_set_connection_parameter_range": "0x000077ed", - "gap_set_data_length": "0x00007805", - "gap_set_def_phy": "0x0000781d", - "gap_set_ext_adv_data": "0x0000782d", - "gap_set_ext_adv_enable": "0x00007845", - "gap_set_ext_adv_para": "0x000078b5", - "gap_set_ext_scan_enable": "0x0000798d", - "gap_set_ext_scan_para": "0x000079a5", - "gap_set_ext_scan_response_data": "0x00007a45", - "gap_set_host_channel_classification": "0x00007a5d", - "gap_set_periodic_adv_data": "0x00007a6d", - "gap_set_periodic_adv_enable": "0x00007add", - "gap_set_periodic_adv_para": "0x00007aed", - "gap_set_phy": "0x00007b05", - "gap_set_random_device_address": "0x00007b21", - "gap_start_ccm": "0x00007b51", - "gap_test_end": "0x00007b99", - "gap_tx_test_v2": "0x00007ba5", - "gap_tx_test_v4": "0x00007bbd", - "gap_update_connection_parameters": "0x00007be1", - "gap_vendor_tx_continuous_wave": "0x00007c25", - "gatt_client_cancel_write": "0x0000814d", - "gatt_client_discover_characteristic_descriptors": "0x00008173", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x000081b3", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x00008203", - "gatt_client_discover_characteristics_for_service": "0x00008253", - "gatt_client_discover_primary_services": "0x00008289", - "gatt_client_discover_primary_services_by_uuid128": "0x000082bb", - "gatt_client_discover_primary_services_by_uuid16": "0x000082ff", - "gatt_client_execute_write": "0x0000833b", - "gatt_client_find_included_services_for_service": "0x00008361", - "gatt_client_get_mtu": "0x0000838f", - "gatt_client_is_ready": "0x00008431", - "gatt_client_listen_for_characteristic_value_updates": "0x00008447", - "gatt_client_prepare_write": "0x00008469", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x000084a5", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x000084cf", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x000084d5", - "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x00008503", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x00008509", - "gatt_client_read_multiple_characteristic_values": "0x00008537", - "gatt_client_read_value_of_characteristic_using_value_handle": "0x00008567", - "gatt_client_read_value_of_characteristics_by_uuid128": "0x00008595", - "gatt_client_read_value_of_characteristics_by_uuid16": "0x000085e1", - "gatt_client_register_handler": "0x0000862d", - "gatt_client_reliable_write_long_value_of_characteristic": "0x00008639", - "gatt_client_signed_write_without_response": "0x00008a69", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x00008b2d", - "gatt_client_write_client_characteristic_configuration": "0x00008b67", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x00008bb9", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008bc9", - "gatt_client_write_long_value_of_characteristic": "0x00008c05", - "gatt_client_write_long_value_of_characteristic_with_offset": "0x00008c15", - "gatt_client_write_value_of_characteristic": "0x00008c51", - "gatt_client_write_value_of_characteristic_without_response": "0x00008c87", - "hci_add_event_handler": "0x0000a1ad", - "hci_power_control": "0x0000a94d", - "hci_register_acl_packet_handler": "0x0000ab01", - "kv_commit": "0x0000b275", - "kv_get": "0x0000b2d1", - "kv_init": "0x0000b2dd", - "kv_init_backend": "0x0000b35d", - "kv_put": "0x0000b371", - "kv_remove": "0x0000b37d", - "kv_remove_all": "0x0000b3b1", - "kv_value_modified": "0x0000b3e1", - "kv_value_modified_of_key": "0x0000b3fd", - "kv_visit": "0x0000b409", - "l2cap_add_event_handler": "0x0000b499", - "l2cap_can_send_packet_now": "0x0000b4a9", - "l2cap_create_le_credit_based_connection_request": "0x0000b665", - "l2cap_credit_based_send": "0x0000b7a9", - "l2cap_credit_based_send_continue": "0x0000b7d5", - "l2cap_disconnect": "0x0000b851", - "l2cap_get_le_credit_based_connection_credits": "0x0000baa1", - "l2cap_get_peer_mtu_for_local_cid": "0x0000babd", - "l2cap_init": "0x0000be91", - "l2cap_le_send_flow_control_credit": "0x0000bf87", - "l2cap_max_le_mtu": "0x0000c291", - "l2cap_register_packet_handler": "0x0000c3b9", - "l2cap_register_service": "0x0000c3c5", - "l2cap_request_can_send_now_event": "0x0000c4d5", - "l2cap_request_connection_parameter_update": "0x0000c4ef", - "l2cap_send_echo_request": "0x0000c9c9", - "l2cap_unregister_service": "0x0000ca89", - "le_device_db_add": "0x0000cae1", - "le_device_db_find": "0x0000cbb9", - "le_device_db_from_key": "0x0000cbe5", - "le_device_db_iter_cur": "0x0000cbed", - "le_device_db_iter_cur_key": "0x0000cbf1", - "le_device_db_iter_init": "0x0000cbf5", - "le_device_db_iter_next": "0x0000cbfd", - "le_device_db_remove_key": "0x0000cc23", - "ll_ackable_packet_alloc": "0x0000cc4f", - "ll_ackable_packet_get_status": "0x0000cd81", - "ll_ackable_packet_run": "0x0000cdf1", - "ll_ackable_packet_set_tx_data": "0x0000ce8d", - "ll_aes_encrypt": "0x0000cea9", - "ll_channel_monitor_alloc": "0x0000cf25", - "ll_channel_monitor_check_each_pdu": "0x0000cfa7", - "ll_channel_monitor_run": "0x0000d00d", - "ll_config": "0x0000d0c1", - "ll_free": "0x0000d0f7", - "ll_get_heap_free_size": "0x0000d101", - "ll_hint_on_ce_len": "0x0000d115", - "ll_legacy_adv_set_interval": "0x0000d14d", - "ll_lock_frequency": "0x0000d15d", - "ll_malloc": "0x0000d1c1", - "ll_query_timing_info": "0x0000d2f9", - "ll_raw_packet_alloc": "0x0000d345", - "ll_raw_packet_free": "0x0000d419", - "ll_raw_packet_get_bare_rx_data": "0x0000d451", - "ll_raw_packet_get_rx_data": "0x0000d517", - "ll_raw_packet_recv": "0x0000d5b9", - "ll_raw_packet_send": "0x0000d675", - "ll_raw_packet_set_bare_data": "0x0000d75d", - "ll_raw_packet_set_bare_mode": "0x0000d79b", - "ll_raw_packet_set_param": "0x0000d8a1", - "ll_raw_packet_set_tx_data": "0x0000d8ff", - "ll_register_hci_acl_previewer": "0x0000d965", - "ll_scan_set_fixed_channel": "0x0000d9c9", - "ll_set_adv_access_address": "0x0000dbe1", - "ll_set_adv_coded_scheme": "0x0000dbed", - "ll_set_conn_acl_report_latency": "0x0000dc1d", - "ll_set_conn_coded_scheme": "0x0000dc4d", - "ll_set_conn_interval_unit": "0x0000dc79", - "ll_set_conn_latency": "0x0000dc85", - "ll_set_conn_tx_power": "0x0000dcb5", - "ll_set_def_antenna": "0x0000dcfd", - "ll_set_initiating_coded_scheme": "0x0000dd19", - "ll_set_max_conn_number": "0x0000dd25", - "ll_unlock_frequency": "0x0000ddb9", - "nibble_for_char": "0x0001e089", - "platform_32k_rc_auto_tune": "0x0001e135", - "platform_32k_rc_tune": "0x0001e1b1", - "platform_calibrate_32k": "0x0001e1c5", - "platform_config": "0x0001e1c9", - "platform_delete_timer": "0x0001e2ed", - "platform_enable_irq": "0x0001e2f5", - "platform_get_current_task": "0x0001e32d", - "platform_get_gen_os_driver": "0x0001e351", - "platform_get_heap_status": "0x0001e359", - "platform_get_link_layer_interf": "0x0001e371", - "platform_get_task_handle": "0x0001e379", - "platform_get_timer_counter": "0x0001e399", - "platform_get_us_time": "0x0001e39d", - "platform_get_version": "0x0001e3a1", - "platform_hrng": "0x0001e3a9", - "platform_install_isr_stack": "0x0001e3b1", - "platform_install_task_stack": "0x0001e3bd", - "platform_patch_rf_init_data": "0x0001e3f5", - "platform_printf": "0x0001e401", - "platform_raise_assertion": "0x0001e415", - "platform_rand": "0x0001e429", - "platform_read_info": "0x0001e42d", - "platform_read_persistent_reg": "0x0001e45d", - "platform_reset": "0x0001e46d", - "platform_set_abs_timer": "0x0001e491", - "platform_set_evt_callback": "0x0001e495", - "platform_set_evt_callback_table": "0x0001e4a9", - "platform_set_irq_callback": "0x0001e4b5", - "platform_set_irq_callback_table": "0x0001e4d1", - "platform_set_rf_clk_source": "0x0001e4dd", - "platform_set_rf_init_data": "0x0001e4e9", - "platform_set_rf_power_mapping": "0x0001e4f5", - "platform_set_timer": "0x0001e501", - "platform_shutdown": "0x0001e505", - "platform_switch_app": "0x0001e509", - "platform_trace_raw": "0x0001e535", - "platform_write_persistent_reg": "0x0001e54d", - "printf_hexdump": "0x0001e701", - "pvPortMalloc": "0x0001f1f5", - "pvTaskIncrementMutexHeldCount": "0x0001f2dd", - "pvTimerGetTimerID": "0x0001f2f5", - "pxPortInitialiseStack": "0x0001f321", - "reverse_128": "0x0001f4c9", - "reverse_24": "0x0001f4cf", - "reverse_256": "0x0001f4d5", - "reverse_48": "0x0001f4db", - "reverse_56": "0x0001f4e1", - "reverse_64": "0x0001f4e7", - "reverse_bd_addr": "0x0001f4ed", - "reverse_bytes": "0x0001f4f3", - "sm_add_event_handler": "0x0001f6c1", - "sm_address_resolution_lookup": "0x0001f819", - "sm_authenticated": "0x0001fb95", - "sm_authorization_decline": "0x0001fba3", - "sm_authorization_grant": "0x0001fbc3", - "sm_authorization_state": "0x0001fbe3", - "sm_bonding_decline": "0x0001fbfd", - "sm_config": "0x00020059", - "sm_config_conn": "0x00020071", - "sm_encryption_key_size": "0x00020227", - "sm_just_works_confirm": "0x000207ad", - "sm_le_device_key": "0x00020af9", - "sm_passkey_input": "0x00020b8f", - "sm_private_random_address_generation_get": "0x00020f49", - "sm_private_random_address_generation_get_mode": "0x00020f51", - "sm_private_random_address_generation_set_mode": "0x00020f5d", - "sm_private_random_address_generation_set_update_period": "0x00020f85", - "sm_register_external_ltk_callback": "0x000210c1", - "sm_register_oob_data_callback": "0x000210cd", - "sm_request_pairing": "0x000210d9", - "sm_send_security_request": "0x00021baf", - "sm_set_accepted_stk_generation_methods": "0x00021bd5", - "sm_set_authentication_requirements": "0x00021be1", - "sm_set_encryption_key_size_range": "0x00021bed", - "sscanf_bd_addr": "0x00021fbd", - "sysSetPublicDeviceAddr": "0x00022371", - "uuid128_to_str": "0x0002297d", - "uuid_add_bluetooth_prefix": "0x000229d5", - "uuid_has_bluetooth_prefix": "0x000229f5", - "uxListRemove": "0x00022a11", - "uxQueueMessagesWaiting": "0x00022a39", - "uxQueueMessagesWaitingFromISR": "0x00022a61", - "uxQueueSpacesAvailable": "0x00022a7d", - "uxTaskGetStackHighWaterMark": "0x00022aa9", - "uxTaskPriorityGet": "0x00022ac9", - "uxTaskPriorityGetFromISR": "0x00022ae5", - "vListInitialise": "0x00022b9f", - "vListInitialiseItem": "0x00022bb5", - "vListInsert": "0x00022bbb", - "vListInsertEnd": "0x00022beb", - "vPortEndScheduler": "0x00022c05", - "vPortEnterCritical": "0x00022c31", - "vPortExitCritical": "0x00022c75", - "vPortFree": "0x00022ca9", - "vPortSuppressTicksAndSleep": "0x00022d3d", - "vPortValidateInterruptPriority": "0x00022e65", - "vQueueDelete": "0x00022ec1", - "vQueueWaitForMessageRestricted": "0x00022eed", - "vTaskDelay": "0x00022f35", - "vTaskInternalSetTimeOutState": "0x00022f81", - "vTaskMissedYield": "0x00022f91", - "vTaskPlaceOnEventList": "0x00022f9d", - "vTaskPlaceOnEventListRestricted": "0x00022fd5", - "vTaskPriorityDisinheritAfterTimeout": "0x00023015", - "vTaskPrioritySet": "0x000230c1", - "vTaskResume": "0x00023189", - "vTaskStartScheduler": "0x0002320d", - "vTaskStepTick": "0x0002329d", - "vTaskSuspend": "0x000232cd", - "vTaskSuspendAll": "0x00023389", - "vTaskSwitchContext": "0x00023399", - "xPortStartScheduler": "0x00023441", - "xQueueAddToSet": "0x00023509", - "xQueueCreateCountingSemaphore": "0x0002352d", - "xQueueCreateCountingSemaphoreStatic": "0x00023569", - "xQueueCreateMutex": "0x000235ad", - "xQueueCreateMutexStatic": "0x000235c3", - "xQueueCreateSet": "0x000235dd", - "xQueueGenericCreate": "0x000235e5", - "xQueueGenericCreateStatic": "0x00023631", - "xQueueGenericReset": "0x00023699", - "xQueueGenericSend": "0x00023725", - "xQueueGenericSendFromISR": "0x00023891", - "xQueueGiveFromISR": "0x00023951", - "xQueueGiveMutexRecursive": "0x000239f5", - "xQueueIsQueueEmptyFromISR": "0x00023a35", - "xQueueIsQueueFullFromISR": "0x00023a59", - "xQueuePeek": "0x00023a81", - "xQueuePeekFromISR": "0x00023ba9", - "xQueueReceive": "0x00023c15", - "xQueueReceiveFromISR": "0x00023d41", - "xQueueRemoveFromSet": "0x00023dd5", - "xQueueSelectFromSet": "0x00023df7", - "xQueueSelectFromSetFromISR": "0x00023e09", - "xQueueSemaphoreTake": "0x00023e1d", - "xQueueTakeMutexRecursive": "0x00023f89", - "xTaskCheckForTimeOut": "0x00023fcd", - "xTaskCreate": "0x0002403d", - "xTaskCreateStatic": "0x00024099", - "xTaskGetCurrentTaskHandle": "0x00024109", - "xTaskGetSchedulerState": "0x00024115", - "xTaskGetTickCount": "0x00024131", - "xTaskGetTickCountFromISR": "0x0002413d", - "xTaskIncrementTick": "0x0002414d", - "xTaskPriorityDisinherit": "0x00024219", - "xTaskPriorityInherit": "0x000242ad", - "xTaskRemoveFromEventList": "0x00024341", - "xTaskResumeAll": "0x000243c1", - "xTaskResumeFromISR": "0x00024489", - "xTimerCreate": "0x00024515", - "xTimerCreateStatic": "0x00024549", - "xTimerCreateTimerTask": "0x00024581", - "xTimerGenericCommand": "0x000245ed", - "xTimerGetExpiryTime": "0x0002465d", - "xTimerGetTimerDaemonTaskHandle": "0x0002467d" + "att_dispatch_client_can_send_now": "0x00005799", + "att_dispatch_client_request_can_send_now_event": "0x0000579f", + "att_dispatch_register_client": "0x000057a5", + "att_dispatch_register_server": "0x000057b9", + "att_dispatch_server_can_send_now": "0x000057cd", + "att_dispatch_server_request_can_send_now_event": "0x000057d3", + "att_emit_general_event": "0x00005885", + "att_server_can_send_packet_now": "0x00005fb5", + "att_server_deferred_read_response": "0x00005fb9", + "att_server_get_mtu": "0x00005fd1", + "att_server_indicate": "0x00006049", + "att_server_init": "0x000060cd", + "att_server_notify": "0x00006109", + "att_server_register_packet_handler": "0x00006221", + "att_server_request_can_send_now_event": "0x0000622d", + "att_set_db": "0x00006249", + "att_set_read_callback": "0x0000625d", + "att_set_write_callback": "0x00006269", + "bd_addr_cmp": "0x000063d9", + "bd_addr_copy": "0x000063df", + "bd_addr_to_str": "0x000063e9", + "big_endian_read_16": "0x00006421", + "big_endian_read_32": "0x00006429", + "big_endian_store_16": "0x0000643d", + "big_endian_store_32": "0x00006449", + "btstack_config": "0x0000659d", + "btstack_memory_pool_create": "0x000066db", + "btstack_memory_pool_free": "0x00006705", + "btstack_memory_pool_get": "0x00006765", + "btstack_push_user_msg": "0x000067cd", + "btstack_push_user_runnable": "0x000067d9", + "btstack_reset": "0x000067e5", + "char_for_nibble": "0x00006ac1", + "eTaskConfirmSleepModeStatus": "0x00006da9", + "gap_add_dev_to_periodic_list": "0x000073a5", + "gap_add_whitelist": "0x000073b5", + "gap_aes_encrypt": "0x000073c1", + "gap_clear_white_lists": "0x000073f9", + "gap_clr_adv_set": "0x00007405", + "gap_clr_periodic_adv_list": "0x00007411", + "gap_create_connection_cancel": "0x0000741d", + "gap_disconnect": "0x00007429", + "gap_disconnect_all": "0x00007455", + "gap_ext_create_connection": "0x00007495", + "gap_get_connection_parameter_range": "0x0000756d", + "gap_le_read_channel_map": "0x000075a9", + "gap_periodic_adv_create_sync": "0x00007615", + "gap_periodic_adv_create_sync_cancel": "0x00007639", + "gap_periodic_adv_term_sync": "0x00007645", + "gap_read_periodic_adv_list_size": "0x000076cd", + "gap_read_phy": "0x000076d9", + "gap_read_remote_used_features": "0x000076e5", + "gap_read_remote_version": "0x000076f1", + "gap_read_rssi": "0x000076fd", + "gap_remove_whitelist": "0x00007709", + "gap_rmv_adv_set": "0x00007785", + "gap_rmv_dev_from_periodic_list": "0x00007791", + "gap_rx_test_v2": "0x000077a1", + "gap_set_adv_set_random_addr": "0x000077d9", + "gap_set_callback_for_next_hci": "0x00007815", + "gap_set_connection_parameter_range": "0x00007835", + "gap_set_data_length": "0x0000784d", + "gap_set_def_phy": "0x00007865", + "gap_set_ext_adv_data": "0x00007875", + "gap_set_ext_adv_enable": "0x0000788d", + "gap_set_ext_adv_para": "0x000078fd", + "gap_set_ext_scan_enable": "0x000079d5", + "gap_set_ext_scan_para": "0x000079ed", + "gap_set_ext_scan_response_data": "0x00007a8d", + "gap_set_host_channel_classification": "0x00007aa5", + "gap_set_periodic_adv_data": "0x00007ab5", + "gap_set_periodic_adv_enable": "0x00007b25", + "gap_set_periodic_adv_para": "0x00007b35", + "gap_set_phy": "0x00007b4d", + "gap_set_random_device_address": "0x00007b69", + "gap_start_ccm": "0x00007b99", + "gap_test_end": "0x00007be1", + "gap_tx_test_v2": "0x00007bed", + "gap_tx_test_v4": "0x00007c05", + "gap_update_connection_parameters": "0x00007c29", + "gap_vendor_tx_continuous_wave": "0x00007c6d", + "gatt_client_cancel_write": "0x00008195", + "gatt_client_discover_characteristic_descriptors": "0x000081bb", + "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x000081fb", + "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x0000824b", + "gatt_client_discover_characteristics_for_service": "0x0000829b", + "gatt_client_discover_primary_services": "0x000082d1", + "gatt_client_discover_primary_services_by_uuid128": "0x00008303", + "gatt_client_discover_primary_services_by_uuid16": "0x00008347", + "gatt_client_execute_write": "0x00008383", + "gatt_client_find_included_services_for_service": "0x000083a9", + "gatt_client_get_mtu": "0x000083d7", + "gatt_client_is_ready": "0x00008479", + "gatt_client_listen_for_characteristic_value_updates": "0x0000848f", + "gatt_client_prepare_write": "0x000084b1", + "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x000084ed", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x00008517", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x0000851d", + "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x0000854b", + "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x00008551", + "gatt_client_read_multiple_characteristic_values": "0x0000857f", + "gatt_client_read_value_of_characteristic_using_value_handle": "0x000085af", + "gatt_client_read_value_of_characteristics_by_uuid128": "0x000085dd", + "gatt_client_read_value_of_characteristics_by_uuid16": "0x00008629", + "gatt_client_register_handler": "0x00008675", + "gatt_client_reliable_write_long_value_of_characteristic": "0x00008681", + "gatt_client_signed_write_without_response": "0x00008ab1", + "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x00008b75", + "gatt_client_write_client_characteristic_configuration": "0x00008baf", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x00008c01", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008c11", + "gatt_client_write_long_value_of_characteristic": "0x00008c4d", + "gatt_client_write_long_value_of_characteristic_with_offset": "0x00008c5d", + "gatt_client_write_value_of_characteristic": "0x00008c99", + "gatt_client_write_value_of_characteristic_without_response": "0x00008ccf", + "hci_add_event_handler": "0x0000a1f5", + "hci_power_control": "0x0000a995", + "hci_register_acl_packet_handler": "0x0000ab49", + "kv_commit": "0x0000b2bd", + "kv_get": "0x0000b319", + "kv_init": "0x0000b325", + "kv_init_backend": "0x0000b3a5", + "kv_put": "0x0000b3b9", + "kv_remove": "0x0000b3c5", + "kv_remove_all": "0x0000b3f9", + "kv_value_modified": "0x0000b429", + "kv_value_modified_of_key": "0x0000b445", + "kv_visit": "0x0000b451", + "l2cap_add_event_handler": "0x0000b4e1", + "l2cap_can_send_packet_now": "0x0000b4f1", + "l2cap_create_le_credit_based_connection_request": "0x0000b6ad", + "l2cap_credit_based_send": "0x0000b7f1", + "l2cap_credit_based_send_continue": "0x0000b81d", + "l2cap_disconnect": "0x0000b899", + "l2cap_get_le_credit_based_connection_credits": "0x0000bae9", + "l2cap_get_peer_mtu_for_local_cid": "0x0000bb05", + "l2cap_init": "0x0000bed9", + "l2cap_le_send_flow_control_credit": "0x0000bfcf", + "l2cap_max_le_mtu": "0x0000c2d9", + "l2cap_register_packet_handler": "0x0000c401", + "l2cap_register_service": "0x0000c40d", + "l2cap_request_can_send_now_event": "0x0000c51d", + "l2cap_request_connection_parameter_update": "0x0000c537", + "l2cap_send_echo_request": "0x0000ca11", + "l2cap_unregister_service": "0x0000cad1", + "le_device_db_add": "0x0000cb29", + "le_device_db_find": "0x0000cc01", + "le_device_db_from_key": "0x0000cc2d", + "le_device_db_iter_cur": "0x0000cc35", + "le_device_db_iter_cur_key": "0x0000cc39", + "le_device_db_iter_init": "0x0000cc3d", + "le_device_db_iter_next": "0x0000cc45", + "le_device_db_remove_key": "0x0000cc6b", + "ll_ackable_packet_alloc": "0x0000cc97", + "ll_ackable_packet_get_status": "0x0000cdc9", + "ll_ackable_packet_run": "0x0000ce39", + "ll_ackable_packet_set_tx_data": "0x0000ced5", + "ll_aes_encrypt": "0x0000cef1", + "ll_channel_monitor_alloc": "0x0000cf6d", + "ll_channel_monitor_check_each_pdu": "0x0000cfef", + "ll_channel_monitor_run": "0x0000d055", + "ll_config": "0x0000d109", + "ll_free": "0x0000d13f", + "ll_get_heap_free_size": "0x0000d149", + "ll_hint_on_ce_len": "0x0000d15d", + "ll_legacy_adv_set_interval": "0x0000d195", + "ll_lock_frequency": "0x0000d1a5", + "ll_malloc": "0x0000d209", + "ll_query_timing_info": "0x0000d341", + "ll_raw_packet_alloc": "0x0000d38d", + "ll_raw_packet_free": "0x0000d461", + "ll_raw_packet_get_bare_rx_data": "0x0000d499", + "ll_raw_packet_get_rx_data": "0x0000d55f", + "ll_raw_packet_recv": "0x0000d601", + "ll_raw_packet_send": "0x0000d6bd", + "ll_raw_packet_set_bare_data": "0x0000d7a5", + "ll_raw_packet_set_bare_mode": "0x0000d7e3", + "ll_raw_packet_set_param": "0x0000d8e9", + "ll_raw_packet_set_tx_data": "0x0000d947", + "ll_register_hci_acl_previewer": "0x0000d9ad", + "ll_scan_set_fixed_channel": "0x0000da11", + "ll_set_adv_access_address": "0x0000dc29", + "ll_set_adv_coded_scheme": "0x0000dc35", + "ll_set_conn_acl_report_latency": "0x0000dc65", + "ll_set_conn_coded_scheme": "0x0000dc95", + "ll_set_conn_interval_unit": "0x0000dcc1", + "ll_set_conn_latency": "0x0000dccd", + "ll_set_conn_tx_power": "0x0000dcfd", + "ll_set_def_antenna": "0x0000dd45", + "ll_set_initiating_coded_scheme": "0x0000dd61", + "ll_set_max_conn_number": "0x0000dd6d", + "ll_unlock_frequency": "0x0000de01", + "nibble_for_char": "0x0001e0d1", + "platform_32k_rc_auto_tune": "0x0001e17d", + "platform_32k_rc_tune": "0x0001e1f9", + "platform_calibrate_32k": "0x0001e20d", + "platform_call_on_stack": "0x00004183", + "platform_config": "0x0001e211", + "platform_delete_timer": "0x0001e335", + "platform_enable_irq": "0x0001e33d", + "platform_get_current_task": "0x0001e375", + "platform_get_gen_os_driver": "0x0001e399", + "platform_get_heap_status": "0x0001e3a1", + "platform_get_link_layer_interf": "0x0001e3b9", + "platform_get_task_handle": "0x0001e3c1", + "platform_get_timer_counter": "0x0001e3e1", + "platform_get_us_time": "0x0001e3e5", + "platform_get_version": "0x0001e3e9", + "platform_hrng": "0x0001e3f1", + "platform_install_isr_stack": "0x0001e3f9", + "platform_install_task_stack": "0x0001e405", + "platform_patch_rf_init_data": "0x0001e43d", + "platform_printf": "0x0001e449", + "platform_raise_assertion": "0x0001e45d", + "platform_rand": "0x0001e471", + "platform_read_info": "0x0001e475", + "platform_read_persistent_reg": "0x0001e4a5", + "platform_reset": "0x0001e4b5", + "platform_set_abs_timer": "0x0001e4d9", + "platform_set_evt_callback": "0x0001e4dd", + "platform_set_evt_callback_table": "0x0001e4f1", + "platform_set_irq_callback": "0x0001e4fd", + "platform_set_irq_callback_table": "0x0001e519", + "platform_set_rf_clk_source": "0x0001e525", + "platform_set_rf_init_data": "0x0001e531", + "platform_set_rf_power_mapping": "0x0001e53d", + "platform_set_timer": "0x0001e549", + "platform_shutdown": "0x0001e54d", + "platform_switch_app": "0x0001e551", + "platform_trace_raw": "0x0001e57d", + "platform_write_persistent_reg": "0x0001e595", + "printf_hexdump": "0x0001e749", + "pvPortMalloc": "0x0001f23d", + "pvTaskIncrementMutexHeldCount": "0x0001f325", + "pvTimerGetTimerID": "0x0001f33d", + "pxPortInitialiseStack": "0x0001f369", + "reverse_128": "0x0001f511", + "reverse_24": "0x0001f517", + "reverse_256": "0x0001f51d", + "reverse_48": "0x0001f523", + "reverse_56": "0x0001f529", + "reverse_64": "0x0001f52f", + "reverse_bd_addr": "0x0001f535", + "reverse_bytes": "0x0001f53b", + "sm_add_event_handler": "0x0001f709", + "sm_address_resolution_lookup": "0x0001f861", + "sm_authenticated": "0x0001fbdd", + "sm_authorization_decline": "0x0001fbeb", + "sm_authorization_grant": "0x0001fc0b", + "sm_authorization_state": "0x0001fc2b", + "sm_bonding_decline": "0x0001fc45", + "sm_config": "0x000200a1", + "sm_config_conn": "0x000200b9", + "sm_encryption_key_size": "0x0002026f", + "sm_just_works_confirm": "0x000207f5", + "sm_le_device_key": "0x00020b41", + "sm_passkey_input": "0x00020bd7", + "sm_private_random_address_generation_get": "0x00020f91", + "sm_private_random_address_generation_get_mode": "0x00020f99", + "sm_private_random_address_generation_set_mode": "0x00020fa5", + "sm_private_random_address_generation_set_update_period": "0x00020fcd", + "sm_register_external_ltk_callback": "0x00021109", + "sm_register_oob_data_callback": "0x00021115", + "sm_request_pairing": "0x00021121", + "sm_send_security_request": "0x00021bf7", + "sm_set_accepted_stk_generation_methods": "0x00021c1d", + "sm_set_authentication_requirements": "0x00021c29", + "sm_set_encryption_key_size_range": "0x00021c35", + "sscanf_bd_addr": "0x00022005", + "sysSetPublicDeviceAddr": "0x000223b9", + "uuid128_to_str": "0x000229c5", + "uuid_add_bluetooth_prefix": "0x00022a1d", + "uuid_has_bluetooth_prefix": "0x00022a3d", + "uxListRemove": "0x00022a59", + "uxQueueMessagesWaiting": "0x00022a81", + "uxQueueMessagesWaitingFromISR": "0x00022aa9", + "uxQueueSpacesAvailable": "0x00022ac5", + "uxTaskGetStackHighWaterMark": "0x00022af1", + "uxTaskPriorityGet": "0x00022b11", + "uxTaskPriorityGetFromISR": "0x00022b2d", + "vListInitialise": "0x00022be7", + "vListInitialiseItem": "0x00022bfd", + "vListInsert": "0x00022c03", + "vListInsertEnd": "0x00022c33", + "vPortEndScheduler": "0x00022c4d", + "vPortEnterCritical": "0x00022c79", + "vPortExitCritical": "0x00022cbd", + "vPortFree": "0x00022cf1", + "vPortSuppressTicksAndSleep": "0x00022d85", + "vPortValidateInterruptPriority": "0x00022ead", + "vQueueDelete": "0x00022f09", + "vQueueWaitForMessageRestricted": "0x00022f35", + "vTaskDelay": "0x00022f7d", + "vTaskInternalSetTimeOutState": "0x00022fc9", + "vTaskMissedYield": "0x00022fd9", + "vTaskPlaceOnEventList": "0x00022fe5", + "vTaskPlaceOnEventListRestricted": "0x0002301d", + "vTaskPriorityDisinheritAfterTimeout": "0x0002305d", + "vTaskPrioritySet": "0x00023109", + "vTaskResume": "0x000231d1", + "vTaskStartScheduler": "0x00023255", + "vTaskStepTick": "0x000232e5", + "vTaskSuspend": "0x00023315", + "vTaskSuspendAll": "0x000233d1", + "vTaskSwitchContext": "0x000233e1", + "xPortStartScheduler": "0x00023489", + "xQueueAddToSet": "0x00023551", + "xQueueCreateCountingSemaphore": "0x00023575", + "xQueueCreateCountingSemaphoreStatic": "0x000235b1", + "xQueueCreateMutex": "0x000235f5", + "xQueueCreateMutexStatic": "0x0002360b", + "xQueueCreateSet": "0x00023625", + "xQueueGenericCreate": "0x0002362d", + "xQueueGenericCreateStatic": "0x00023679", + "xQueueGenericReset": "0x000236e1", + "xQueueGenericSend": "0x0002376d", + "xQueueGenericSendFromISR": "0x000238d9", + "xQueueGiveFromISR": "0x00023999", + "xQueueGiveMutexRecursive": "0x00023a3d", + "xQueueIsQueueEmptyFromISR": "0x00023a7d", + "xQueueIsQueueFullFromISR": "0x00023aa1", + "xQueuePeek": "0x00023ac9", + "xQueuePeekFromISR": "0x00023bf1", + "xQueueReceive": "0x00023c5d", + "xQueueReceiveFromISR": "0x00023d89", + "xQueueRemoveFromSet": "0x00023e1d", + "xQueueSelectFromSet": "0x00023e3f", + "xQueueSelectFromSetFromISR": "0x00023e51", + "xQueueSemaphoreTake": "0x00023e65", + "xQueueTakeMutexRecursive": "0x00023fd1", + "xTaskCheckForTimeOut": "0x00024015", + "xTaskCreate": "0x00024085", + "xTaskCreateStatic": "0x000240e1", + "xTaskGetCurrentTaskHandle": "0x00024151", + "xTaskGetSchedulerState": "0x0002415d", + "xTaskGetTickCount": "0x00024179", + "xTaskGetTickCountFromISR": "0x00024185", + "xTaskIncrementTick": "0x00024195", + "xTaskPriorityDisinherit": "0x00024261", + "xTaskPriorityInherit": "0x000242f5", + "xTaskRemoveFromEventList": "0x00024389", + "xTaskResumeAll": "0x00024409", + "xTaskResumeFromISR": "0x000244d1", + "xTimerCreate": "0x0002455d", + "xTimerCreateStatic": "0x00024591", + "xTimerCreateTimerTask": "0x000245c9", + "xTimerGenericCommand": "0x00024635", + "xTimerGetExpiryTime": "0x000246a5", + "xTimerGetTimerDaemonTaskHandle": "0x000246c5" } \ No newline at end of file diff --git a/bundles/extension/ING9187xx/meta.json b/bundles/extension/ING9187xx/meta.json index 6e45a4c0e..b47ccd903 100644 --- a/bundles/extension/ING9187xx/meta.json +++ b/bundles/extension/ING9187xx/meta.json @@ -8,11 +8,11 @@ }, "rom": { "base": 16384, - "size": 139120 + "size": 139196 }, "version": [ 1, 9, - 38 + 39 ] } \ No newline at end of file diff --git a/bundles/extension/ING9187xx/platform.bin b/bundles/extension/ING9187xx/platform.bin index aff538b82cce3d51bbaaa530f3f0ca5577c7781d..4b6fa21a2f2d1e9680b24e4258b0e379ead895e5 100644 GIT binary patch delta 6673 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 RI;Mq`{bUp*t1dF1{}1ns`E~#R delta 6461 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 delta 7117 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 diff --git a/bundles/extension/inc/gap.h b/bundles/extension/inc/gap.h index 68eee5323..595bde525 100644 --- a/bundles/extension/inc/gap.h +++ b/bundles/extension/inc/gap.h @@ -1287,7 +1287,7 @@ uint8_t gap_rx_test_v2(uint8_t rx_channel, uint8_t phy, uint8_t modulation_index uint8_t gap_rx_test_v3(uint8_t rx_channel, uint8_t phy, uint8_t modulation_index, uint8_t expected_cte_length, uint8_t expected_cte_type, uint8_t slot_durations, - uint8_t switching_pattern_length, uint8_t *antenna_ids); + uint8_t switching_pattern_length, const uint8_t *antenna_ids); /** * @brief Start a test where the DUT generates test reference packets at a fixed interval. @@ -1324,7 +1324,7 @@ uint8_t gap_tx_test_v2(uint8_t tx_channel, uint8_t test_data_length, uint8_t gap_tx_test_v4(uint8_t tx_channel, uint8_t test_data_length, uint8_t packet_payload, uint8_t phy, uint8_t cte_length, uint8_t cte_type, - uint8_t switching_pattern_length, uint8_t *antenna_ids, + uint8_t switching_pattern_length, const uint8_t *antenna_ids, int8_t tx_power_level); /** diff --git a/bundles/extension/inc/ll_api.h b/bundles/extension/inc/ll_api.h index ea73ea12f..40dfae771 100644 --- a/bundles/extension/inc/ll_api.h +++ b/bundles/extension/inc/ll_api.h @@ -98,6 +98,57 @@ void ll_set_initiating_coded_scheme(const coded_scheme_t scheme); */ void ll_hint_on_ce_len(const uint16_t conn_handle, const uint16_t min_ce_len, const uint16_t max_ce_len); +/** + **************************************************************************************** + * @brief Create a connection directly (without advertising & initiating) + * + * @param[in] role connection role. master (0), slave (1) + * @param[in] addr_types address types for advertiser and initiator + * bit [0] for slave, bit [1] for master + * 0: public address; 1: random address + * @param[in] adv_addr address of advertiser + * @param[in] init_addr address of initiator + * @param[in] rx_phy Rx PHY (1: 1M, 2: 2M, 3: Coded) + * @param[in] tx_phy Tx PHY (1: 1M, 2: 2M, 3: Coded) + * @param[in] access_addr access address + * @param[in] crc_init CRC init + * @param[in] interval connection interval (unit: us) + * @param[in] sup_timeout supervision timeout (unit: 10ms) + * @param[in] channel_map channel map + * @param[in] ch_sel_algo channel selection algorithm (1 or 2) + * @param[in] hop_inc hop increment for CSA#1 ([5..16]) + * @param[in] min_ce_len information parameter about the minimum length of connection + * event needed for this LE connection. + * @param[in] max_ce_len information parameter about the maximum length of connection + * event needed for this LE connection. + * @param[in] start_time start time of the 1st connectin event + * @param[in] slave_latency slave latency + * @param[in] sleep_clk_acc sleep clock accuracy + * @param[in] sync_window slave's sync window for 1st connection event + * @return 0 if successful else error code + **************************************************************************************** + */ +int ll_create_conn( + uint8_t role, + uint8_t addr_types, + const uint8_t *adv_addr, + const uint8_t *init_addr, + uint8_t rx_phy, + uint8_t tx_phy, + uint32_t access_addr, + uint32_t crc_init, + uint32_t interval, + uint16_t sup_timeout, + const uint8_t *channel_map, + uint8_t ch_sel_algo, + uint8_t hop_inc, + uint16_t min_ce_len, + uint16_t max_ce_len, + uint64_t start_time, + uint16_t slave_latency, + uint8_t sleep_clk_acc, + uint32_t sync_window); + /** **************************************************************************************** * @brief Set tx power of a connection diff --git a/bundles/mass_conn/ING9168xx/meta.json b/bundles/mass_conn/ING9168xx/meta.json index a572225d2..3ce4eac7b 100644 --- a/bundles/mass_conn/ING9168xx/meta.json +++ b/bundles/mass_conn/ING9168xx/meta.json @@ -13,6 +13,6 @@ "version": [ 2, 2, - 52 + 53 ] } \ No newline at end of file diff --git a/bundles/mass_conn/ING9168xx/platform.bin b/bundles/mass_conn/ING9168xx/platform.bin index 629897a385cfa8a4af9817c98e8adf44588b23cf..8256ae9ede806f2aa34b47d92f5ff13217c58724 100644 GIT binary patch delta 19 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 W`=NcVH$H7hTIk$IjQR*Q>VE-!ccEDT diff --git a/bundles/mass_conn/ING9188xx/apis.json b/bundles/mass_conn/ING9188xx/apis.json index 703196349..cc8ede793 100644 --- a/bundles/mass_conn/ING9188xx/apis.json +++ b/bundles/mass_conn/ING9188xx/apis.json @@ -1,344 +1,345 @@ { - "att_dispatch_client_can_send_now": "0x00005875", - "att_dispatch_client_request_can_send_now_event": "0x0000587b", - "att_dispatch_register_client": "0x00005881", - "att_dispatch_register_server": "0x00005895", - "att_dispatch_server_can_send_now": "0x000058a9", - "att_dispatch_server_request_can_send_now_event": "0x000058af", - "att_emit_general_event": "0x00005961", - "att_server_can_send_packet_now": "0x00006091", - "att_server_deferred_read_response": "0x00006095", - "att_server_get_mtu": "0x000060ad", - "att_server_indicate": "0x00006125", - "att_server_init": "0x000061a9", - "att_server_notify": "0x000061e5", - "att_server_register_packet_handler": "0x000062fd", - "att_server_request_can_send_now_event": "0x00006309", - "att_set_db": "0x00006325", - "att_set_read_callback": "0x00006339", - "att_set_write_callback": "0x00006345", - "bd_addr_cmp": "0x000064b5", - "bd_addr_copy": "0x000064bb", - "bd_addr_to_str": "0x000064c5", - "big_endian_read_16": "0x000064fd", - "big_endian_read_32": "0x00006505", - "big_endian_store_16": "0x00006519", - "big_endian_store_32": "0x00006525", - "btstack_config": "0x00006679", - "btstack_memory_pool_create": "0x000067b7", - "btstack_memory_pool_free": "0x000067e1", - "btstack_memory_pool_get": "0x00006841", - "btstack_push_user_msg": "0x000068a9", - "btstack_push_user_runnable": "0x000068b5", - "btstack_reset": "0x000068c1", - "char_for_nibble": "0x00006b9d", - "eTaskConfirmSleepModeStatus": "0x00006e81", - "gap_add_dev_to_periodic_list": "0x000074f5", - "gap_add_whitelist": "0x00007505", - "gap_aes_encrypt": "0x00007511", - "gap_clear_white_lists": "0x00007549", - "gap_clr_adv_set": "0x00007555", - "gap_clr_periodic_adv_list": "0x00007561", - "gap_create_connection_cancel": "0x0000756d", - "gap_default_periodic_adv_sync_transfer_param": "0x00007579", - "gap_disconnect": "0x00007591", - "gap_disconnect_all": "0x000075bd", - "gap_ext_create_connection": "0x000075fd", - "gap_get_connection_parameter_range": "0x000076d5", - "gap_le_read_channel_map": "0x0000770d", - "gap_periodic_adv_create_sync": "0x00007779", - "gap_periodic_adv_create_sync_cancel": "0x0000779d", - "gap_periodic_adv_set_info_transfer": "0x000077a9", - "gap_periodic_adv_sync_transfer": "0x000077b9", - "gap_periodic_adv_sync_transfer_param": "0x000077c9", - "gap_periodic_adv_term_sync": "0x000077e5", - "gap_read_antenna_info": "0x0000786d", - "gap_read_periodic_adv_list_size": "0x00007879", - "gap_read_phy": "0x00007885", - "gap_read_remote_used_features": "0x00007891", - "gap_read_remote_version": "0x0000789d", - "gap_read_rssi": "0x000078a9", - "gap_remove_whitelist": "0x000078b5", - "gap_rmv_adv_set": "0x00007931", - "gap_rmv_dev_from_periodic_list": "0x0000793d", - "gap_rx_test_v2": "0x0000794d", - "gap_rx_test_v3": "0x0000795d", - "gap_set_adv_set_random_addr": "0x000079a9", - "gap_set_callback_for_next_hci": "0x000079e5", - "gap_set_connection_cte_request_enable": "0x00007a0d", - "gap_set_connection_cte_response_enable": "0x00007a29", - "gap_set_connection_cte_rx_param": "0x00007a39", - "gap_set_connection_cte_tx_param": "0x00007a8d", - "gap_set_connection_parameter_range": "0x00007ad9", - "gap_set_connectionless_cte_tx_enable": "0x00007af5", - "gap_set_connectionless_cte_tx_param": "0x00007b05", - "gap_set_connectionless_iq_sampling_enable": "0x00007b61", - "gap_set_data_length": "0x00007bbd", - "gap_set_def_phy": "0x00007bd5", - "gap_set_ext_adv_data": "0x00007be5", - "gap_set_ext_adv_enable": "0x00007bfd", - "gap_set_ext_adv_para": "0x00007c6d", - "gap_set_ext_scan_enable": "0x00007d45", - "gap_set_ext_scan_para": "0x00007d5d", - "gap_set_ext_scan_response_data": "0x00007dfd", - "gap_set_host_channel_classification": "0x00007e15", - "gap_set_periodic_adv_data": "0x00007e25", - "gap_set_periodic_adv_enable": "0x00007e95", - "gap_set_periodic_adv_para": "0x00007ea5", - "gap_set_periodic_adv_rx_enable": "0x00007ebd", - "gap_set_phy": "0x00007ecd", - "gap_set_random_device_address": "0x00007ee9", - "gap_start_ccm": "0x00007f19", - "gap_test_end": "0x00007f61", - "gap_tx_test_v2": "0x00007f6d", - "gap_tx_test_v4": "0x00007f85", - "gap_update_connection_parameters": "0x00007fa9", - "gap_vendor_tx_continuous_wave": "0x00007fed", - "gatt_client_cancel_write": "0x00008515", - "gatt_client_discover_characteristic_descriptors": "0x0000853b", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x0000857b", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x000085cb", - "gatt_client_discover_characteristics_for_service": "0x0000861b", - "gatt_client_discover_primary_services": "0x00008651", - "gatt_client_discover_primary_services_by_uuid128": "0x00008683", - "gatt_client_discover_primary_services_by_uuid16": "0x000086c7", - "gatt_client_execute_write": "0x00008703", - "gatt_client_find_included_services_for_service": "0x00008729", - "gatt_client_get_mtu": "0x00008757", - "gatt_client_is_ready": "0x000087f9", - "gatt_client_listen_for_characteristic_value_updates": "0x0000880f", - "gatt_client_prepare_write": "0x00008831", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x0000886d", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x00008897", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x0000889d", - "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x000088cb", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x000088d1", - "gatt_client_read_multiple_characteristic_values": "0x000088ff", - "gatt_client_read_value_of_characteristic_using_value_handle": "0x0000892f", - "gatt_client_read_value_of_characteristics_by_uuid128": "0x0000895d", - "gatt_client_read_value_of_characteristics_by_uuid16": "0x000089a9", - "gatt_client_register_handler": "0x000089f5", - "gatt_client_reliable_write_long_value_of_characteristic": "0x00008a01", - "gatt_client_signed_write_without_response": "0x00008e31", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x00008ef5", - "gatt_client_write_client_characteristic_configuration": "0x00008f2f", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x00008f81", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008f91", - "gatt_client_write_long_value_of_characteristic": "0x00008fcd", - "gatt_client_write_long_value_of_characteristic_with_offset": "0x00008fdd", - "gatt_client_write_value_of_characteristic": "0x00009019", - "gatt_client_write_value_of_characteristic_without_response": "0x0000904f", - "hci_add_event_handler": "0x0000a591", - "hci_power_control": "0x0000ad35", - "hci_register_acl_packet_handler": "0x0000aee9", - "kv_commit": "0x0000b671", - "kv_get": "0x0000b6cd", - "kv_init": "0x0000b6d9", - "kv_init_backend": "0x0000b759", - "kv_put": "0x0000b76d", - "kv_remove": "0x0000b779", - "kv_remove_all": "0x0000b7ad", - "kv_value_modified": "0x0000b7dd", - "kv_value_modified_of_key": "0x0000b7f9", - "kv_visit": "0x0000b805", - "l2cap_add_event_handler": "0x0000b895", - "l2cap_can_send_packet_now": "0x0000b8a5", - "l2cap_create_le_credit_based_connection_request": "0x0000ba61", - "l2cap_credit_based_send": "0x0000bba5", - "l2cap_credit_based_send_continue": "0x0000bbd1", - "l2cap_disconnect": "0x0000bc4d", - "l2cap_get_le_credit_based_connection_credits": "0x0000be9d", - "l2cap_get_peer_mtu_for_local_cid": "0x0000beb9", - "l2cap_init": "0x0000c28d", - "l2cap_le_send_flow_control_credit": "0x0000c383", - "l2cap_max_le_mtu": "0x0000c68d", - "l2cap_register_packet_handler": "0x0000c7b5", - "l2cap_register_service": "0x0000c7c1", - "l2cap_request_can_send_now_event": "0x0000c8d1", - "l2cap_request_connection_parameter_update": "0x0000c8eb", - "l2cap_send_echo_request": "0x0000cdc5", - "l2cap_unregister_service": "0x0000ce85", - "le_device_db_add": "0x0000cedd", - "le_device_db_find": "0x0000cfb5", - "le_device_db_from_key": "0x0000cfe1", - "le_device_db_iter_cur": "0x0000cfe9", - "le_device_db_iter_cur_key": "0x0000cfed", - "le_device_db_iter_init": "0x0000cff1", - "le_device_db_iter_next": "0x0000cff9", - "le_device_db_remove_key": "0x0000d01f", - "ll_aes_encrypt": "0x0000d04d", - "ll_config": "0x0000d0c9", - "ll_free": "0x0000d0ff", - "ll_get_heap_free_size": "0x0000d109", - "ll_hint_on_ce_len": "0x0000d11d", - "ll_legacy_adv_set_interval": "0x0000d155", - "ll_malloc": "0x0000d165", - "ll_query_timing_info": "0x0000d29d", - "ll_register_hci_acl_previewer": "0x0000d2e9", - "ll_scan_set_fixed_channel": "0x0000d34d", - "ll_set_adv_access_address": "0x0000d565", - "ll_set_adv_coded_scheme": "0x0000d571", - "ll_set_conn_acl_report_latency": "0x0000d5a1", - "ll_set_conn_coded_scheme": "0x0000d5d1", - "ll_set_conn_latency": "0x0000d5fd", - "ll_set_conn_tx_power": "0x0000d62d", - "ll_set_def_antenna": "0x0000d675", - "ll_set_initiating_coded_scheme": "0x0000d691", - "ll_set_max_conn_number": "0x0000d69d", - "nibble_for_char": "0x0001e73d", - "platform_32k_rc_auto_tune": "0x0001e7e9", - "platform_32k_rc_tune": "0x0001e865", - "platform_calibrate_32k": "0x0001e879", - "platform_config": "0x0001e87d", - "platform_delete_timer": "0x0001e9a1", - "platform_enable_irq": "0x0001e9a9", - "platform_get_current_task": "0x0001e9e1", - "platform_get_gen_os_driver": "0x0001ea05", - "platform_get_heap_status": "0x0001ea0d", - "platform_get_link_layer_interf": "0x0001ea25", - "platform_get_task_handle": "0x0001ea2d", - "platform_get_timer_counter": "0x0001ea4d", - "platform_get_us_time": "0x0001ea51", - "platform_get_version": "0x0001ea55", - "platform_hrng": "0x0001ea5d", - "platform_install_isr_stack": "0x0001ea65", - "platform_install_task_stack": "0x0001ea71", - "platform_patch_rf_init_data": "0x0001eaa9", - "platform_printf": "0x0001eab5", - "platform_raise_assertion": "0x0001eac9", - "platform_rand": "0x0001eadd", - "platform_read_info": "0x0001eae1", - "platform_read_persistent_reg": "0x0001eb11", - "platform_reset": "0x0001eb21", - "platform_set_abs_timer": "0x0001eb45", - "platform_set_evt_callback": "0x0001eb49", - "platform_set_evt_callback_table": "0x0001eb5d", - "platform_set_irq_callback": "0x0001eb69", - "platform_set_irq_callback_table": "0x0001eb85", - "platform_set_rf_clk_source": "0x0001eb91", - "platform_set_rf_init_data": "0x0001eb9d", - "platform_set_rf_power_mapping": "0x0001eba9", - "platform_set_timer": "0x0001ebb5", - "platform_shutdown": "0x0001ebb9", - "platform_switch_app": "0x0001ebbd", - "platform_trace_raw": "0x0001ebe9", - "platform_write_persistent_reg": "0x0001ec01", - "printf_hexdump": "0x0001edb5", - "pvPortMalloc": "0x0001f8a9", - "pvTaskIncrementMutexHeldCount": "0x0001f991", - "pvTimerGetTimerID": "0x0001f9a9", - "pxPortInitialiseStack": "0x0001f9d5", - "reverse_128": "0x0001fbb5", - "reverse_24": "0x0001fbbb", - "reverse_256": "0x0001fbc1", - "reverse_48": "0x0001fbc7", - "reverse_56": "0x0001fbcd", - "reverse_64": "0x0001fbd3", - "reverse_bd_addr": "0x0001fbd9", - "reverse_bytes": "0x0001fbdf", - "sm_add_event_handler": "0x0001fecd", - "sm_address_resolution_lookup": "0x00020025", - "sm_authenticated": "0x000203a1", - "sm_authorization_decline": "0x000203af", - "sm_authorization_grant": "0x000203cf", - "sm_authorization_state": "0x000203ef", - "sm_bonding_decline": "0x00020409", - "sm_config": "0x00020865", - "sm_config_conn": "0x0002087d", - "sm_encryption_key_size": "0x00020a33", - "sm_just_works_confirm": "0x00020fb9", - "sm_le_device_key": "0x00021305", - "sm_passkey_input": "0x0002139b", - "sm_private_random_address_generation_get": "0x00021755", - "sm_private_random_address_generation_get_mode": "0x0002175d", - "sm_private_random_address_generation_set_mode": "0x00021769", - "sm_private_random_address_generation_set_update_period": "0x00021791", - "sm_register_external_ltk_callback": "0x000218cd", - "sm_register_oob_data_callback": "0x000218d9", - "sm_request_pairing": "0x000218e5", - "sm_send_security_request": "0x000223bb", - "sm_set_accepted_stk_generation_methods": "0x000223e1", - "sm_set_authentication_requirements": "0x000223ed", - "sm_set_encryption_key_size_range": "0x000223f9", - "sscanf_bd_addr": "0x00022755", - "sysSetPublicDeviceAddr": "0x00022b09", - "uuid128_to_str": "0x000232a9", - "uuid_add_bluetooth_prefix": "0x00023301", - "uuid_has_bluetooth_prefix": "0x00023321", - "uxListRemove": "0x0002333d", - "uxQueueMessagesWaiting": "0x00023365", - "uxQueueMessagesWaitingFromISR": "0x0002338d", - "uxQueueSpacesAvailable": "0x000233a9", - "uxTaskGetStackHighWaterMark": "0x000233d5", - "uxTaskPriorityGet": "0x000233f5", - "uxTaskPriorityGetFromISR": "0x00023411", - "vListInitialise": "0x000234cb", - "vListInitialiseItem": "0x000234e1", - "vListInsert": "0x000234e7", - "vListInsertEnd": "0x00023517", - "vPortEndScheduler": "0x00023531", - "vPortEnterCritical": "0x0002355d", - "vPortExitCritical": "0x000235a1", - "vPortFree": "0x000235d5", - "vPortSuppressTicksAndSleep": "0x00023669", - "vPortValidateInterruptPriority": "0x00023791", - "vQueueDelete": "0x000237ed", - "vQueueWaitForMessageRestricted": "0x00023819", - "vTaskDelay": "0x00023861", - "vTaskInternalSetTimeOutState": "0x000238ad", - "vTaskMissedYield": "0x000238bd", - "vTaskPlaceOnEventList": "0x000238c9", - "vTaskPlaceOnEventListRestricted": "0x00023901", - "vTaskPriorityDisinheritAfterTimeout": "0x00023941", - "vTaskPrioritySet": "0x000239ed", - "vTaskResume": "0x00023ab5", - "vTaskStartScheduler": "0x00023b39", - "vTaskStepTick": "0x00023bc9", - "vTaskSuspend": "0x00023bf9", - "vTaskSuspendAll": "0x00023cb5", - "vTaskSwitchContext": "0x00023cc5", - "xPortStartScheduler": "0x00023d6d", - "xQueueAddToSet": "0x00023e35", - "xQueueCreateCountingSemaphore": "0x00023e59", - "xQueueCreateCountingSemaphoreStatic": "0x00023e95", - "xQueueCreateMutex": "0x00023ed9", - "xQueueCreateMutexStatic": "0x00023eef", - "xQueueCreateSet": "0x00023f09", - "xQueueGenericCreate": "0x00023f11", - "xQueueGenericCreateStatic": "0x00023f5d", - "xQueueGenericReset": "0x00023fc5", - "xQueueGenericSend": "0x00024051", - "xQueueGenericSendFromISR": "0x000241bd", - "xQueueGiveFromISR": "0x0002427d", - "xQueueGiveMutexRecursive": "0x00024321", - "xQueueIsQueueEmptyFromISR": "0x00024361", - "xQueueIsQueueFullFromISR": "0x00024385", - "xQueuePeek": "0x000243ad", - "xQueuePeekFromISR": "0x000244d5", - "xQueueReceive": "0x00024541", - "xQueueReceiveFromISR": "0x0002466d", - "xQueueRemoveFromSet": "0x00024701", - "xQueueSelectFromSet": "0x00024723", - "xQueueSelectFromSetFromISR": "0x00024735", - "xQueueSemaphoreTake": "0x00024749", - "xQueueTakeMutexRecursive": "0x000248b5", - "xTaskCheckForTimeOut": "0x000248f9", - "xTaskCreate": "0x00024969", - "xTaskCreateStatic": "0x000249c5", - "xTaskGetCurrentTaskHandle": "0x00024a35", - "xTaskGetSchedulerState": "0x00024a41", - "xTaskGetTickCount": "0x00024a5d", - "xTaskGetTickCountFromISR": "0x00024a69", - "xTaskIncrementTick": "0x00024a79", - "xTaskPriorityDisinherit": "0x00024b45", - "xTaskPriorityInherit": "0x00024bd9", - "xTaskRemoveFromEventList": "0x00024c6d", - "xTaskResumeAll": "0x00024ced", - "xTaskResumeFromISR": "0x00024db5", - "xTimerCreate": "0x00024e41", - "xTimerCreateStatic": "0x00024e75", - "xTimerCreateTimerTask": "0x00024ead", - "xTimerGenericCommand": "0x00024f19", - "xTimerGetExpiryTime": "0x00024f89", - "xTimerGetTimerDaemonTaskHandle": "0x00024fa9" + "att_dispatch_client_can_send_now": "0x000058bd", + "att_dispatch_client_request_can_send_now_event": "0x000058c3", + "att_dispatch_register_client": "0x000058c9", + "att_dispatch_register_server": "0x000058dd", + "att_dispatch_server_can_send_now": "0x000058f1", + "att_dispatch_server_request_can_send_now_event": "0x000058f7", + "att_emit_general_event": "0x000059a9", + "att_server_can_send_packet_now": "0x000060d9", + "att_server_deferred_read_response": "0x000060dd", + "att_server_get_mtu": "0x000060f5", + "att_server_indicate": "0x0000616d", + "att_server_init": "0x000061f1", + "att_server_notify": "0x0000622d", + "att_server_register_packet_handler": "0x00006345", + "att_server_request_can_send_now_event": "0x00006351", + "att_set_db": "0x0000636d", + "att_set_read_callback": "0x00006381", + "att_set_write_callback": "0x0000638d", + "bd_addr_cmp": "0x000064fd", + "bd_addr_copy": "0x00006503", + "bd_addr_to_str": "0x0000650d", + "big_endian_read_16": "0x00006545", + "big_endian_read_32": "0x0000654d", + "big_endian_store_16": "0x00006561", + "big_endian_store_32": "0x0000656d", + "btstack_config": "0x000066c1", + "btstack_memory_pool_create": "0x000067ff", + "btstack_memory_pool_free": "0x00006829", + "btstack_memory_pool_get": "0x00006889", + "btstack_push_user_msg": "0x000068f1", + "btstack_push_user_runnable": "0x000068fd", + "btstack_reset": "0x00006909", + "char_for_nibble": "0x00006be5", + "eTaskConfirmSleepModeStatus": "0x00006ec9", + "gap_add_dev_to_periodic_list": "0x0000753d", + "gap_add_whitelist": "0x0000754d", + "gap_aes_encrypt": "0x00007559", + "gap_clear_white_lists": "0x00007591", + "gap_clr_adv_set": "0x0000759d", + "gap_clr_periodic_adv_list": "0x000075a9", + "gap_create_connection_cancel": "0x000075b5", + "gap_default_periodic_adv_sync_transfer_param": "0x000075c1", + "gap_disconnect": "0x000075d9", + "gap_disconnect_all": "0x00007605", + "gap_ext_create_connection": "0x00007645", + "gap_get_connection_parameter_range": "0x0000771d", + "gap_le_read_channel_map": "0x00007755", + "gap_periodic_adv_create_sync": "0x000077c1", + "gap_periodic_adv_create_sync_cancel": "0x000077e5", + "gap_periodic_adv_set_info_transfer": "0x000077f1", + "gap_periodic_adv_sync_transfer": "0x00007801", + "gap_periodic_adv_sync_transfer_param": "0x00007811", + "gap_periodic_adv_term_sync": "0x0000782d", + "gap_read_antenna_info": "0x000078b5", + "gap_read_periodic_adv_list_size": "0x000078c1", + "gap_read_phy": "0x000078cd", + "gap_read_remote_used_features": "0x000078d9", + "gap_read_remote_version": "0x000078e5", + "gap_read_rssi": "0x000078f1", + "gap_remove_whitelist": "0x000078fd", + "gap_rmv_adv_set": "0x00007979", + "gap_rmv_dev_from_periodic_list": "0x00007985", + "gap_rx_test_v2": "0x00007995", + "gap_rx_test_v3": "0x000079a5", + "gap_set_adv_set_random_addr": "0x000079f1", + "gap_set_callback_for_next_hci": "0x00007a2d", + "gap_set_connection_cte_request_enable": "0x00007a55", + "gap_set_connection_cte_response_enable": "0x00007a71", + "gap_set_connection_cte_rx_param": "0x00007a81", + "gap_set_connection_cte_tx_param": "0x00007ad5", + "gap_set_connection_parameter_range": "0x00007b21", + "gap_set_connectionless_cte_tx_enable": "0x00007b3d", + "gap_set_connectionless_cte_tx_param": "0x00007b4d", + "gap_set_connectionless_iq_sampling_enable": "0x00007ba9", + "gap_set_data_length": "0x00007c05", + "gap_set_def_phy": "0x00007c1d", + "gap_set_ext_adv_data": "0x00007c2d", + "gap_set_ext_adv_enable": "0x00007c45", + "gap_set_ext_adv_para": "0x00007cb5", + "gap_set_ext_scan_enable": "0x00007d8d", + "gap_set_ext_scan_para": "0x00007da5", + "gap_set_ext_scan_response_data": "0x00007e45", + "gap_set_host_channel_classification": "0x00007e5d", + "gap_set_periodic_adv_data": "0x00007e6d", + "gap_set_periodic_adv_enable": "0x00007edd", + "gap_set_periodic_adv_para": "0x00007eed", + "gap_set_periodic_adv_rx_enable": "0x00007f05", + "gap_set_phy": "0x00007f15", + "gap_set_random_device_address": "0x00007f31", + "gap_start_ccm": "0x00007f61", + "gap_test_end": "0x00007fa9", + "gap_tx_test_v2": "0x00007fb5", + "gap_tx_test_v4": "0x00007fcd", + "gap_update_connection_parameters": "0x00007ff1", + "gap_vendor_tx_continuous_wave": "0x00008035", + "gatt_client_cancel_write": "0x0000855d", + "gatt_client_discover_characteristic_descriptors": "0x00008583", + "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x000085c3", + "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x00008613", + "gatt_client_discover_characteristics_for_service": "0x00008663", + "gatt_client_discover_primary_services": "0x00008699", + "gatt_client_discover_primary_services_by_uuid128": "0x000086cb", + "gatt_client_discover_primary_services_by_uuid16": "0x0000870f", + "gatt_client_execute_write": "0x0000874b", + "gatt_client_find_included_services_for_service": "0x00008771", + "gatt_client_get_mtu": "0x0000879f", + "gatt_client_is_ready": "0x00008841", + "gatt_client_listen_for_characteristic_value_updates": "0x00008857", + "gatt_client_prepare_write": "0x00008879", + "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x000088b5", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x000088df", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x000088e5", + "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x00008913", + "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x00008919", + "gatt_client_read_multiple_characteristic_values": "0x00008947", + "gatt_client_read_value_of_characteristic_using_value_handle": "0x00008977", + "gatt_client_read_value_of_characteristics_by_uuid128": "0x000089a5", + "gatt_client_read_value_of_characteristics_by_uuid16": "0x000089f1", + "gatt_client_register_handler": "0x00008a3d", + "gatt_client_reliable_write_long_value_of_characteristic": "0x00008a49", + "gatt_client_signed_write_without_response": "0x00008e79", + "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x00008f3d", + "gatt_client_write_client_characteristic_configuration": "0x00008f77", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x00008fc9", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008fd9", + "gatt_client_write_long_value_of_characteristic": "0x00009015", + "gatt_client_write_long_value_of_characteristic_with_offset": "0x00009025", + "gatt_client_write_value_of_characteristic": "0x00009061", + "gatt_client_write_value_of_characteristic_without_response": "0x00009097", + "hci_add_event_handler": "0x0000a5d9", + "hci_power_control": "0x0000ad7d", + "hci_register_acl_packet_handler": "0x0000af31", + "kv_commit": "0x0000b6b9", + "kv_get": "0x0000b715", + "kv_init": "0x0000b721", + "kv_init_backend": "0x0000b7a1", + "kv_put": "0x0000b7b5", + "kv_remove": "0x0000b7c1", + "kv_remove_all": "0x0000b7f5", + "kv_value_modified": "0x0000b825", + "kv_value_modified_of_key": "0x0000b841", + "kv_visit": "0x0000b84d", + "l2cap_add_event_handler": "0x0000b8dd", + "l2cap_can_send_packet_now": "0x0000b8ed", + "l2cap_create_le_credit_based_connection_request": "0x0000baa9", + "l2cap_credit_based_send": "0x0000bbed", + "l2cap_credit_based_send_continue": "0x0000bc19", + "l2cap_disconnect": "0x0000bc95", + "l2cap_get_le_credit_based_connection_credits": "0x0000bee5", + "l2cap_get_peer_mtu_for_local_cid": "0x0000bf01", + "l2cap_init": "0x0000c2d5", + "l2cap_le_send_flow_control_credit": "0x0000c3cb", + "l2cap_max_le_mtu": "0x0000c6d5", + "l2cap_register_packet_handler": "0x0000c7fd", + "l2cap_register_service": "0x0000c809", + "l2cap_request_can_send_now_event": "0x0000c919", + "l2cap_request_connection_parameter_update": "0x0000c933", + "l2cap_send_echo_request": "0x0000ce0d", + "l2cap_unregister_service": "0x0000cecd", + "le_device_db_add": "0x0000cf25", + "le_device_db_find": "0x0000cffd", + "le_device_db_from_key": "0x0000d029", + "le_device_db_iter_cur": "0x0000d031", + "le_device_db_iter_cur_key": "0x0000d035", + "le_device_db_iter_init": "0x0000d039", + "le_device_db_iter_next": "0x0000d041", + "le_device_db_remove_key": "0x0000d067", + "ll_aes_encrypt": "0x0000d095", + "ll_config": "0x0000d111", + "ll_free": "0x0000d147", + "ll_get_heap_free_size": "0x0000d151", + "ll_hint_on_ce_len": "0x0000d165", + "ll_legacy_adv_set_interval": "0x0000d19d", + "ll_malloc": "0x0000d1ad", + "ll_query_timing_info": "0x0000d2e5", + "ll_register_hci_acl_previewer": "0x0000d331", + "ll_scan_set_fixed_channel": "0x0000d395", + "ll_set_adv_access_address": "0x0000d5ad", + "ll_set_adv_coded_scheme": "0x0000d5b9", + "ll_set_conn_acl_report_latency": "0x0000d5e9", + "ll_set_conn_coded_scheme": "0x0000d619", + "ll_set_conn_latency": "0x0000d645", + "ll_set_conn_tx_power": "0x0000d675", + "ll_set_def_antenna": "0x0000d6bd", + "ll_set_initiating_coded_scheme": "0x0000d6d9", + "ll_set_max_conn_number": "0x0000d6e5", + "nibble_for_char": "0x0001e785", + "platform_32k_rc_auto_tune": "0x0001e831", + "platform_32k_rc_tune": "0x0001e8ad", + "platform_calibrate_32k": "0x0001e8c1", + "platform_call_on_stack": "0x00004183", + "platform_config": "0x0001e8c5", + "platform_delete_timer": "0x0001e9e9", + "platform_enable_irq": "0x0001e9f1", + "platform_get_current_task": "0x0001ea29", + "platform_get_gen_os_driver": "0x0001ea4d", + "platform_get_heap_status": "0x0001ea55", + "platform_get_link_layer_interf": "0x0001ea6d", + "platform_get_task_handle": "0x0001ea75", + "platform_get_timer_counter": "0x0001ea95", + "platform_get_us_time": "0x0001ea99", + "platform_get_version": "0x0001ea9d", + "platform_hrng": "0x0001eaa5", + "platform_install_isr_stack": "0x0001eaad", + "platform_install_task_stack": "0x0001eab9", + "platform_patch_rf_init_data": "0x0001eaf1", + "platform_printf": "0x0001eafd", + "platform_raise_assertion": "0x0001eb11", + "platform_rand": "0x0001eb25", + "platform_read_info": "0x0001eb29", + "platform_read_persistent_reg": "0x0001eb59", + "platform_reset": "0x0001eb69", + "platform_set_abs_timer": "0x0001eb8d", + "platform_set_evt_callback": "0x0001eb91", + "platform_set_evt_callback_table": "0x0001eba5", + "platform_set_irq_callback": "0x0001ebb1", + "platform_set_irq_callback_table": "0x0001ebcd", + "platform_set_rf_clk_source": "0x0001ebd9", + "platform_set_rf_init_data": "0x0001ebe5", + "platform_set_rf_power_mapping": "0x0001ebf1", + "platform_set_timer": "0x0001ebfd", + "platform_shutdown": "0x0001ec01", + "platform_switch_app": "0x0001ec05", + "platform_trace_raw": "0x0001ec31", + "platform_write_persistent_reg": "0x0001ec49", + "printf_hexdump": "0x0001edfd", + "pvPortMalloc": "0x0001f8f1", + "pvTaskIncrementMutexHeldCount": "0x0001f9d9", + "pvTimerGetTimerID": "0x0001f9f1", + "pxPortInitialiseStack": "0x0001fa1d", + "reverse_128": "0x0001fbfd", + "reverse_24": "0x0001fc03", + "reverse_256": "0x0001fc09", + "reverse_48": "0x0001fc0f", + "reverse_56": "0x0001fc15", + "reverse_64": "0x0001fc1b", + "reverse_bd_addr": "0x0001fc21", + "reverse_bytes": "0x0001fc27", + "sm_add_event_handler": "0x0001ff15", + "sm_address_resolution_lookup": "0x0002006d", + "sm_authenticated": "0x000203e9", + "sm_authorization_decline": "0x000203f7", + "sm_authorization_grant": "0x00020417", + "sm_authorization_state": "0x00020437", + "sm_bonding_decline": "0x00020451", + "sm_config": "0x000208ad", + "sm_config_conn": "0x000208c5", + "sm_encryption_key_size": "0x00020a7b", + "sm_just_works_confirm": "0x00021001", + "sm_le_device_key": "0x0002134d", + "sm_passkey_input": "0x000213e3", + "sm_private_random_address_generation_get": "0x0002179d", + "sm_private_random_address_generation_get_mode": "0x000217a5", + "sm_private_random_address_generation_set_mode": "0x000217b1", + "sm_private_random_address_generation_set_update_period": "0x000217d9", + "sm_register_external_ltk_callback": "0x00021915", + "sm_register_oob_data_callback": "0x00021921", + "sm_request_pairing": "0x0002192d", + "sm_send_security_request": "0x00022403", + "sm_set_accepted_stk_generation_methods": "0x00022429", + "sm_set_authentication_requirements": "0x00022435", + "sm_set_encryption_key_size_range": "0x00022441", + "sscanf_bd_addr": "0x0002279d", + "sysSetPublicDeviceAddr": "0x00022b51", + "uuid128_to_str": "0x000232f1", + "uuid_add_bluetooth_prefix": "0x00023349", + "uuid_has_bluetooth_prefix": "0x00023369", + "uxListRemove": "0x00023385", + "uxQueueMessagesWaiting": "0x000233ad", + "uxQueueMessagesWaitingFromISR": "0x000233d5", + "uxQueueSpacesAvailable": "0x000233f1", + "uxTaskGetStackHighWaterMark": "0x0002341d", + "uxTaskPriorityGet": "0x0002343d", + "uxTaskPriorityGetFromISR": "0x00023459", + "vListInitialise": "0x00023513", + "vListInitialiseItem": "0x00023529", + "vListInsert": "0x0002352f", + "vListInsertEnd": "0x0002355f", + "vPortEndScheduler": "0x00023579", + "vPortEnterCritical": "0x000235a5", + "vPortExitCritical": "0x000235e9", + "vPortFree": "0x0002361d", + "vPortSuppressTicksAndSleep": "0x000236b1", + "vPortValidateInterruptPriority": "0x000237d9", + "vQueueDelete": "0x00023835", + "vQueueWaitForMessageRestricted": "0x00023861", + "vTaskDelay": "0x000238a9", + "vTaskInternalSetTimeOutState": "0x000238f5", + "vTaskMissedYield": "0x00023905", + "vTaskPlaceOnEventList": "0x00023911", + "vTaskPlaceOnEventListRestricted": "0x00023949", + "vTaskPriorityDisinheritAfterTimeout": "0x00023989", + "vTaskPrioritySet": "0x00023a35", + "vTaskResume": "0x00023afd", + "vTaskStartScheduler": "0x00023b81", + "vTaskStepTick": "0x00023c11", + "vTaskSuspend": "0x00023c41", + "vTaskSuspendAll": "0x00023cfd", + "vTaskSwitchContext": "0x00023d0d", + "xPortStartScheduler": "0x00023db5", + "xQueueAddToSet": "0x00023e7d", + "xQueueCreateCountingSemaphore": "0x00023ea1", + "xQueueCreateCountingSemaphoreStatic": "0x00023edd", + "xQueueCreateMutex": "0x00023f21", + "xQueueCreateMutexStatic": "0x00023f37", + "xQueueCreateSet": "0x00023f51", + "xQueueGenericCreate": "0x00023f59", + "xQueueGenericCreateStatic": "0x00023fa5", + "xQueueGenericReset": "0x0002400d", + "xQueueGenericSend": "0x00024099", + "xQueueGenericSendFromISR": "0x00024205", + "xQueueGiveFromISR": "0x000242c5", + "xQueueGiveMutexRecursive": "0x00024369", + "xQueueIsQueueEmptyFromISR": "0x000243a9", + "xQueueIsQueueFullFromISR": "0x000243cd", + "xQueuePeek": "0x000243f5", + "xQueuePeekFromISR": "0x0002451d", + "xQueueReceive": "0x00024589", + "xQueueReceiveFromISR": "0x000246b5", + "xQueueRemoveFromSet": "0x00024749", + "xQueueSelectFromSet": "0x0002476b", + "xQueueSelectFromSetFromISR": "0x0002477d", + "xQueueSemaphoreTake": "0x00024791", + "xQueueTakeMutexRecursive": "0x000248fd", + "xTaskCheckForTimeOut": "0x00024941", + "xTaskCreate": "0x000249b1", + "xTaskCreateStatic": "0x00024a0d", + "xTaskGetCurrentTaskHandle": "0x00024a7d", + "xTaskGetSchedulerState": "0x00024a89", + "xTaskGetTickCount": "0x00024aa5", + "xTaskGetTickCountFromISR": "0x00024ab1", + "xTaskIncrementTick": "0x00024ac1", + "xTaskPriorityDisinherit": "0x00024b8d", + "xTaskPriorityInherit": "0x00024c21", + "xTaskRemoveFromEventList": "0x00024cb5", + "xTaskResumeAll": "0x00024d35", + "xTaskResumeFromISR": "0x00024dfd", + "xTimerCreate": "0x00024e89", + "xTimerCreateStatic": "0x00024ebd", + "xTimerCreateTimerTask": "0x00024ef5", + "xTimerGenericCommand": "0x00024f61", + "xTimerGetExpiryTime": "0x00024fd1", + "xTimerGetTimerDaemonTaskHandle": "0x00024ff1" } \ No newline at end of file diff --git a/bundles/mass_conn/ING9188xx/meta.json b/bundles/mass_conn/ING9188xx/meta.json index 057f5b835..4d63aea4c 100644 --- a/bundles/mass_conn/ING9188xx/meta.json +++ b/bundles/mass_conn/ING9188xx/meta.json @@ -8,11 +8,11 @@ }, "rom": { "base": 16384, - "size": 141812 + "size": 141884 }, "version": [ 1, 9, - 38 + 39 ] } \ No newline at end of file diff --git a/bundles/mass_conn/ING9188xx/platform.bin b/bundles/mass_conn/ING9188xx/platform.bin index 128922d3041a6461efae6d329312e58fc7a7e108..ecb4eb4fb2858d13eb0c32eb7c2fd68dc4c7afea 100644 GIT binary patch delta 7049 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 delta 7107 zcmZvh3s_cF*2mY{?*(22J9q)__&AlRp;MZ6^K!H| zO;RhTDE%6H!=sLxHu?48Xz7#oWs{e_(y|G~F-H)@@4wD_=&^a`eV*-at+m&_@3r?n zc=(*}FJJgpQax!2gNPD`5uG3CrO1;0{dW`j!{IBxcNUu1cT)ss%2nC2zriZ*-B`|7N&yuztRGyyGz3hUoWu4-fpgSdq%+TwDE~Lq8Yk#VM&h zV_*`)3x|llhoi`=A#b zAH{8XuCjuL%{|n#b!%6d`TF8M3lh&EOL{o{AbJ8hG}|xRTWtKn(PJLgM<2}93(~^F zhBU?;AsUZ7uV2Q&?~C=+zOyP_n5_SKinI|-npF7!%XQA0fJVrDr3mb|A=}5b7XSIc zSm}b<(`yI9ewD8r*dt|4`_~6Pf$W{~S|W@pu}ldH%+EVS&e4J#?A>{!FI zL8N&n9ese`@rDi7A}ETfv2QIZ!^ z3A%4hn{3*ovI#Ll^$Qw&(fV>dD`PIdsPD}vHTV7!Jv{RT^+~b*M&>qkxLEJsKRWnX zlx=M-{wP*NFYmvw-=2r8-=U@t%@#;+9iOWI>b|t_) zWWCHe-DS;{K4n05K$*D(RDC6iY|!@&h~y{r+5z#rR<9c{IJOyud}}t*rWhF#XZysd zTvgxGZ17dj$bsv9)VV_aQckgJ>vPzxh;x@GGq;aZ)s}i59~EuquAYsBO*UTSd8v4| zJ>ab=h|;NwMod$bq4UJoerxemPrR(uHzoS>Q=Sh$Rifyfr%C($yqQzWO3O>Tml9QZ z5~hw(yw9^@`VJNRo7$!;>g-9JVQ_ad%rMZkv%Mkb9G>)HOxfm!$FjoqB^{QH)4r^I z*~Ids!|f1~ddRFnIDGWtS*e1TXZ4q(=(AaC*tC|d5nL)WGb765L`y55BG^{`FTtic za|A7Op5`)r#oT;zc|H2sxy!6Wu3+A9ad>@RYTCy4aC+7!{YBNM9HLxwZ+z<^@))=7 zXFIz7U&-o>FJb^TNpj`{&hKU}qs=^X_Rz80D}$`8QS-Y=15eH0FX*{of#8h=!vr@L zbPxnC>=4*GFS+Kt=xGbhF)dzr)GW2AJI=W2i=GhW>qSrTPQ9q&Id6-3er0E-xyn>o zUYT!pkj&XXE6f=vTs$g7YL#>F&kg&nZRPo3@s~>dn6E$ohim+fUh()2L{sn+&$z1g zWm9$x?P4 z!WP=gp2&${MMnOQGr3FW=|%$D^$ z*>eXnN7cCabH#g&3yP;QcQyLid0cx{JH@@JBk$*RMxMsl$?v$U;&_KMZ#L8E*~XxF z9;JA#dt(>g!LJ(0kMPtGb@L-*Q(tbuwQ6ikTJ-TcTMm%)d`;Zg?Qu(QiJ zoyE5mXBo$ba35cuVKk25g;AVfl+WUE3OruM>B?FCCR6P(L(OHp0J4nCc|1}1tv-%t z$H!8u@x}uFm|b3lX|*wb5x4b6=@rZQA1+?%E?>jzd8yI3hVz-1xbxQXd$8VF%jsO^ zPF^Q4=C4Dgs$r)4SG{h&Oq^9b4G=>}_@`b)>ud%WBN&kNNIL-sNr_<}P@bJE}AJ?#1u&C76xE_c%iF zE~9)e$1C1yy!1Z5@28I6HToaor`xErWE?%ge{{L>{1lxJRkY8@`<(kQZ#Pz*;pYPU zYL%i@?G!aCcgQ79bH&<)XMR%Tbbi)-{{}YHcK76) zoP&AWeUo3aVcN59bA0T0#9~m5f1Ev!V!ypx-Qc^Aw4fu5L^R1*b(<&J`L=QKF2~z> zq`}RyDOMRJEqphK1Kb5|)u-XHEm-j+MO*d|ZA6Ol5INk5L8?dAou8TV>X40;fK&^8 zD$*9DnMlD%c}THH)eTJNQxr``+J)3FT~Ve{6{Ox*l?8Z)7HUK{$`p+OzX8XB{|6R< zbzm|012_(Jz<)g03oNnp31AHLiQrxMO#*L$lfi$2+>FZ_`Mscj2fa6V5zN;phC-3C z42C8cI)d_3C@`p8xzBb{VMbG^y2A<5ZmgZC18DR2x-ADa=#DV2-Jub6c1K01j+OB+ zhd>pEf{%be5X*Qe+LkG{6l=@AYH^3I)Stb@(N=`r1~3oxCOZm>02cE z%|AE-X^Yll4ab)ppi`*R$Siy)Vx9@Jpgv&>&9J8__? zEcdtD9jK_ny*pav1ek4VzP@e5*WDPc;-^c~POWW_v@5cYM${JB^7GX+P3{x1yCCC% zYs!9_bjd5X(R_R&t)~4orP^6?fEE>nF{7Ck?NyITsUiff7_M1Gs1_LLB<~2rG>5}w z*~3wVk7bX5>}$!9Xg=7gT6SNE)x{_+CdOs?L~9`-ewN%GW!qSCj7GC4)G83GaUs^6 z(zjy=Xtp8=kOIgOP=1i*r=fEJR^d*X%^qmUahlWVZ^`i*QMgrSXU%Spkj}X`#;C|j zndM~7W{Vcn6~=D&@d>ty_0nu+^A0rGTeF+Z2SZMQPXL;(M%h$MU7#iR(H=Z#Ysq~f z%Q}fqKP@gU7_!u#rV+Kbx{|Ju`_WhxTq#bO$Owg#{Q9GTFi`9RP*J!g55z=8K$eQK zFz(K%sPRog1Ua2utN{$xGBP6Ja~T~S0-r}LyF}BYR>Rq-hsjPk@X679Lwq|}PPy1` z9YuE6#;WxB(oVisXikF2qctCM5*|gl0&Vo@c2>U%QD2lLkI@PW@F8W^Jr+J8?s9X74pEj}H9H*9=%U!05GUc=h;R+j3PfZRJ2lap*tgOWTo(N-23icV7;G`b zVwjhMdw682UX5(2huh(0Akas4sUXwOW%JV45p-u4>^?59ZcFoaP^DWP9d7BvymX8(*@E_Im)R4d z!4_wNO^)$iM`kbWN_$)EE}La{c&U6Ww)HYN(#y8o?CoGXukMPm*uzUlyvfQY?raJ& zC9BcEJ)Flfb@y-<3!ChT{&_NDyCW=uitH{|nJk(H7`U zZQ?XTDwGCyOT|gQ4xmK*;rFP;J{G5f(vg>{yu50$rmE6gV6Np@VKEZiUaIIY(u|d) z*(sXvo}klqxt(y8I^bdag#uZy^k*w@IJaP$8;UKD@XJeP)^ly*yYr%g`b?btH8FBf1M}@+}nVi z4+h+m;~#%`gf7v)wUH#fVI*l_%>!H;;KhziiC|_BB(9_* z6PX6V&}9;-1g2qN3hEgS?ki>*0oIK} z8L$!lqrmF%I9tI0=%c}l=vV>GWqJucDuiL{Sf(*xc@fiCaYRK$V09r=F?hCsX&g8o z`grgTSOUhvJ^@?}4#6rXW2$>%4o_pvdx6Q%GtIzXGHmh=jeMoEvR5vLIs{pc(6I36 zgmm*wQIN)1aT}dTXRNr5s-XvfXTdRcoo=HQDV2~sONfhDj@J;C@QmYi@<>e+Id%{9j%vva1xq!WDw)+4=&$FB|3{s3W9 zfER^K?Y><&3-B;j@T;CiObfC3LcUrJX_03h_=cSrVfX+^{xfMi8Um+7mm)`Amp~=Duu%e) zsN@w!K;zR$mw?6f{wnsnJVzThOT^-TlHe#W&pYcSVsY-jCJ~EHZIy_{t+q`z8TJM8 zF*r&DL!Uy^bC}HEdT|Qz(h3gA7{XQtE*}sym@x(Cm6i&+vAQ+P&-C##up-f+Mm&f#d$=( zK!>dDTuO9h1h#fq^t;Sw?6KN774jftU|2=DitcZZPOwKWvQJnTlwhB**gm0COhV@b N{|Q~)e%(~h{|EHIpgI5m diff --git a/bundles/mass_conn/inc/gap.h b/bundles/mass_conn/inc/gap.h index 68eee5323..595bde525 100644 --- a/bundles/mass_conn/inc/gap.h +++ b/bundles/mass_conn/inc/gap.h @@ -1287,7 +1287,7 @@ uint8_t gap_rx_test_v2(uint8_t rx_channel, uint8_t phy, uint8_t modulation_index uint8_t gap_rx_test_v3(uint8_t rx_channel, uint8_t phy, uint8_t modulation_index, uint8_t expected_cte_length, uint8_t expected_cte_type, uint8_t slot_durations, - uint8_t switching_pattern_length, uint8_t *antenna_ids); + uint8_t switching_pattern_length, const uint8_t *antenna_ids); /** * @brief Start a test where the DUT generates test reference packets at a fixed interval. @@ -1324,7 +1324,7 @@ uint8_t gap_tx_test_v2(uint8_t tx_channel, uint8_t test_data_length, uint8_t gap_tx_test_v4(uint8_t tx_channel, uint8_t test_data_length, uint8_t packet_payload, uint8_t phy, uint8_t cte_length, uint8_t cte_type, - uint8_t switching_pattern_length, uint8_t *antenna_ids, + uint8_t switching_pattern_length, const uint8_t *antenna_ids, int8_t tx_power_level); /** diff --git a/bundles/mass_conn/inc/ll_api.h b/bundles/mass_conn/inc/ll_api.h index 254e9e756..275c71b50 100644 --- a/bundles/mass_conn/inc/ll_api.h +++ b/bundles/mass_conn/inc/ll_api.h @@ -98,6 +98,59 @@ void ll_set_initiating_coded_scheme(const coded_scheme_t scheme); */ void ll_hint_on_ce_len(const uint16_t conn_handle, const uint16_t min_ce_len, const uint16_t max_ce_len); +/** + **************************************************************************************** + * @brief Create a connection directly (without advertising & initiating) + * + * @param[in] role connection role. master (0), slave (1) + * @param[in] addr_types address types for advertiser and initiator + * bit [0] for slave, bit [1] for master + * 0: public address; 1: random address + * @param[in] adv_addr address of advertiser + * @param[in] init_addr address of initiator + * @param[in] rx_phy Rx PHY (1: 1M, 2: 2M, 3: Coded) + * @param[in] tx_phy Tx PHY (1: 1M, 2: 2M, 3: Coded) + * @param[in] access_addr access address + * @param[in] crc_init CRC init + * @param[in] interval connection interval (unit: us) + * @param[in] sup_timeout supervision timeout (unit: 10ms) + * @param[in] channel_map channel map + * @param[in] ch_sel_algo channel selection algorithm (1 or 2) + * @param[in] hop_inc hop increment for CSA#1 ([5..16]) + * @param[in] min_ce_len information parameter about the minimum length of connection + * event needed for this LE connection. + * @param[in] max_ce_len information parameter about the maximum length of connection + * event needed for this LE connection. + * @param[in] start_time start time of the 1st connectin event + * @param[in] slave_latency slave latency + * @param[in] sleep_clk_acc sleep clock accuracy + * @param[in] sync_window slave's sync window for 1st connection event + * @return 0 if successful else error code + **************************************************************************************** + */ +// int ll_create_conn( +// uint8_t role, +// uint8_t addr_types, +// const uint8_t *adv_addr, +// const uint8_t *init_addr, +// uint8_t rx_phy, +// uint8_t tx_phy, +// uint32_t access_addr, +// uint32_t crc_init, +// uint32_t interval, +// uint16_t sup_timeout, +// const uint8_t *channel_map, +// uint8_t ch_sel_algo, +// uint8_t hop_inc, +// uint16_t min_ce_len, +// uint16_t max_ce_len, +// uint64_t start_time, +// uint16_t slave_latency, +// uint8_t sleep_clk_acc, +// uint32_t sync_window); +// WARNING: ^^^ this API is not available in this release + + /** **************************************************************************************** * @brief Set tx power of a connection diff --git a/bundles/mini/ING9168xx/meta.json b/bundles/mini/ING9168xx/meta.json index dcdc3f068..33593fcbb 100644 --- a/bundles/mini/ING9168xx/meta.json +++ b/bundles/mini/ING9168xx/meta.json @@ -13,6 +13,6 @@ "version": [ 2, 2, - 52 + 53 ] } \ No newline at end of file diff --git a/bundles/mini/ING9168xx/platform.bin b/bundles/mini/ING9168xx/platform.bin index 9f783c7e27d59085094a9601d2673f56fe7c0f20..99a72d657e503979531858deef8ebcd8b2c6dba7 100644 GIT binary patch delta 20 ccmaE|pYzFn&I$h+O`90o7#X)QGChd{0Ah>?Bme*a delta 20 ccmaE|pYzFn&I$h+O_~_n7#X)QGChd{0Ahg%BLDyZ diff --git a/bundles/mini/ING9187xx/apis.json b/bundles/mini/ING9187xx/apis.json index 76958f6d3..4cd856657 100644 --- a/bundles/mini/ING9187xx/apis.json +++ b/bundles/mini/ING9187xx/apis.json @@ -1,330 +1,331 @@ { - "att_dispatch_client_can_send_now": "0x00005749", - "att_dispatch_client_request_can_send_now_event": "0x0000574f", - "att_dispatch_register_client": "0x00005755", - "att_dispatch_register_server": "0x00005769", - "att_dispatch_server_can_send_now": "0x0000577d", - "att_dispatch_server_request_can_send_now_event": "0x00005783", - "att_emit_general_event": "0x00005835", - "att_server_can_send_packet_now": "0x00005f61", - "att_server_deferred_read_response": "0x00005f65", - "att_server_get_mtu": "0x00005f7d", - "att_server_indicate": "0x00005fe9", - "att_server_init": "0x0000606d", - "att_server_notify": "0x000060a9", - "att_server_register_packet_handler": "0x000061c1", - "att_server_request_can_send_now_event": "0x000061cd", - "att_set_db": "0x000061e9", - "att_set_read_callback": "0x000061fd", - "att_set_write_callback": "0x00006209", - "bd_addr_cmp": "0x00006379", - "bd_addr_copy": "0x0000637f", - "bd_addr_to_str": "0x00006389", - "big_endian_read_16": "0x000063c1", - "big_endian_read_32": "0x000063c9", - "big_endian_store_16": "0x000063dd", - "big_endian_store_32": "0x000063e9", - "btstack_config": "0x0000653d", - "btstack_memory_pool_create": "0x0000667b", - "btstack_memory_pool_free": "0x000066a5", - "btstack_memory_pool_get": "0x00006705", - "btstack_push_user_msg": "0x0000676d", - "btstack_push_user_runnable": "0x00006779", - "btstack_reset": "0x00006785", - "char_for_nibble": "0x00006a61", - "eTaskConfirmSleepModeStatus": "0x00006d41", - "gap_add_dev_to_periodic_list": "0x0000733d", - "gap_add_whitelist": "0x0000734d", - "gap_aes_encrypt": "0x00007359", - "gap_clear_white_lists": "0x00007391", - "gap_clr_adv_set": "0x0000739d", - "gap_clr_periodic_adv_list": "0x000073a9", - "gap_create_connection_cancel": "0x000073b5", - "gap_disconnect": "0x000073c1", - "gap_disconnect_all": "0x000073ed", - "gap_ext_create_connection": "0x0000742d", - "gap_get_connection_parameter_range": "0x00007505", - "gap_le_read_channel_map": "0x0000753d", - "gap_periodic_adv_create_sync": "0x000075a9", - "gap_periodic_adv_create_sync_cancel": "0x000075cd", - "gap_periodic_adv_term_sync": "0x000075d9", - "gap_read_periodic_adv_list_size": "0x00007661", - "gap_read_phy": "0x0000766d", - "gap_read_remote_used_features": "0x00007679", - "gap_read_remote_version": "0x00007685", - "gap_read_rssi": "0x00007691", - "gap_remove_whitelist": "0x0000769d", - "gap_rmv_adv_set": "0x00007719", - "gap_rmv_dev_from_periodic_list": "0x00007725", - "gap_rx_test_v2": "0x00007735", - "gap_set_adv_set_random_addr": "0x0000776d", - "gap_set_callback_for_next_hci": "0x000077a9", - "gap_set_connection_parameter_range": "0x000077c9", - "gap_set_data_length": "0x000077e1", - "gap_set_def_phy": "0x000077f9", - "gap_set_ext_adv_data": "0x00007809", - "gap_set_ext_adv_enable": "0x00007821", - "gap_set_ext_adv_para": "0x00007891", - "gap_set_ext_scan_enable": "0x00007969", - "gap_set_ext_scan_para": "0x00007981", - "gap_set_ext_scan_response_data": "0x00007a21", - "gap_set_host_channel_classification": "0x00007a39", - "gap_set_periodic_adv_data": "0x00007a49", - "gap_set_periodic_adv_enable": "0x00007ab9", - "gap_set_periodic_adv_para": "0x00007ac9", - "gap_set_phy": "0x00007ae1", - "gap_set_random_device_address": "0x00007afd", - "gap_start_ccm": "0x00007b2d", - "gap_test_end": "0x00007b75", - "gap_tx_test_v2": "0x00007b81", - "gap_tx_test_v4": "0x00007b99", - "gap_update_connection_parameters": "0x00007bbd", - "gap_vendor_tx_continuous_wave": "0x00007bfd", - "gatt_client_cancel_write": "0x00008125", - "gatt_client_discover_characteristic_descriptors": "0x0000814b", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x0000818b", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x000081db", - "gatt_client_discover_characteristics_for_service": "0x0000822b", - "gatt_client_discover_primary_services": "0x00008261", - "gatt_client_discover_primary_services_by_uuid128": "0x00008293", - "gatt_client_discover_primary_services_by_uuid16": "0x000082d7", - "gatt_client_execute_write": "0x00008313", - "gatt_client_find_included_services_for_service": "0x00008339", - "gatt_client_get_mtu": "0x00008367", - "gatt_client_is_ready": "0x00008405", - "gatt_client_listen_for_characteristic_value_updates": "0x0000841b", - "gatt_client_prepare_write": "0x0000843b", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x00008477", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x000084a1", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x000084a7", - "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x000084d5", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x000084db", - "gatt_client_read_multiple_characteristic_values": "0x00008509", - "gatt_client_read_value_of_characteristic_using_value_handle": "0x00008539", - "gatt_client_read_value_of_characteristics_by_uuid128": "0x00008567", - "gatt_client_read_value_of_characteristics_by_uuid16": "0x000085b3", - "gatt_client_register_handler": "0x000085fd", - "gatt_client_reliable_write_long_value_of_characteristic": "0x00008609", - "gatt_client_signed_write_without_response": "0x00008a0d", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x00008ad1", - "gatt_client_write_client_characteristic_configuration": "0x00008b0b", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x00008b5d", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008b6d", - "gatt_client_write_long_value_of_characteristic": "0x00008ba9", - "gatt_client_write_long_value_of_characteristic_with_offset": "0x00008bb9", - "gatt_client_write_value_of_characteristic": "0x00008bf5", - "gatt_client_write_value_of_characteristic_without_response": "0x00008c2b", - "hci_add_event_handler": "0x0000a145", - "hci_power_control": "0x0000a8cd", - "hci_register_acl_packet_handler": "0x0000aa81", - "kv_commit": "0x0000b1e9", - "kv_get": "0x0000b245", - "kv_init": "0x0000b251", - "kv_init_backend": "0x0000b2cd", - "kv_put": "0x0000b2e1", - "kv_remove": "0x0000b2ed", - "kv_remove_all": "0x0000b321", - "kv_value_modified": "0x0000b351", - "kv_value_modified_of_key": "0x0000b36d", - "kv_visit": "0x0000b379", - "l2cap_add_event_handler": "0x0000b409", - "l2cap_can_send_packet_now": "0x0000b419", - "l2cap_create_le_credit_based_connection_request": "0x0000b5d5", - "l2cap_credit_based_send": "0x0000b719", - "l2cap_credit_based_send_continue": "0x0000b745", - "l2cap_disconnect": "0x0000b7c1", - "l2cap_get_le_credit_based_connection_credits": "0x0000ba11", - "l2cap_get_peer_mtu_for_local_cid": "0x0000ba2d", - "l2cap_init": "0x0000be01", - "l2cap_le_send_flow_control_credit": "0x0000bef7", - "l2cap_max_le_mtu": "0x0000c201", - "l2cap_register_packet_handler": "0x0000c329", - "l2cap_register_service": "0x0000c335", - "l2cap_request_can_send_now_event": "0x0000c445", - "l2cap_request_connection_parameter_update": "0x0000c45f", - "l2cap_send_echo_request": "0x0000c939", - "l2cap_unregister_service": "0x0000c9f9", - "le_device_db_add": "0x0000ca51", - "le_device_db_find": "0x0000cb19", - "le_device_db_from_key": "0x0000cb45", - "le_device_db_iter_cur": "0x0000cb4d", - "le_device_db_iter_cur_key": "0x0000cb51", - "le_device_db_iter_init": "0x0000cb55", - "le_device_db_iter_next": "0x0000cb5d", - "le_device_db_remove_key": "0x0000cb83", - "ll_aes_encrypt": "0x0000cbb1", - "ll_config": "0x0000cc2d", - "ll_free": "0x0000cc63", - "ll_get_heap_free_size": "0x0000cc6d", - "ll_hint_on_ce_len": "0x0000cc81", - "ll_legacy_adv_set_interval": "0x0000ccb9", - "ll_malloc": "0x0000ccc9", - "ll_query_timing_info": "0x0000ce01", - "ll_register_hci_acl_previewer": "0x0000ce4d", - "ll_scan_set_fixed_channel": "0x0000ceb1", - "ll_set_adv_access_address": "0x0000d0c9", - "ll_set_adv_coded_scheme": "0x0000d0d5", - "ll_set_conn_acl_report_latency": "0x0000d0fd", - "ll_set_conn_coded_scheme": "0x0000d129", - "ll_set_conn_latency": "0x0000d151", - "ll_set_conn_tx_power": "0x0000d17d", - "ll_set_def_antenna": "0x0000d1c1", - "ll_set_initiating_coded_scheme": "0x0000d1dd", - "ll_set_max_conn_number": "0x0000d1e9", - "nibble_for_char": "0x0001d27d", - "platform_32k_rc_auto_tune": "0x0001d31d", - "platform_32k_rc_tune": "0x0001d399", - "platform_calibrate_32k": "0x0001d3ad", - "platform_config": "0x0001d3b1", - "platform_delete_timer": "0x0001d4d5", - "platform_enable_irq": "0x0001d4dd", - "platform_get_current_task": "0x0001d515", - "platform_get_gen_os_driver": "0x0001d539", - "platform_get_heap_status": "0x0001d541", - "platform_get_link_layer_interf": "0x0001d559", - "platform_get_task_handle": "0x0001d561", - "platform_get_timer_counter": "0x0001d581", - "platform_get_us_time": "0x0001d585", - "platform_get_version": "0x0001d589", - "platform_hrng": "0x0001d591", - "platform_install_isr_stack": "0x0001d599", - "platform_install_task_stack": "0x0001d5a5", - "platform_patch_rf_init_data": "0x0001d5dd", - "platform_printf": "0x0001d5e9", - "platform_raise_assertion": "0x0001d5fd", - "platform_rand": "0x0001d611", - "platform_read_info": "0x0001d615", - "platform_read_persistent_reg": "0x0001d645", - "platform_reset": "0x0001d655", - "platform_set_abs_timer": "0x0001d679", - "platform_set_evt_callback": "0x0001d67d", - "platform_set_evt_callback_table": "0x0001d691", - "platform_set_irq_callback": "0x0001d69d", - "platform_set_irq_callback_table": "0x0001d6b9", - "platform_set_rf_clk_source": "0x0001d6c5", - "platform_set_rf_init_data": "0x0001d6d1", - "platform_set_rf_power_mapping": "0x0001d6dd", - "platform_set_timer": "0x0001d6e9", - "platform_shutdown": "0x0001d6ed", - "platform_switch_app": "0x0001d6f1", - "platform_trace_raw": "0x0001d71d", - "platform_write_persistent_reg": "0x0001d735", - "printf_hexdump": "0x0001d8e9", - "pvPortMalloc": "0x0001e3d5", - "pvTaskIncrementMutexHeldCount": "0x0001e4bd", - "pvTimerGetTimerID": "0x0001e4d5", - "pxPortInitialiseStack": "0x0001e501", - "reverse_128": "0x0001e6a9", - "reverse_24": "0x0001e6af", - "reverse_256": "0x0001e6b5", - "reverse_48": "0x0001e6bb", - "reverse_56": "0x0001e6c1", - "reverse_64": "0x0001e6c7", - "reverse_bd_addr": "0x0001e6cd", - "reverse_bytes": "0x0001e6d3", - "sm_add_event_handler": "0x0001e871", - "sm_address_resolution_lookup": "0x0001e9c9", - "sm_authenticated": "0x0001ed45", - "sm_authorization_decline": "0x0001ed53", - "sm_authorization_grant": "0x0001ed73", - "sm_authorization_state": "0x0001ed93", - "sm_bonding_decline": "0x0001edad", - "sm_config": "0x0001f209", - "sm_config_conn": "0x0001f221", - "sm_encryption_key_size": "0x0001f3d7", - "sm_just_works_confirm": "0x0001f95d", - "sm_le_device_key": "0x0001fca9", - "sm_passkey_input": "0x0001fd3f", - "sm_private_random_address_generation_get": "0x000200f9", - "sm_private_random_address_generation_get_mode": "0x00020101", - "sm_private_random_address_generation_set_mode": "0x0002010d", - "sm_private_random_address_generation_set_update_period": "0x00020135", - "sm_register_external_ltk_callback": "0x00020271", - "sm_register_oob_data_callback": "0x0002027d", - "sm_request_pairing": "0x00020289", - "sm_send_security_request": "0x00020d5f", - "sm_set_accepted_stk_generation_methods": "0x00020d85", - "sm_set_authentication_requirements": "0x00020d91", - "sm_set_encryption_key_size_range": "0x00020d9d", - "sscanf_bd_addr": "0x000210f9", - "sysSetPublicDeviceAddr": "0x000214ad", - "uuid128_to_str": "0x00021ab9", - "uuid_add_bluetooth_prefix": "0x00021b11", - "uuid_has_bluetooth_prefix": "0x00021b31", - "uxListRemove": "0x00021b4d", - "uxQueueMessagesWaiting": "0x00021b75", - "uxQueueMessagesWaitingFromISR": "0x00021b9d", - "uxQueueSpacesAvailable": "0x00021bb9", - "uxTaskGetStackHighWaterMark": "0x00021be5", - "uxTaskPriorityGet": "0x00021c05", - "uxTaskPriorityGetFromISR": "0x00021c21", - "vListInitialise": "0x00021cdb", - "vListInitialiseItem": "0x00021cf1", - "vListInsert": "0x00021cf7", - "vListInsertEnd": "0x00021d27", - "vPortEndScheduler": "0x00021d41", - "vPortEnterCritical": "0x00021d6d", - "vPortExitCritical": "0x00021db1", - "vPortFree": "0x00021de5", - "vPortSuppressTicksAndSleep": "0x00021e79", - "vPortValidateInterruptPriority": "0x00021fa1", - "vQueueDelete": "0x00021ffd", - "vQueueWaitForMessageRestricted": "0x00022029", - "vTaskDelay": "0x00022071", - "vTaskInternalSetTimeOutState": "0x000220bd", - "vTaskMissedYield": "0x000220cd", - "vTaskPlaceOnEventList": "0x000220d9", - "vTaskPlaceOnEventListRestricted": "0x00022111", - "vTaskPriorityDisinheritAfterTimeout": "0x00022151", - "vTaskPrioritySet": "0x000221fd", - "vTaskResume": "0x000222c5", - "vTaskStartScheduler": "0x00022349", - "vTaskStepTick": "0x000223d9", - "vTaskSuspend": "0x00022409", - "vTaskSuspendAll": "0x000224c5", - "vTaskSwitchContext": "0x000224d5", - "xPortStartScheduler": "0x00022579", - "xQueueAddToSet": "0x00022641", - "xQueueCreateCountingSemaphore": "0x00022665", - "xQueueCreateCountingSemaphoreStatic": "0x000226a1", - "xQueueCreateMutex": "0x000226e5", - "xQueueCreateMutexStatic": "0x000226fb", - "xQueueCreateSet": "0x00022715", - "xQueueGenericCreate": "0x0002271d", - "xQueueGenericCreateStatic": "0x00022769", - "xQueueGenericReset": "0x000227d1", - "xQueueGenericSend": "0x0002285d", - "xQueueGenericSendFromISR": "0x000229c9", - "xQueueGiveFromISR": "0x00022a89", - "xQueueGiveMutexRecursive": "0x00022b2d", - "xQueueIsQueueEmptyFromISR": "0x00022b6d", - "xQueueIsQueueFullFromISR": "0x00022b91", - "xQueuePeek": "0x00022bb9", - "xQueuePeekFromISR": "0x00022ce1", - "xQueueReceive": "0x00022d4d", - "xQueueReceiveFromISR": "0x00022e79", - "xQueueRemoveFromSet": "0x00022f0d", - "xQueueSelectFromSet": "0x00022f2f", - "xQueueSelectFromSetFromISR": "0x00022f41", - "xQueueSemaphoreTake": "0x00022f55", - "xQueueTakeMutexRecursive": "0x000230c1", - "xTaskCheckForTimeOut": "0x00023105", - "xTaskCreate": "0x00023175", - "xTaskCreateStatic": "0x000231d1", - "xTaskGetCurrentTaskHandle": "0x00023241", - "xTaskGetSchedulerState": "0x0002324d", - "xTaskGetTickCount": "0x00023269", - "xTaskGetTickCountFromISR": "0x00023275", - "xTaskIncrementTick": "0x00023285", - "xTaskPriorityDisinherit": "0x00023351", - "xTaskPriorityInherit": "0x000233e5", - "xTaskRemoveFromEventList": "0x00023479", - "xTaskResumeAll": "0x000234f9", - "xTaskResumeFromISR": "0x000235c1", - "xTimerCreate": "0x0002364d", - "xTimerCreateStatic": "0x00023681", - "xTimerCreateTimerTask": "0x000236b9", - "xTimerGenericCommand": "0x00023725", - "xTimerGetExpiryTime": "0x00023795", - "xTimerGetTimerDaemonTaskHandle": "0x000237b5" + "att_dispatch_client_can_send_now": "0x00005791", + "att_dispatch_client_request_can_send_now_event": "0x00005797", + "att_dispatch_register_client": "0x0000579d", + "att_dispatch_register_server": "0x000057b1", + "att_dispatch_server_can_send_now": "0x000057c5", + "att_dispatch_server_request_can_send_now_event": "0x000057cb", + "att_emit_general_event": "0x0000587d", + "att_server_can_send_packet_now": "0x00005fa9", + "att_server_deferred_read_response": "0x00005fad", + "att_server_get_mtu": "0x00005fc5", + "att_server_indicate": "0x00006031", + "att_server_init": "0x000060b5", + "att_server_notify": "0x000060f1", + "att_server_register_packet_handler": "0x00006209", + "att_server_request_can_send_now_event": "0x00006215", + "att_set_db": "0x00006231", + "att_set_read_callback": "0x00006245", + "att_set_write_callback": "0x00006251", + "bd_addr_cmp": "0x000063c1", + "bd_addr_copy": "0x000063c7", + "bd_addr_to_str": "0x000063d1", + "big_endian_read_16": "0x00006409", + "big_endian_read_32": "0x00006411", + "big_endian_store_16": "0x00006425", + "big_endian_store_32": "0x00006431", + "btstack_config": "0x00006585", + "btstack_memory_pool_create": "0x000066c3", + "btstack_memory_pool_free": "0x000066ed", + "btstack_memory_pool_get": "0x0000674d", + "btstack_push_user_msg": "0x000067b5", + "btstack_push_user_runnable": "0x000067c1", + "btstack_reset": "0x000067cd", + "char_for_nibble": "0x00006aa9", + "eTaskConfirmSleepModeStatus": "0x00006d89", + "gap_add_dev_to_periodic_list": "0x00007385", + "gap_add_whitelist": "0x00007395", + "gap_aes_encrypt": "0x000073a1", + "gap_clear_white_lists": "0x000073d9", + "gap_clr_adv_set": "0x000073e5", + "gap_clr_periodic_adv_list": "0x000073f1", + "gap_create_connection_cancel": "0x000073fd", + "gap_disconnect": "0x00007409", + "gap_disconnect_all": "0x00007435", + "gap_ext_create_connection": "0x00007475", + "gap_get_connection_parameter_range": "0x0000754d", + "gap_le_read_channel_map": "0x00007585", + "gap_periodic_adv_create_sync": "0x000075f1", + "gap_periodic_adv_create_sync_cancel": "0x00007615", + "gap_periodic_adv_term_sync": "0x00007621", + "gap_read_periodic_adv_list_size": "0x000076a9", + "gap_read_phy": "0x000076b5", + "gap_read_remote_used_features": "0x000076c1", + "gap_read_remote_version": "0x000076cd", + "gap_read_rssi": "0x000076d9", + "gap_remove_whitelist": "0x000076e5", + "gap_rmv_adv_set": "0x00007761", + "gap_rmv_dev_from_periodic_list": "0x0000776d", + "gap_rx_test_v2": "0x0000777d", + "gap_set_adv_set_random_addr": "0x000077b5", + "gap_set_callback_for_next_hci": "0x000077f1", + "gap_set_connection_parameter_range": "0x00007811", + "gap_set_data_length": "0x00007829", + "gap_set_def_phy": "0x00007841", + "gap_set_ext_adv_data": "0x00007851", + "gap_set_ext_adv_enable": "0x00007869", + "gap_set_ext_adv_para": "0x000078d9", + "gap_set_ext_scan_enable": "0x000079b1", + "gap_set_ext_scan_para": "0x000079c9", + "gap_set_ext_scan_response_data": "0x00007a69", + "gap_set_host_channel_classification": "0x00007a81", + "gap_set_periodic_adv_data": "0x00007a91", + "gap_set_periodic_adv_enable": "0x00007b01", + "gap_set_periodic_adv_para": "0x00007b11", + "gap_set_phy": "0x00007b29", + "gap_set_random_device_address": "0x00007b45", + "gap_start_ccm": "0x00007b75", + "gap_test_end": "0x00007bbd", + "gap_tx_test_v2": "0x00007bc9", + "gap_tx_test_v4": "0x00007be1", + "gap_update_connection_parameters": "0x00007c05", + "gap_vendor_tx_continuous_wave": "0x00007c45", + "gatt_client_cancel_write": "0x0000816d", + "gatt_client_discover_characteristic_descriptors": "0x00008193", + "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x000081d3", + "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x00008223", + "gatt_client_discover_characteristics_for_service": "0x00008273", + "gatt_client_discover_primary_services": "0x000082a9", + "gatt_client_discover_primary_services_by_uuid128": "0x000082db", + "gatt_client_discover_primary_services_by_uuid16": "0x0000831f", + "gatt_client_execute_write": "0x0000835b", + "gatt_client_find_included_services_for_service": "0x00008381", + "gatt_client_get_mtu": "0x000083af", + "gatt_client_is_ready": "0x0000844d", + "gatt_client_listen_for_characteristic_value_updates": "0x00008463", + "gatt_client_prepare_write": "0x00008483", + "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x000084bf", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x000084e9", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x000084ef", + "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x0000851d", + "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x00008523", + "gatt_client_read_multiple_characteristic_values": "0x00008551", + "gatt_client_read_value_of_characteristic_using_value_handle": "0x00008581", + "gatt_client_read_value_of_characteristics_by_uuid128": "0x000085af", + "gatt_client_read_value_of_characteristics_by_uuid16": "0x000085fb", + "gatt_client_register_handler": "0x00008645", + "gatt_client_reliable_write_long_value_of_characteristic": "0x00008651", + "gatt_client_signed_write_without_response": "0x00008a55", + "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x00008b19", + "gatt_client_write_client_characteristic_configuration": "0x00008b53", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x00008ba5", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008bb5", + "gatt_client_write_long_value_of_characteristic": "0x00008bf1", + "gatt_client_write_long_value_of_characteristic_with_offset": "0x00008c01", + "gatt_client_write_value_of_characteristic": "0x00008c3d", + "gatt_client_write_value_of_characteristic_without_response": "0x00008c73", + "hci_add_event_handler": "0x0000a18d", + "hci_power_control": "0x0000a915", + "hci_register_acl_packet_handler": "0x0000aac9", + "kv_commit": "0x0000b231", + "kv_get": "0x0000b28d", + "kv_init": "0x0000b299", + "kv_init_backend": "0x0000b315", + "kv_put": "0x0000b329", + "kv_remove": "0x0000b335", + "kv_remove_all": "0x0000b369", + "kv_value_modified": "0x0000b399", + "kv_value_modified_of_key": "0x0000b3b5", + "kv_visit": "0x0000b3c1", + "l2cap_add_event_handler": "0x0000b451", + "l2cap_can_send_packet_now": "0x0000b461", + "l2cap_create_le_credit_based_connection_request": "0x0000b61d", + "l2cap_credit_based_send": "0x0000b761", + "l2cap_credit_based_send_continue": "0x0000b78d", + "l2cap_disconnect": "0x0000b809", + "l2cap_get_le_credit_based_connection_credits": "0x0000ba59", + "l2cap_get_peer_mtu_for_local_cid": "0x0000ba75", + "l2cap_init": "0x0000be49", + "l2cap_le_send_flow_control_credit": "0x0000bf3f", + "l2cap_max_le_mtu": "0x0000c249", + "l2cap_register_packet_handler": "0x0000c371", + "l2cap_register_service": "0x0000c37d", + "l2cap_request_can_send_now_event": "0x0000c48d", + "l2cap_request_connection_parameter_update": "0x0000c4a7", + "l2cap_send_echo_request": "0x0000c981", + "l2cap_unregister_service": "0x0000ca41", + "le_device_db_add": "0x0000ca99", + "le_device_db_find": "0x0000cb61", + "le_device_db_from_key": "0x0000cb8d", + "le_device_db_iter_cur": "0x0000cb95", + "le_device_db_iter_cur_key": "0x0000cb99", + "le_device_db_iter_init": "0x0000cb9d", + "le_device_db_iter_next": "0x0000cba5", + "le_device_db_remove_key": "0x0000cbcb", + "ll_aes_encrypt": "0x0000cbf9", + "ll_config": "0x0000cc75", + "ll_free": "0x0000ccab", + "ll_get_heap_free_size": "0x0000ccb5", + "ll_hint_on_ce_len": "0x0000ccc9", + "ll_legacy_adv_set_interval": "0x0000cd01", + "ll_malloc": "0x0000cd11", + "ll_query_timing_info": "0x0000ce49", + "ll_register_hci_acl_previewer": "0x0000ce95", + "ll_scan_set_fixed_channel": "0x0000cef9", + "ll_set_adv_access_address": "0x0000d111", + "ll_set_adv_coded_scheme": "0x0000d11d", + "ll_set_conn_acl_report_latency": "0x0000d145", + "ll_set_conn_coded_scheme": "0x0000d171", + "ll_set_conn_latency": "0x0000d199", + "ll_set_conn_tx_power": "0x0000d1c5", + "ll_set_def_antenna": "0x0000d209", + "ll_set_initiating_coded_scheme": "0x0000d225", + "ll_set_max_conn_number": "0x0000d231", + "nibble_for_char": "0x0001d2c5", + "platform_32k_rc_auto_tune": "0x0001d365", + "platform_32k_rc_tune": "0x0001d3e1", + "platform_calibrate_32k": "0x0001d3f5", + "platform_call_on_stack": "0x00004183", + "platform_config": "0x0001d3f9", + "platform_delete_timer": "0x0001d51d", + "platform_enable_irq": "0x0001d525", + "platform_get_current_task": "0x0001d55d", + "platform_get_gen_os_driver": "0x0001d581", + "platform_get_heap_status": "0x0001d589", + "platform_get_link_layer_interf": "0x0001d5a1", + "platform_get_task_handle": "0x0001d5a9", + "platform_get_timer_counter": "0x0001d5c9", + "platform_get_us_time": "0x0001d5cd", + "platform_get_version": "0x0001d5d1", + "platform_hrng": "0x0001d5d9", + "platform_install_isr_stack": "0x0001d5e1", + "platform_install_task_stack": "0x0001d5ed", + "platform_patch_rf_init_data": "0x0001d625", + "platform_printf": "0x0001d631", + "platform_raise_assertion": "0x0001d645", + "platform_rand": "0x0001d659", + "platform_read_info": "0x0001d65d", + "platform_read_persistent_reg": "0x0001d68d", + "platform_reset": "0x0001d69d", + "platform_set_abs_timer": "0x0001d6c1", + "platform_set_evt_callback": "0x0001d6c5", + "platform_set_evt_callback_table": "0x0001d6d9", + "platform_set_irq_callback": "0x0001d6e5", + "platform_set_irq_callback_table": "0x0001d701", + "platform_set_rf_clk_source": "0x0001d70d", + "platform_set_rf_init_data": "0x0001d719", + "platform_set_rf_power_mapping": "0x0001d725", + "platform_set_timer": "0x0001d731", + "platform_shutdown": "0x0001d735", + "platform_switch_app": "0x0001d739", + "platform_trace_raw": "0x0001d765", + "platform_write_persistent_reg": "0x0001d77d", + "printf_hexdump": "0x0001d931", + "pvPortMalloc": "0x0001e41d", + "pvTaskIncrementMutexHeldCount": "0x0001e505", + "pvTimerGetTimerID": "0x0001e51d", + "pxPortInitialiseStack": "0x0001e549", + "reverse_128": "0x0001e6f1", + "reverse_24": "0x0001e6f7", + "reverse_256": "0x0001e6fd", + "reverse_48": "0x0001e703", + "reverse_56": "0x0001e709", + "reverse_64": "0x0001e70f", + "reverse_bd_addr": "0x0001e715", + "reverse_bytes": "0x0001e71b", + "sm_add_event_handler": "0x0001e8b9", + "sm_address_resolution_lookup": "0x0001ea11", + "sm_authenticated": "0x0001ed8d", + "sm_authorization_decline": "0x0001ed9b", + "sm_authorization_grant": "0x0001edbb", + "sm_authorization_state": "0x0001eddb", + "sm_bonding_decline": "0x0001edf5", + "sm_config": "0x0001f251", + "sm_config_conn": "0x0001f269", + "sm_encryption_key_size": "0x0001f41f", + "sm_just_works_confirm": "0x0001f9a5", + "sm_le_device_key": "0x0001fcf1", + "sm_passkey_input": "0x0001fd87", + "sm_private_random_address_generation_get": "0x00020141", + "sm_private_random_address_generation_get_mode": "0x00020149", + "sm_private_random_address_generation_set_mode": "0x00020155", + "sm_private_random_address_generation_set_update_period": "0x0002017d", + "sm_register_external_ltk_callback": "0x000202b9", + "sm_register_oob_data_callback": "0x000202c5", + "sm_request_pairing": "0x000202d1", + "sm_send_security_request": "0x00020da7", + "sm_set_accepted_stk_generation_methods": "0x00020dcd", + "sm_set_authentication_requirements": "0x00020dd9", + "sm_set_encryption_key_size_range": "0x00020de5", + "sscanf_bd_addr": "0x00021141", + "sysSetPublicDeviceAddr": "0x000214f5", + "uuid128_to_str": "0x00021b01", + "uuid_add_bluetooth_prefix": "0x00021b59", + "uuid_has_bluetooth_prefix": "0x00021b79", + "uxListRemove": "0x00021b95", + "uxQueueMessagesWaiting": "0x00021bbd", + "uxQueueMessagesWaitingFromISR": "0x00021be5", + "uxQueueSpacesAvailable": "0x00021c01", + "uxTaskGetStackHighWaterMark": "0x00021c2d", + "uxTaskPriorityGet": "0x00021c4d", + "uxTaskPriorityGetFromISR": "0x00021c69", + "vListInitialise": "0x00021d23", + "vListInitialiseItem": "0x00021d39", + "vListInsert": "0x00021d3f", + "vListInsertEnd": "0x00021d6f", + "vPortEndScheduler": "0x00021d89", + "vPortEnterCritical": "0x00021db5", + "vPortExitCritical": "0x00021df9", + "vPortFree": "0x00021e2d", + "vPortSuppressTicksAndSleep": "0x00021ec1", + "vPortValidateInterruptPriority": "0x00021fe9", + "vQueueDelete": "0x00022045", + "vQueueWaitForMessageRestricted": "0x00022071", + "vTaskDelay": "0x000220b9", + "vTaskInternalSetTimeOutState": "0x00022105", + "vTaskMissedYield": "0x00022115", + "vTaskPlaceOnEventList": "0x00022121", + "vTaskPlaceOnEventListRestricted": "0x00022159", + "vTaskPriorityDisinheritAfterTimeout": "0x00022199", + "vTaskPrioritySet": "0x00022245", + "vTaskResume": "0x0002230d", + "vTaskStartScheduler": "0x00022391", + "vTaskStepTick": "0x00022421", + "vTaskSuspend": "0x00022451", + "vTaskSuspendAll": "0x0002250d", + "vTaskSwitchContext": "0x0002251d", + "xPortStartScheduler": "0x000225c1", + "xQueueAddToSet": "0x00022689", + "xQueueCreateCountingSemaphore": "0x000226ad", + "xQueueCreateCountingSemaphoreStatic": "0x000226e9", + "xQueueCreateMutex": "0x0002272d", + "xQueueCreateMutexStatic": "0x00022743", + "xQueueCreateSet": "0x0002275d", + "xQueueGenericCreate": "0x00022765", + "xQueueGenericCreateStatic": "0x000227b1", + "xQueueGenericReset": "0x00022819", + "xQueueGenericSend": "0x000228a5", + "xQueueGenericSendFromISR": "0x00022a11", + "xQueueGiveFromISR": "0x00022ad1", + "xQueueGiveMutexRecursive": "0x00022b75", + "xQueueIsQueueEmptyFromISR": "0x00022bb5", + "xQueueIsQueueFullFromISR": "0x00022bd9", + "xQueuePeek": "0x00022c01", + "xQueuePeekFromISR": "0x00022d29", + "xQueueReceive": "0x00022d95", + "xQueueReceiveFromISR": "0x00022ec1", + "xQueueRemoveFromSet": "0x00022f55", + "xQueueSelectFromSet": "0x00022f77", + "xQueueSelectFromSetFromISR": "0x00022f89", + "xQueueSemaphoreTake": "0x00022f9d", + "xQueueTakeMutexRecursive": "0x00023109", + "xTaskCheckForTimeOut": "0x0002314d", + "xTaskCreate": "0x000231bd", + "xTaskCreateStatic": "0x00023219", + "xTaskGetCurrentTaskHandle": "0x00023289", + "xTaskGetSchedulerState": "0x00023295", + "xTaskGetTickCount": "0x000232b1", + "xTaskGetTickCountFromISR": "0x000232bd", + "xTaskIncrementTick": "0x000232cd", + "xTaskPriorityDisinherit": "0x00023399", + "xTaskPriorityInherit": "0x0002342d", + "xTaskRemoveFromEventList": "0x000234c1", + "xTaskResumeAll": "0x00023541", + "xTaskResumeFromISR": "0x00023609", + "xTimerCreate": "0x00023695", + "xTimerCreateStatic": "0x000236c9", + "xTimerCreateTimerTask": "0x00023701", + "xTimerGenericCommand": "0x0002376d", + "xTimerGetExpiryTime": "0x000237dd", + "xTimerGetTimerDaemonTaskHandle": "0x000237fd" } \ No newline at end of file diff --git a/bundles/mini/ING9187xx/meta.json b/bundles/mini/ING9187xx/meta.json index 1ccb909c6..2cef60463 100644 --- a/bundles/mini/ING9187xx/meta.json +++ b/bundles/mini/ING9187xx/meta.json @@ -8,11 +8,11 @@ }, "rom": { "base": 16384, - "size": 135212 + "size": 135284 }, "version": [ 1, 9, - 38 + 39 ] } \ No newline at end of file diff --git a/bundles/mini/ING9187xx/platform.bin b/bundles/mini/ING9187xx/platform.bin index 10818f65ee82d35d929c464e65088574d681822a..5525b41f302e34b9baecabbb7f402b943128a1ce 100644 GIT binary patch delta 6342 zcmZ{o4OEs@w#WBA?+5S8mwbwV=!0lUW(taYiGa$NVp?NrCZlL3qE6Dv8d5?^uUc8z z6TMo4#!OVsXy|=o9?VExoihDD^ z@5%_BMvt4eQ!)~Hlqx_3^( zzu6tLG8JvtFW&jA3YxAzGV(E=N7MoVd0Nn^Ns3fH7uq@(9XO>wFfKKT zppks`0eAvKk<%fsxAfy6U$ErSkPquE<3{mj{o8Tb_$H2jCutu_#o>@9>Rj4QBkiYK zE`{VMwDW3nNDGk*yhT7Q-= zKeRy4O`UEo+AMurYIwSg$~G;$Y~JFKvYN%DnIn;rVswQ|Ru@RQy-1b0%W|)OG-h(y zv_U%9Q(7@U59dzcQpm%(<>^Uu(PQ1SJz#b*F}0<+6rE+Z%JEX_B~JU zN_(E))vMCq;5YT?jM&gJ)a>{AThzFu=Vd&a`0`J*yP@4~wokfmgbL%{*(>dD*4r~; zxlr%Uh>aAF_sP6q1U1+5taVJxEC`w{<3gPosPVX7l^Mkk>$RB)yiz}qnavmU?#x(T z=Z&2Byq_AGssDD$9CydFL|2uF1KCFk%e?D?wE?gT&+TxW<7nUtqzT}=IID)+U=cg(({q2HX zD)eWK6)KwT-LcT%Aan0wJjY9A=1WS4Voz3;PQmv`X)3>r!+n0&wBE*r>s!kzic`TdY7f9*Sv!> zqBHoQ>J0yY3Rf3g$mx%cQ@&X>_lCRd{v>tEwV!40NJ7-CDjQ|4gUyVkS#FcM+zwFc^cbO_HDs$zBV2{9k@eez>Z`%EkP>cSmKa9bKQUTIM+LA<;>1 z*3-Lee8JmZV>r0YTf1qY;^X?&E!TLf-tpW_XCY=Pex-Nv^JjyxF43oW|JK7CrOTU`y#*(&l?Bdya$v<{+k+=6B$2jun zASUd$l(7p}u3YlyD%o;Wr?+*!q~Zs8%e%suw|c97_>>^5ce(rr}!lD`Q+<o)&ZS2023}$d-Tf)k zycC@5MK+B(PaRllRBYz8%wD5o3&+|WrKneA1ii?Au=6bAz$@&Bv3icYin*Ma<_W9i zySU7gRm(%w@HEdaYx%EG81C=j8k#XcUT?G?;7vj9rtg_nDMepeApA( z%2A&0&+%~nOyo>%^~`AHh1}`c+sXy}m2tI|!xew%ai8Y|-s2g4o@05RQFNXkvhy*c z;R{Z%^AY33m$Jv^8gYN)Yav|YiM+inIeM?klFzLliZ|De6YrmVlr$O0RRH8ui*tMdLIy4UPv} z!L{HE;80M0>L#8WGnFSaP(>Isd-y6R)}uJiPV^RN3-p<-1K&p85#iH2G@{>oR`v4G z>fKO>Au9|A_ka=L`(Pv}%?z{{1scc?0_7L25q*Gs40srf1;t(irJZ5m$KY7-9WV)$ z(IkV%z!Z(D&5kEPaT1DDupLaZm=690`HA3f!7PiDz%P-{2LB4?fMS;mN(Ym{OW+i+ z1Dpz80rNol;jLd|2O8@3bh9c5GW*nAt^l$1%up&JNV;}v145+VZcmj`QCXsLYnrA+1=(K{ z4}5Zf=I0k>^%STnHOP{KwCHFI5lx&{YD~3M3xg>}XEqV81qVB=0YzvIhuhLeq6t4s zKM=CZlB3XlsMWM=wlK)@i`E7Yc3Ux$I8W`_gK{0-RqmMmQR_zhePeSrhD^DyW`=zM3b-8PwlfMMF7q(O98S}zTcy*+}5 zq#PYK?C`PI;z>{(UncE=t1ONI*G*IO8>CCPxNvf!R8hr^YB{j+G`S&JyqK>;56$kc z<%>(4rIe``hq+X0_&brDv?I)e7*8GO<-|MEK_n+!$t03)X`rGjzAOljaoFkSRB zm@>c;lxKoX;6$*c2rpzXX&Tccumg74U_0_TVC{4`1;!UJO$JK}nWlitQ9hNpoTAY{ z9u!qzK6nD26@Zm+s1S7LVcNhpa2i;Z&omuunaWfw<=_mk0-TIP$$^<0i@B=D5+#A@ zPcglUzhiBl(?Ke>dJn`5s2$-Ekuiyxm~9>HWS7`zL@HNfo7m_G6mr||$YN|4 z8+9QsFNAjFr6hEcY&#o$n<(23<--`;&PH(w7%#X3_HsYhqXW5{?*rvph`$?K6D%Et z6$Zu8Sa8cororHuk=0Ccr8!`rfnUQQ9*jdrabN>D3|tDzg;9xexhx!aF(rWQ=s@n4 ziaVL^1V^A@xgka)KOI~HyJGMFI0I~g{k>p3%4PeG(2`_?cnO0NaPF~8dk~efVhiv> z+u-R6P?-t6ABdTq_JdNd7Jn8=g&m+&i$2J*oYB>*<^2Vd?chEnyNxs(OmE#Hnt@AF z=4~&It>Y+@m(I2eWbXe!JP|~e7?9VQ$m6987>O()5rrF7WC@EPoK7N3XfS*d8R1cV zJ0mgDUs>YBjmM7|Nv!nC5-@QcOY@q-;l&szbx_9UsqzRUzRv?U|OY3i8Y%UJP9}~O_hXQzmF1n zBFie};;&`oXbotdrZ36r5%s6!()1b#2YTFtuPFS(2Z>z0VX~t0Y}ubSpp6h(-zq@L=T``c102>kI)CvkvxyC zu9wpfe=IyL0SSjdKX5lFkJ$Zi&>!6Lq8teL$2{!iE!hZS?uSz%4DNxV2o3%}BR2PC z=8~?Aa>pR#;9% x?@Sf*i9M##9&^(^zb7QoKEKaC|DC~!!xIDNzh_Sz9-ZgEg8wVY6B42Z{|`jO@%;b* delta 6289 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 bmahp(v6ip1mS=TJ>5>vyKFly4P~H9)w;`pG delta 7004 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 diff --git a/bundles/mini/inc/gap.h b/bundles/mini/inc/gap.h index 68eee5323..595bde525 100644 --- a/bundles/mini/inc/gap.h +++ b/bundles/mini/inc/gap.h @@ -1287,7 +1287,7 @@ uint8_t gap_rx_test_v2(uint8_t rx_channel, uint8_t phy, uint8_t modulation_index uint8_t gap_rx_test_v3(uint8_t rx_channel, uint8_t phy, uint8_t modulation_index, uint8_t expected_cte_length, uint8_t expected_cte_type, uint8_t slot_durations, - uint8_t switching_pattern_length, uint8_t *antenna_ids); + uint8_t switching_pattern_length, const uint8_t *antenna_ids); /** * @brief Start a test where the DUT generates test reference packets at a fixed interval. @@ -1324,7 +1324,7 @@ uint8_t gap_tx_test_v2(uint8_t tx_channel, uint8_t test_data_length, uint8_t gap_tx_test_v4(uint8_t tx_channel, uint8_t test_data_length, uint8_t packet_payload, uint8_t phy, uint8_t cte_length, uint8_t cte_type, - uint8_t switching_pattern_length, uint8_t *antenna_ids, + uint8_t switching_pattern_length, const uint8_t *antenna_ids, int8_t tx_power_level); /** diff --git a/bundles/mini/inc/ll_api.h b/bundles/mini/inc/ll_api.h index 254e9e756..275c71b50 100644 --- a/bundles/mini/inc/ll_api.h +++ b/bundles/mini/inc/ll_api.h @@ -98,6 +98,59 @@ void ll_set_initiating_coded_scheme(const coded_scheme_t scheme); */ void ll_hint_on_ce_len(const uint16_t conn_handle, const uint16_t min_ce_len, const uint16_t max_ce_len); +/** + **************************************************************************************** + * @brief Create a connection directly (without advertising & initiating) + * + * @param[in] role connection role. master (0), slave (1) + * @param[in] addr_types address types for advertiser and initiator + * bit [0] for slave, bit [1] for master + * 0: public address; 1: random address + * @param[in] adv_addr address of advertiser + * @param[in] init_addr address of initiator + * @param[in] rx_phy Rx PHY (1: 1M, 2: 2M, 3: Coded) + * @param[in] tx_phy Tx PHY (1: 1M, 2: 2M, 3: Coded) + * @param[in] access_addr access address + * @param[in] crc_init CRC init + * @param[in] interval connection interval (unit: us) + * @param[in] sup_timeout supervision timeout (unit: 10ms) + * @param[in] channel_map channel map + * @param[in] ch_sel_algo channel selection algorithm (1 or 2) + * @param[in] hop_inc hop increment for CSA#1 ([5..16]) + * @param[in] min_ce_len information parameter about the minimum length of connection + * event needed for this LE connection. + * @param[in] max_ce_len information parameter about the maximum length of connection + * event needed for this LE connection. + * @param[in] start_time start time of the 1st connectin event + * @param[in] slave_latency slave latency + * @param[in] sleep_clk_acc sleep clock accuracy + * @param[in] sync_window slave's sync window for 1st connection event + * @return 0 if successful else error code + **************************************************************************************** + */ +// int ll_create_conn( +// uint8_t role, +// uint8_t addr_types, +// const uint8_t *adv_addr, +// const uint8_t *init_addr, +// uint8_t rx_phy, +// uint8_t tx_phy, +// uint32_t access_addr, +// uint32_t crc_init, +// uint32_t interval, +// uint16_t sup_timeout, +// const uint8_t *channel_map, +// uint8_t ch_sel_algo, +// uint8_t hop_inc, +// uint16_t min_ce_len, +// uint16_t max_ce_len, +// uint64_t start_time, +// uint16_t slave_latency, +// uint8_t sleep_clk_acc, +// uint32_t sync_window); +// WARNING: ^^^ this API is not available in this release + + /** **************************************************************************************** * @brief Set tx power of a connection diff --git a/bundles/noos_exp/ING9187xx/apis.json b/bundles/noos_exp/ING9187xx/apis.json index baab566c2..f29114b2c 100644 --- a/bundles/noos_exp/ING9187xx/apis.json +++ b/bundles/noos_exp/ING9187xx/apis.json @@ -1,284 +1,286 @@ { - "att_dispatch_client_can_send_now": "0x0000565d", - "att_dispatch_client_request_can_send_now_event": "0x00005663", - "att_dispatch_register_client": "0x00005669", - "att_dispatch_register_server": "0x0000567d", - "att_dispatch_server_can_send_now": "0x00005691", - "att_dispatch_server_request_can_send_now_event": "0x00005697", - "att_emit_general_event": "0x00005749", - "att_server_can_send_packet_now": "0x00005e79", - "att_server_deferred_read_response": "0x00005e7d", - "att_server_get_mtu": "0x00005e95", - "att_server_indicate": "0x00005f0d", - "att_server_init": "0x00005f91", - "att_server_notify": "0x00005fcd", - "att_server_register_packet_handler": "0x000060e5", - "att_server_request_can_send_now_event": "0x000060f1", - "att_set_db": "0x0000610d", - "att_set_read_callback": "0x00006121", - "att_set_write_callback": "0x0000612d", - "bd_addr_cmp": "0x0000629d", - "bd_addr_copy": "0x000062a3", - "bd_addr_to_str": "0x000062ad", - "big_endian_read_16": "0x000062e5", - "big_endian_read_32": "0x000062ed", - "big_endian_store_16": "0x00006301", - "big_endian_store_32": "0x0000630d", - "btstack_config": "0x00006445", - "btstack_memory_pool_create": "0x00006593", - "btstack_memory_pool_free": "0x000065bd", - "btstack_memory_pool_get": "0x0000661d", - "btstack_push_user_msg": "0x00006665", - "btstack_push_user_runnable": "0x00006671", - "btstack_reset": "0x0000667d", - "char_for_nibble": "0x00006977", - "gap_add_dev_to_periodic_list": "0x0000721d", - "gap_add_whitelist": "0x0000722d", - "gap_aes_encrypt": "0x00007239", - "gap_clear_white_lists": "0x00007271", - "gap_clr_adv_set": "0x0000727d", - "gap_clr_periodic_adv_list": "0x00007289", - "gap_create_connection_cancel": "0x00007295", - "gap_disconnect": "0x000072a1", - "gap_disconnect_all": "0x000072cd", - "gap_ext_create_connection": "0x0000730d", - "gap_get_connection_parameter_range": "0x00007401", - "gap_le_read_channel_map": "0x0000743d", - "gap_periodic_adv_create_sync": "0x000074a9", - "gap_periodic_adv_create_sync_cancel": "0x000074cd", - "gap_periodic_adv_term_sync": "0x000074d9", - "gap_read_local_tx_power_level": "0x0000756d", - "gap_read_periodic_adv_list_size": "0x0000757d", - "gap_read_phy": "0x00007589", - "gap_read_remote_tx_power_level": "0x00007595", - "gap_read_remote_used_features": "0x000075a5", - "gap_read_remote_version": "0x000075b1", - "gap_read_rssi": "0x000075bd", - "gap_remove_whitelist": "0x000075c9", - "gap_rmv_adv_set": "0x00007645", - "gap_rmv_dev_from_periodic_list": "0x00007651", - "gap_rx_test_v2": "0x00007661", - "gap_set_adv_set_random_addr": "0x00007699", - "gap_set_callback_for_next_hci": "0x000076d5", - "gap_set_connection_parameter_range": "0x000076f5", - "gap_set_data_length": "0x0000770d", - "gap_set_def_phy": "0x00007725", - "gap_set_default_subrate": "0x00007735", - "gap_set_ext_adv_data": "0x00007751", - "gap_set_ext_adv_enable": "0x00007769", - "gap_set_ext_adv_para": "0x000077d9", - "gap_set_ext_scan_enable": "0x000078b1", - "gap_set_ext_scan_para": "0x000078c9", - "gap_set_ext_scan_response_data": "0x00007969", - "gap_set_host_channel_classification": "0x00007981", - "gap_set_path_loss_reporting_enable": "0x00007991", - "gap_set_path_loss_reporting_param": "0x000079a1", - "gap_set_periodic_adv_data": "0x000079bd", - "gap_set_periodic_adv_enable": "0x00007a2d", - "gap_set_periodic_adv_para": "0x00007a3d", - "gap_set_phy": "0x00007a55", - "gap_set_random_device_address": "0x00007a71", - "gap_set_tx_power_reporting_enable": "0x00007a91", - "gap_start_ccm": "0x00007ab1", - "gap_subrate_request": "0x00007af9", - "gap_test_end": "0x00007b15", - "gap_tx_test_v2": "0x00007b21", - "gap_tx_test_v4": "0x00007b39", - "gap_update_connection_parameters": "0x00007b5d", - "gap_vendor_tx_continuous_wave": "0x00007ba1", - "gatt_client_cancel_write": "0x000080c9", - "gatt_client_discover_characteristic_descriptors": "0x000080ef", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x0000812f", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x0000817f", - "gatt_client_discover_characteristics_for_service": "0x000081cf", - "gatt_client_discover_primary_services": "0x00008205", - "gatt_client_discover_primary_services_by_uuid128": "0x00008237", - "gatt_client_discover_primary_services_by_uuid16": "0x0000827b", - "gatt_client_execute_write": "0x000082b7", - "gatt_client_find_included_services_for_service": "0x000082dd", - "gatt_client_get_mtu": "0x0000830b", - "gatt_client_is_ready": "0x000083ad", - "gatt_client_listen_for_characteristic_value_updates": "0x000083c3", - "gatt_client_prepare_write": "0x000083e5", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x00008421", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x0000844b", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008451", - "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x0000847f", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x00008485", - "gatt_client_read_multiple_characteristic_values": "0x000084b3", - "gatt_client_read_value_of_characteristic_using_value_handle": "0x000084e3", - "gatt_client_read_value_of_characteristics_by_uuid128": "0x00008511", - "gatt_client_read_value_of_characteristics_by_uuid16": "0x0000855d", - "gatt_client_register_handler": "0x000085a9", - "gatt_client_reliable_write_long_value_of_characteristic": "0x000085b5", - "gatt_client_signed_write_without_response": "0x000089e5", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x00008aa9", - "gatt_client_write_client_characteristic_configuration": "0x00008ae3", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x00008b35", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008b45", - "gatt_client_write_long_value_of_characteristic": "0x00008b81", - "gatt_client_write_long_value_of_characteristic_with_offset": "0x00008b91", - "gatt_client_write_value_of_characteristic": "0x00008bcd", - "gatt_client_write_value_of_characteristic_without_response": "0x00008c03", - "hci_add_event_handler": "0x0000a195", - "hci_power_control": "0x0000a945", - "hci_register_acl_packet_handler": "0x0000aaf9", - "kv_commit": "0x0000b295", - "kv_get": "0x0000b2f1", - "kv_init": "0x0000b2fd", - "kv_init_backend": "0x0000b37d", - "kv_put": "0x0000b391", - "kv_remove": "0x0000b39d", - "kv_remove_all": "0x0000b3d1", - "kv_value_modified": "0x0000b401", - "kv_value_modified_of_key": "0x0000b41d", - "kv_visit": "0x0000b429", - "l2cap_add_event_handler": "0x0000b4b9", - "l2cap_can_send_packet_now": "0x0000b4c9", - "l2cap_create_le_credit_based_connection_request": "0x0000b685", - "l2cap_credit_based_send": "0x0000b7c9", - "l2cap_credit_based_send_continue": "0x0000b7f5", - "l2cap_disconnect": "0x0000b871", - "l2cap_get_le_credit_based_connection_credits": "0x0000bac1", - "l2cap_get_peer_mtu_for_local_cid": "0x0000badd", - "l2cap_init": "0x0000beb1", - "l2cap_le_send_flow_control_credit": "0x0000bfa7", - "l2cap_max_le_mtu": "0x0000c2b1", - "l2cap_register_packet_handler": "0x0000c3d9", - "l2cap_register_service": "0x0000c3e5", - "l2cap_request_can_send_now_event": "0x0000c4f5", - "l2cap_request_connection_parameter_update": "0x0000c50f", - "l2cap_send_echo_request": "0x0000c9e9", - "l2cap_unregister_service": "0x0000caa9", - "le_device_db_add": "0x0000cb01", - "le_device_db_find": "0x0000cbd9", - "le_device_db_from_key": "0x0000cc05", - "le_device_db_iter_cur": "0x0000cc0d", - "le_device_db_iter_cur_key": "0x0000cc11", - "le_device_db_iter_init": "0x0000cc15", - "le_device_db_iter_next": "0x0000cc1d", - "le_device_db_remove_key": "0x0000cc43", - "ll_ackable_packet_alloc": "0x0000cc6f", - "ll_ackable_packet_get_status": "0x0000cda9", - "ll_ackable_packet_run": "0x0000ce19", - "ll_ackable_packet_set_tx_data": "0x0000cebd", - "ll_adjust_conn_peer_tx_power": "0x0000cee5", - "ll_aes_encrypt": "0x0000cf11", - "ll_channel_monitor_alloc": "0x0000cf8d", - "ll_channel_monitor_check_each_pdu": "0x0000d00f", - "ll_channel_monitor_run": "0x0000d075", - "ll_config": "0x0000d129", - "ll_dhkey_generated": "0x0000d37d", - "ll_free": "0x0000d3b1", - "ll_get_conn_events_info": "0x0000d3bd", - "ll_get_conn_info": "0x0000d4a1", - "ll_get_heap_free_size": "0x0000d4ed", - "ll_hint_on_ce_len": "0x0000d501", - "ll_install_ecc_engine": "0x0000d539", - "ll_legacy_adv_set_interval": "0x0000d545", - "ll_lock_frequency": "0x0000d555", - "ll_malloc": "0x0000d5b9", - "ll_p256_key_pair_generated": "0x0000d5c1", - "ll_raw_packet_alloc": "0x0000d775", - "ll_raw_packet_free": "0x0000d849", - "ll_raw_packet_get_bare_rx_data": "0x0000d881", - "ll_raw_packet_get_rx_data": "0x0000d947", - "ll_raw_packet_recv": "0x0000d9e9", - "ll_raw_packet_send": "0x0000daa5", - "ll_raw_packet_set_bare_data": "0x0000db8d", - "ll_raw_packet_set_bare_mode": "0x0000dbcb", - "ll_raw_packet_set_param": "0x0000dcd1", - "ll_raw_packet_set_tx_data": "0x0000dd2f", - "ll_register_hci_acl_previewer": "0x0000dd95", - "ll_scan_set_fixed_channel": "0x0000ddf9", - "ll_set_adv_access_address": "0x0000e011", - "ll_set_adv_coded_scheme": "0x0000e01d", - "ll_set_conn_acl_report_latency": "0x0000e04d", - "ll_set_conn_coded_scheme": "0x0000e07d", - "ll_set_conn_interval_unit": "0x0000e0a9", - "ll_set_conn_latency": "0x0000e0b5", - "ll_set_conn_tx_power": "0x0000e0e5", - "ll_set_def_antenna": "0x0000e121", - "ll_set_initiating_coded_scheme": "0x0000e13d", - "ll_set_max_conn_number": "0x0000e149", - "ll_set_tx_power_range": "0x0000e1dd", - "ll_unlock_frequency": "0x0000e205", - "nibble_for_char": "0x0001fb2d", - "platform_32k_rc_auto_tune": "0x0001fbc9", - "platform_32k_rc_tune": "0x0001fc45", - "platform_calibrate_32k": "0x0001fc59", - "platform_config": "0x0001fc5d", - "platform_controller_run": "0x0001fd81", - "platform_delete_timer": "0x0001fdb5", - "platform_enable_irq": "0x0001fdbd", - "platform_get_gen_os_driver": "0x0001fdf5", - "platform_get_link_layer_interf": "0x0001fe01", - "platform_get_task_handle": "0x0001fe09", - "platform_get_timer_counter": "0x0001fe21", - "platform_get_us_time": "0x0001fe25", - "platform_get_version": "0x0001fe29", - "platform_hrng": "0x0001fe31", - "platform_init_controller": "0x0001fe39", - "platform_os_idle_resumed_hook": "0x0001fe55", - "platform_patch_rf_init_data": "0x0001fe59", - "platform_post_sleep_processing": "0x0001fe65", - "platform_pre_sleep_processing": "0x0001fe6b", - "platform_pre_suppress_ticks_and_sleep_processing": "0x0001fe71", - "platform_printf": "0x0001fe75", - "platform_raise_assertion": "0x0001fe89", - "platform_rand": "0x0001fe9d", - "platform_read_info": "0x0001fea1", - "platform_read_persistent_reg": "0x0001fed1", - "platform_reset": "0x0001fee1", - "platform_set_abs_timer": "0x0001ff05", - "platform_set_evt_callback": "0x0001ff09", - "platform_set_evt_callback_table": "0x0001ff1d", - "platform_set_irq_callback": "0x0001ff29", - "platform_set_irq_callback_table": "0x0001ff45", - "platform_set_rf_clk_source": "0x0001ff51", - "platform_set_rf_init_data": "0x0001ff5d", - "platform_set_rf_power_mapping": "0x0001ff69", - "platform_set_timer": "0x0001ff75", - "platform_shutdown": "0x0001ff79", - "platform_switch_app": "0x0001ff7d", - "platform_trace_raw": "0x0001ffa9", - "platform_write_persistent_reg": "0x0001ffc1", - "printf_hexdump": "0x0001ffd1", - "reverse_128": "0x00020311", - "reverse_24": "0x00020317", - "reverse_256": "0x0002031d", - "reverse_48": "0x00020323", - "reverse_56": "0x00020329", - "reverse_64": "0x0002032f", - "reverse_bd_addr": "0x00020335", - "reverse_bytes": "0x0002033b", - "sm_add_event_handler": "0x00020529", - "sm_address_resolution_lookup": "0x00020681", - "sm_authenticated": "0x000209fd", - "sm_authorization_decline": "0x00020a0b", - "sm_authorization_grant": "0x00020a2b", - "sm_authorization_state": "0x00020a4b", - "sm_bonding_decline": "0x00020a65", - "sm_config": "0x00020ec1", - "sm_config_conn": "0x00020ed9", - "sm_encryption_key_size": "0x0002108f", - "sm_just_works_confirm": "0x00021615", - "sm_le_device_key": "0x00021961", - "sm_passkey_input": "0x000219f7", - "sm_private_random_address_generation_get": "0x00021db1", - "sm_private_random_address_generation_get_mode": "0x00021db9", - "sm_private_random_address_generation_set_mode": "0x00021dc5", - "sm_private_random_address_generation_set_update_period": "0x00021ded", - "sm_register_external_ltk_callback": "0x00021f29", - "sm_register_oob_data_callback": "0x00021f35", - "sm_request_pairing": "0x00021f41", - "sm_send_security_request": "0x00022a17", - "sm_set_accepted_stk_generation_methods": "0x00022a3d", - "sm_set_authentication_requirements": "0x00022a49", - "sm_set_encryption_key_size_range": "0x00022a55", - "sscanf_bd_addr": "0x00022e25", - "sysSetPublicDeviceAddr": "0x000231d9", - "uuid128_to_str": "0x0002380d", - "uuid_add_bluetooth_prefix": "0x00023865", - "uuid_has_bluetooth_prefix": "0x00023885" + "att_dispatch_client_can_send_now": "0x000056a5", + "att_dispatch_client_request_can_send_now_event": "0x000056ab", + "att_dispatch_register_client": "0x000056b1", + "att_dispatch_register_server": "0x000056c5", + "att_dispatch_server_can_send_now": "0x000056d9", + "att_dispatch_server_request_can_send_now_event": "0x000056df", + "att_emit_general_event": "0x00005791", + "att_server_can_send_packet_now": "0x00005ec1", + "att_server_deferred_read_response": "0x00005ec5", + "att_server_get_mtu": "0x00005edd", + "att_server_indicate": "0x00005f55", + "att_server_init": "0x00005fd9", + "att_server_notify": "0x00006015", + "att_server_register_packet_handler": "0x0000612d", + "att_server_request_can_send_now_event": "0x00006139", + "att_set_db": "0x00006155", + "att_set_read_callback": "0x00006169", + "att_set_write_callback": "0x00006175", + "bd_addr_cmp": "0x000062e5", + "bd_addr_copy": "0x000062eb", + "bd_addr_to_str": "0x000062f5", + "big_endian_read_16": "0x0000632d", + "big_endian_read_32": "0x00006335", + "big_endian_store_16": "0x00006349", + "big_endian_store_32": "0x00006355", + "btstack_config": "0x0000648d", + "btstack_memory_pool_create": "0x000065db", + "btstack_memory_pool_free": "0x00006605", + "btstack_memory_pool_get": "0x00006665", + "btstack_push_user_msg": "0x000066ad", + "btstack_push_user_runnable": "0x000066b9", + "btstack_reset": "0x000066c5", + "char_for_nibble": "0x000069bf", + "gap_add_dev_to_periodic_list": "0x00007265", + "gap_add_whitelist": "0x00007275", + "gap_aes_encrypt": "0x00007281", + "gap_clear_white_lists": "0x000072b9", + "gap_clr_adv_set": "0x000072c5", + "gap_clr_periodic_adv_list": "0x000072d1", + "gap_create_connection_cancel": "0x000072dd", + "gap_disconnect": "0x000072e9", + "gap_disconnect_all": "0x00007315", + "gap_ext_create_connection": "0x00007355", + "gap_get_connection_parameter_range": "0x00007449", + "gap_le_read_channel_map": "0x00007485", + "gap_periodic_adv_create_sync": "0x000074f1", + "gap_periodic_adv_create_sync_cancel": "0x00007515", + "gap_periodic_adv_term_sync": "0x00007521", + "gap_read_local_tx_power_level": "0x000075b5", + "gap_read_periodic_adv_list_size": "0x000075c5", + "gap_read_phy": "0x000075d1", + "gap_read_remote_tx_power_level": "0x000075dd", + "gap_read_remote_used_features": "0x000075ed", + "gap_read_remote_version": "0x000075f9", + "gap_read_rssi": "0x00007605", + "gap_remove_whitelist": "0x00007611", + "gap_rmv_adv_set": "0x0000768d", + "gap_rmv_dev_from_periodic_list": "0x00007699", + "gap_rx_test_v2": "0x000076a9", + "gap_set_adv_set_random_addr": "0x000076e1", + "gap_set_callback_for_next_hci": "0x0000771d", + "gap_set_connection_parameter_range": "0x0000773d", + "gap_set_data_length": "0x00007755", + "gap_set_def_phy": "0x0000776d", + "gap_set_default_subrate": "0x0000777d", + "gap_set_ext_adv_data": "0x00007799", + "gap_set_ext_adv_enable": "0x000077b1", + "gap_set_ext_adv_para": "0x00007821", + "gap_set_ext_scan_enable": "0x000078f9", + "gap_set_ext_scan_para": "0x00007911", + "gap_set_ext_scan_response_data": "0x000079b1", + "gap_set_host_channel_classification": "0x000079c9", + "gap_set_path_loss_reporting_enable": "0x000079d9", + "gap_set_path_loss_reporting_param": "0x000079e9", + "gap_set_periodic_adv_data": "0x00007a05", + "gap_set_periodic_adv_enable": "0x00007a75", + "gap_set_periodic_adv_para": "0x00007a85", + "gap_set_phy": "0x00007a9d", + "gap_set_random_device_address": "0x00007ab9", + "gap_set_tx_power_reporting_enable": "0x00007ad9", + "gap_start_ccm": "0x00007af9", + "gap_subrate_request": "0x00007b41", + "gap_test_end": "0x00007b5d", + "gap_tx_test_v2": "0x00007b69", + "gap_tx_test_v4": "0x00007b81", + "gap_update_connection_parameters": "0x00007ba5", + "gap_vendor_tx_continuous_wave": "0x00007be9", + "gatt_client_cancel_write": "0x00008111", + "gatt_client_discover_characteristic_descriptors": "0x00008137", + "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x00008177", + "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x000081c7", + "gatt_client_discover_characteristics_for_service": "0x00008217", + "gatt_client_discover_primary_services": "0x0000824d", + "gatt_client_discover_primary_services_by_uuid128": "0x0000827f", + "gatt_client_discover_primary_services_by_uuid16": "0x000082c3", + "gatt_client_execute_write": "0x000082ff", + "gatt_client_find_included_services_for_service": "0x00008325", + "gatt_client_get_mtu": "0x00008353", + "gatt_client_is_ready": "0x000083f5", + "gatt_client_listen_for_characteristic_value_updates": "0x0000840b", + "gatt_client_prepare_write": "0x0000842d", + "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x00008469", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x00008493", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008499", + "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x000084c7", + "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x000084cd", + "gatt_client_read_multiple_characteristic_values": "0x000084fb", + "gatt_client_read_value_of_characteristic_using_value_handle": "0x0000852b", + "gatt_client_read_value_of_characteristics_by_uuid128": "0x00008559", + "gatt_client_read_value_of_characteristics_by_uuid16": "0x000085a5", + "gatt_client_register_handler": "0x000085f1", + "gatt_client_reliable_write_long_value_of_characteristic": "0x000085fd", + "gatt_client_signed_write_without_response": "0x00008a2d", + "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x00008af1", + "gatt_client_write_client_characteristic_configuration": "0x00008b2b", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x00008b7d", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008b8d", + "gatt_client_write_long_value_of_characteristic": "0x00008bc9", + "gatt_client_write_long_value_of_characteristic_with_offset": "0x00008bd9", + "gatt_client_write_value_of_characteristic": "0x00008c15", + "gatt_client_write_value_of_characteristic_without_response": "0x00008c4b", + "hci_add_event_handler": "0x0000a1dd", + "hci_power_control": "0x0000a98d", + "hci_register_acl_packet_handler": "0x0000ab41", + "kv_commit": "0x0000b2dd", + "kv_get": "0x0000b339", + "kv_init": "0x0000b345", + "kv_init_backend": "0x0000b3c5", + "kv_put": "0x0000b3d9", + "kv_remove": "0x0000b3e5", + "kv_remove_all": "0x0000b419", + "kv_value_modified": "0x0000b449", + "kv_value_modified_of_key": "0x0000b465", + "kv_visit": "0x0000b471", + "l2cap_add_event_handler": "0x0000b501", + "l2cap_can_send_packet_now": "0x0000b511", + "l2cap_create_le_credit_based_connection_request": "0x0000b6cd", + "l2cap_credit_based_send": "0x0000b811", + "l2cap_credit_based_send_continue": "0x0000b83d", + "l2cap_disconnect": "0x0000b8b9", + "l2cap_get_le_credit_based_connection_credits": "0x0000bb09", + "l2cap_get_peer_mtu_for_local_cid": "0x0000bb25", + "l2cap_init": "0x0000bef9", + "l2cap_le_send_flow_control_credit": "0x0000bfef", + "l2cap_max_le_mtu": "0x0000c2f9", + "l2cap_register_packet_handler": "0x0000c421", + "l2cap_register_service": "0x0000c42d", + "l2cap_request_can_send_now_event": "0x0000c53d", + "l2cap_request_connection_parameter_update": "0x0000c557", + "l2cap_send_echo_request": "0x0000ca31", + "l2cap_unregister_service": "0x0000caf1", + "le_device_db_add": "0x0000cb49", + "le_device_db_find": "0x0000cc21", + "le_device_db_from_key": "0x0000cc4d", + "le_device_db_iter_cur": "0x0000cc55", + "le_device_db_iter_cur_key": "0x0000cc59", + "le_device_db_iter_init": "0x0000cc5d", + "le_device_db_iter_next": "0x0000cc65", + "le_device_db_remove_key": "0x0000cc8b", + "ll_ackable_packet_alloc": "0x0000ccb7", + "ll_ackable_packet_get_status": "0x0000cdf1", + "ll_ackable_packet_run": "0x0000ce61", + "ll_ackable_packet_set_tx_data": "0x0000cf05", + "ll_adjust_conn_peer_tx_power": "0x0000cf2d", + "ll_aes_encrypt": "0x0000cf59", + "ll_channel_monitor_alloc": "0x0000cfd5", + "ll_channel_monitor_check_each_pdu": "0x0000d057", + "ll_channel_monitor_run": "0x0000d0bd", + "ll_config": "0x0000d171", + "ll_create_conn": "0x0000d18d", + "ll_dhkey_generated": "0x0000d3c5", + "ll_free": "0x0000d3f9", + "ll_get_conn_events_info": "0x0000d405", + "ll_get_conn_info": "0x0000d4e9", + "ll_get_heap_free_size": "0x0000d535", + "ll_hint_on_ce_len": "0x0000d549", + "ll_install_ecc_engine": "0x0000d581", + "ll_legacy_adv_set_interval": "0x0000d58d", + "ll_lock_frequency": "0x0000d59d", + "ll_malloc": "0x0000d601", + "ll_p256_key_pair_generated": "0x0000d609", + "ll_raw_packet_alloc": "0x0000d7bd", + "ll_raw_packet_free": "0x0000d891", + "ll_raw_packet_get_bare_rx_data": "0x0000d8c9", + "ll_raw_packet_get_rx_data": "0x0000d98f", + "ll_raw_packet_recv": "0x0000da31", + "ll_raw_packet_send": "0x0000daed", + "ll_raw_packet_set_bare_data": "0x0000dbd5", + "ll_raw_packet_set_bare_mode": "0x0000dc13", + "ll_raw_packet_set_param": "0x0000dd19", + "ll_raw_packet_set_tx_data": "0x0000dd77", + "ll_register_hci_acl_previewer": "0x0000dddd", + "ll_scan_set_fixed_channel": "0x0000de41", + "ll_set_adv_access_address": "0x0000e059", + "ll_set_adv_coded_scheme": "0x0000e065", + "ll_set_conn_acl_report_latency": "0x0000e095", + "ll_set_conn_coded_scheme": "0x0000e0c5", + "ll_set_conn_interval_unit": "0x0000e0f1", + "ll_set_conn_latency": "0x0000e0fd", + "ll_set_conn_tx_power": "0x0000e12d", + "ll_set_def_antenna": "0x0000e169", + "ll_set_initiating_coded_scheme": "0x0000e185", + "ll_set_max_conn_number": "0x0000e191", + "ll_set_tx_power_range": "0x0000e225", + "ll_unlock_frequency": "0x0000e24d", + "nibble_for_char": "0x0001fb75", + "platform_32k_rc_auto_tune": "0x0001fc11", + "platform_32k_rc_tune": "0x0001fc8d", + "platform_calibrate_32k": "0x0001fca1", + "platform_call_on_stack": "0x000040ef", + "platform_config": "0x0001fca5", + "platform_controller_run": "0x0001fdc9", + "platform_delete_timer": "0x0001fdfd", + "platform_enable_irq": "0x0001fe05", + "platform_get_gen_os_driver": "0x0001fe3d", + "platform_get_link_layer_interf": "0x0001fe49", + "platform_get_task_handle": "0x0001fe51", + "platform_get_timer_counter": "0x0001fe69", + "platform_get_us_time": "0x0001fe6d", + "platform_get_version": "0x0001fe71", + "platform_hrng": "0x0001fe79", + "platform_init_controller": "0x0001fe81", + "platform_os_idle_resumed_hook": "0x0001fe9d", + "platform_patch_rf_init_data": "0x0001fea1", + "platform_post_sleep_processing": "0x0001fead", + "platform_pre_sleep_processing": "0x0001feb3", + "platform_pre_suppress_ticks_and_sleep_processing": "0x0001feb9", + "platform_printf": "0x0001febd", + "platform_raise_assertion": "0x0001fed1", + "platform_rand": "0x0001fee5", + "platform_read_info": "0x0001fee9", + "platform_read_persistent_reg": "0x0001ff19", + "platform_reset": "0x0001ff29", + "platform_set_abs_timer": "0x0001ff4d", + "platform_set_evt_callback": "0x0001ff51", + "platform_set_evt_callback_table": "0x0001ff65", + "platform_set_irq_callback": "0x0001ff71", + "platform_set_irq_callback_table": "0x0001ff8d", + "platform_set_rf_clk_source": "0x0001ff99", + "platform_set_rf_init_data": "0x0001ffa5", + "platform_set_rf_power_mapping": "0x0001ffb1", + "platform_set_timer": "0x0001ffbd", + "platform_shutdown": "0x0001ffc1", + "platform_switch_app": "0x0001ffc5", + "platform_trace_raw": "0x0001fff1", + "platform_write_persistent_reg": "0x00020009", + "printf_hexdump": "0x00020019", + "reverse_128": "0x00020359", + "reverse_24": "0x0002035f", + "reverse_256": "0x00020365", + "reverse_48": "0x0002036b", + "reverse_56": "0x00020371", + "reverse_64": "0x00020377", + "reverse_bd_addr": "0x0002037d", + "reverse_bytes": "0x00020383", + "sm_add_event_handler": "0x00020571", + "sm_address_resolution_lookup": "0x000206c9", + "sm_authenticated": "0x00020a45", + "sm_authorization_decline": "0x00020a53", + "sm_authorization_grant": "0x00020a73", + "sm_authorization_state": "0x00020a93", + "sm_bonding_decline": "0x00020aad", + "sm_config": "0x00020f09", + "sm_config_conn": "0x00020f21", + "sm_encryption_key_size": "0x000210d7", + "sm_just_works_confirm": "0x0002165d", + "sm_le_device_key": "0x000219a9", + "sm_passkey_input": "0x00021a3f", + "sm_private_random_address_generation_get": "0x00021df9", + "sm_private_random_address_generation_get_mode": "0x00021e01", + "sm_private_random_address_generation_set_mode": "0x00021e0d", + "sm_private_random_address_generation_set_update_period": "0x00021e35", + "sm_register_external_ltk_callback": "0x00021f71", + "sm_register_oob_data_callback": "0x00021f7d", + "sm_request_pairing": "0x00021f89", + "sm_send_security_request": "0x00022a5f", + "sm_set_accepted_stk_generation_methods": "0x00022a85", + "sm_set_authentication_requirements": "0x00022a91", + "sm_set_encryption_key_size_range": "0x00022a9d", + "sscanf_bd_addr": "0x00022e6d", + "sysSetPublicDeviceAddr": "0x00023221", + "uuid128_to_str": "0x00023855", + "uuid_add_bluetooth_prefix": "0x000238ad", + "uuid_has_bluetooth_prefix": "0x000238cd" } \ No newline at end of file diff --git a/bundles/noos_exp/ING9187xx/meta.json b/bundles/noos_exp/ING9187xx/meta.json index f42af79fb..4e87e6e14 100644 --- a/bundles/noos_exp/ING9187xx/meta.json +++ b/bundles/noos_exp/ING9187xx/meta.json @@ -8,11 +8,11 @@ }, "rom": { "base": 16384, - "size": 136316 + "size": 136384 }, "version": [ 1, 9, - 38 + 39 ] } \ No newline at end of file diff --git a/bundles/noos_exp/ING9187xx/platform.bin b/bundles/noos_exp/ING9187xx/platform.bin index 7dbdfbd2772c6af550b9c08b061287f974c2eebf..3224c7aa7dddefc5368eb35be4075b451b2be5f2 100644 GIT binary patch delta 6947 zcmZ{o3tZJzw#V1n=fOF6K;C#j(I4L5Kppu$d;S0&U+B8|- z|9JmenmRXA$MKVPq65=l_RjHoN1JryPGxp&947gMsrkUi{jGEU$C~-fJ)h72|6P0S zwfA28wf6p>8@nBc_BfhocyR8CJfamvL??3n6j`2s{_UASbOpBZTLifUPxDo#HarKe zGu=eqyWnv=XUw$dF8oB6v^?Cy6yC#ylmsCKPad8!JOP7$X04gW zdZ>sBQ_gSrNSnMf;?Va>g%wgu+_?VT7G)_2Euy+Zw$S6>U5r|_Dk%8GcNd+jp1$Z@ z$8S0cHWl*kS3#!s?=Cu^b^Ju@fY#bYUv21K$7?-}TxttCbz|ZbMe{vJ?Yk6D^el14 zGgs&vf`^2B`yhH#q9#!HA6hFshl9U$TB5R*apVST`k$jVt3G2rk44)#Ch1`!Ra`X7 znxu;C-7g)?BGQr`_N73CL? z89#OW{Zqya8b0DFq8i@91vv}F#O562zB&3UBL?$X{qTq!yqzO=CAp9-KKE@= z7s4z@J85`i0bdAHQl#`+-}Ynr@saW2HKR*p~q-p#T3``Jd z$1tMO^jerjnZ0O+d9zx7ur6R@jA-u64r&1{___4%58 zsP#OC)h|zOwdSZ^=EzQL9hIYhnz}UUGuTEJ1ZuLkjzSxOwCcX~&O*H*t;8)||1B)( z0BZ`}ZoV@-$I~K1d;80th{CmANeIEapemuR}x47QaGe$qBthxF}qhI11dR0bz(g!H+cU5&SIEVrHNqP>_ z`}M6E@w{7a%UFj~Y+vv~x<`ldt!i{)^~7`HCLsMcVB7wUu?%_0>PCChGLGPoJigv&0iK z<2@Dr57kXjwB6HL>E$~Ux2{?yZeLX*R{GJZe7wVFr{i5bI|uvv+1YDZR5fey-drOY z$7=@QeYvI*@ABF!c$Yph2k(|gbPRv-oD$y*cIcbuEHeXzyRHQJwRP!9ox6xE-79~m zy8o@6iWU}T-51z$=gk3buahlzqHYM@Tpx*dbiK%V^Mn zQ~T&`#ar~+Mdwu582$doUg24K*JG=LogSh(%;3-mkAXc$Ft(@97|3=W%<6gg8!N zK3{c_rmsH~=XvDNzxPoo_j<0M`jqW{!eH$me-l@{@1G9C-sjmy#;tyUM^6| zp09s&G{+OeWrZHg&rVg*1KfiiGgRDYoFfN4g3o1Fy`*b)*;AHV`jNm^i zZt&Jd^K;B~-U~523^jU_l6aYumwUGk=G#uLHMWjouNt((J2jOjE52mxN#||0j^#|{ z-qO)LP4Q>O&M|P}tap4S7e;Wo_xV!prMTU@c@i&U=bRHvjd;q9gfe~`*&SsZgh}w8 znaY^eJ>D}FobTXS-a)fD$juwQLzi*B0vD~|Ol5bs;XZKE`$iK_XBdYxqe*AiNv8Hc ziwg~_`F(c!WVF%c%~->?d!cZ~2JRiqON`=|`2`G2$IHB!d7)9dmG?q>Z7b)atJ$w` zqT;_9Gq&?u+t#mfOYwGY=Xi@v=BwH3e3iX6HTnVXdwZmDkCCvK6Zx1odoSzkyf&9; z^BY9FjE>*>27kpquC|0HUu4P(!I4sI(Wv`a+c(||`!Nh$>1}v}Jh>1g&D&FNM(IxNkBfQ$_ z>3kQ-d$2>^H0sZC6Q;HEEazCA zTZ0rmj`%v?Na^GuT;ZM3$zJBSywTtCUzqoKFP!JdAmz$8?3egU{>1p^63jj`!Y^|s zeMp(qN=5^c~y=B+08fJ}!7ss?;3@C(H#kxyOZfyVQ8#FDk?*%0{2pmrlwWUy{SU_B zTb$T*8R`fmg^}P@FbX8N6Ael=F(zX{3-oLi<`m=m+k98_iTy=t6OTP>Ind@dM-sZmOF zBD2fkz=%?#!4?%eNK`2 z=$E^!R-4F1qeT^l_!`n2j$XdfM=feVh*;UR-eJ;(M&l+b%odeX(=^<_e3b-i;)h@E zr3D3PWojfRw1|jcQ;tX3UZ&hvqka@=7D&)|axWB|wuz{pW+|6V z&|oCkRIFPDBT2JZL(OviHM`yAlS?IAx-dvXDbtO+wA|c8k&P9|ZtzWzX0Z%1vqzw} z;bu)EHH)v&Bs4lov-%nx3ON-vA#mVBw489qfO?p$R1KR#%@N^9HjRp~ga(UjwAfXqZ?Y$8lYL#5HXqP}d|l2* zxtUsCUYc2~662g%s2c3{XTcHI9rKDsI8KZtID zJFww;*se*shaD!JCWFBy$p|$SVJ5>(MwpE9(~_u#Z-u=|^QCX0!OSg0*C|BnkOq-{ z|7AZDOqL;E^utWP4F(+SVRof7`8-Q;`8^zIGSyEfhn2sA0(mOTm+!Rr>9B?6i9X2b zPg}xi&2l-Chmg+11xu8q=Dt1W6R zCU3$f-j*aQ2$n2H|TGT(?^$I0lc*AcCK;cKrc z#;3TB0{%IS)cz=Q=Zev6QZaV?6>~0MM}eMR{k6YHg=p}=4ykzfogOVVJJKR{_9yP> zKQ{HLqK89!Hv7r4II;fdI27_rhC+JSWENOsG7qdPRkRMzew;*BlE|#6B|^?0d=o^< zThY)kcm++{6?rpt#*3b5MuG$aro%Ug zP_J<@Ns!KVGD(0wgJVj9Y*#O)5U>=K0L)--u=xj~FtF2tf6BlrI}Q@C!^((zOpBnG zn2`Eoy6KKW0>p_W)*oXpUU^FV2ENSpT@G=~m0v>=v<)Cv8(^T*aa2mL#j_Dz=?GdI5u&b77I#`bM z&%p!rOb>&dbFnVK>=Yv?HqU}IhaymfVtEmbV$=&Qk9%cpP`(*7~=o{20ccnHoDEFj#P|o6x5+*r^ z-Jl#l72}(j20*Aq1p~o-;9cMsg-myY$wjz|fGZ|24FNBsr}u)3puY#a1`Y+=Kslq= zAYabs6>#ill0Q)f9wSvC1CNnKy}pAOX*qZsX2C!X$PP3hr*$PV0tOEw-Gz!~fGNnI z2_A=iB{&auvYE2WWJDAl1tp9mJ;1aHp=LC4U&I}})kx^Aat7QyBW70G14^-tU;B$~ z2Bnz$Yc`t0l{;knBz&L1z1v2Feyp8?Ria3d61wyNB~Mb3k)U?j3^-Pl-sn@B?TZwTVK z$g+nS?TIY=I3UYj4iuLC?8IGHY-CRdWZBmNd)eCoS@yTx?zfjc9;m03utEZbWv}$2M zWX8_4_~&+!NA#%s4S0!zjyfU8gl>3K!UJvvyCgi|;YSor#M7pPu`6Mfj@8{v{17 z-*1z#C{pPY=Hr_cKkai2$Mr(|Nq{tDtrgymEZ=D; eT#;jXVOX+t`ULCri+z&^CcCDeHYP`@!T$$8lv&OI delta 7059 zcmZ{p3v^UfmWKB}^++m7C8>}iDU!eqAxJ)?lt|Cvom}WY&Xu;Xn>Vd96%F#c!(LNt^&fR4F}w70 z5yPCnx}S(As|xD=L#NB{iu|iXeO{p7j(<;`8s~q{ZRft{9w1WXW!2VHRc7yg@mK+o zcJ2ZH*}lKDt1t5W8&f7Q=lYNKPhfRMudQYRVTO|HpX!+fhS#pY9r6hnxmwu)8jm{t8gH@omzC%PcAQR0)%FADXcSr2({Jqo9Uk#-8+lo9NJ+2`hHnjk-m zMj}drg*G5PT^fbmBam<2t!_o<6v!dFI^@m0+qs3EQFra;cD^cg8(o;u`N4PVrZ(I`>6>M}H$XN!yGHgF{i> ztB%287>JvTk_L5M{muam~s_$hj%!#kY@U#A!8B49sk4hC)mnm9bjz>Q;`=y_2{9EQ+ zRO-Jc=nu_*(tT=zqUn*OEnZQ#sJ^zL_7}B8t$y1BbCfz>;a|AmW99l;brp){`ZKEo z>@;==%KAc{>gGIGu2j1tGNQS2_4exPvi}2oG z_aojd4=u&})&;6i8?)W4pI^Gk3^+CQlab$EpPk$K8j+>@@%L2sKOUvB)umU9 zLmT?L;4Hw~vY}UIs#D=uyOhhPkE77GwLbppUL>jSc23Xc>cQpj?E?%|@ z@59Tay<5vU7VNdZedQg+Gxhd07uD}`^%ov~nG^M_N47;A zf19Wt^L?Sg|M4Ts>|CY~-&o7!Z{C<~MZ+f^UusLmV#@Moc@J3B)$#tbPrPg6V*l=) zi&1(_ z&42o(fE~JBzx*+rbNo#QzY60be~o{b6YFdDNB%_BHOxQZ+`qH^7}gHtet(X3V+Ce( z|BqFjKBGtXybJh$+f$;{u?c!~?_U7_-+KF7c$eRK^O-PDJ<6TVXT(KEQ5izx6XB$t zJ+|wgh6g$6)WKz;dW z;N>iyq4-VTUo*2%FfyTug=Hbe~+D$xBfk(D*zOtY0#BJeB z;JTORGmK|7p-D&ES*Eprk}h;?<9}g?A)}49K+|@<6N$o2%^VZK!+p&!@iTBt>ORIv zJjB@hu>BzG>^QuPs0xd2kuSB~aQ>(5Tx)Ti|DLJ9i4&~cqEYv$Bl`onhv5cJ z2z0#7Nmko%6l)5cd6zF*IXQ6jeg2WT+1GKDx4CELN-!*{m(7NsCfl~aS9y#l^Az9S zW4w-M23#Lv7BRloz3wS=~Z4O6UtfI_*3jSz2!`aNw2fjSZJDiSmhoUe0E1KnN z{D$)#8;~4=idXm!f5TqPapnasv^r*mDY_RyeUNWM7Y}1spskAo%qs&6{>p!5t_$Q| z;yz*OlL@}5SNSiz)i=BcW>5R(^>9A#@wEtE^_}kFMe2iG->4sOs2&Pz_<@Hh-sx-W zxy#@4vkAp9O3&Cf>bj^3%r96QvH@Sy1 zq^1-r(d(ckij3c8@YhJ&;)8k{O8&;@y2As!?NG-dDeMCt0^`9>&<#p8eN85S?<1WE z%Fm+_9YeYw_z9Qp1GIFsYSi%1uOUxP)U*cF4)zy$C+a3Xjaybt^loCM0RL<@GbRD)x#AfpV5EBCkL zslo2uhltkVVLV-!(KfKPW3Bp(`@0Vlx$xNV$gk%NJ_-Ja&k2~F9P3-C)NGFRbttve zn=@U}zgn<;h{@w8@NOwwN}f zqr$?ikW*ho{Exad&?b7wWf(-7S+*SZgUB-2sI(RhplU&M{uZlG*%G4~Dbkk@QhVL@< zqczKnNOa~L#xX{-8Xdg=ISV#U=(j)~3lBz{a<+EoPK+t%K$hten_O++Ko?|jZ=Oap z*yx0Bwq5n*Exty(N+=hzLKJbEMT+36zGjhP_+kW#+&VzmNp|~4v#S%ef`SCt_~E4#QsspV@&;Ha9$tNVe25roAP=z={DsJ(DyavjhfYKO)wLiv{^>OQt4(? znrIGxixv@)Wj64*78R9f+Vjo+{Rf(Qb<<|^m@dL6J$1DZ-3I4j3*KP6Cg~d-Zqi{g z0`y8ow5f5hu zl1+{X(v}t^4>BknsS0+$OEqRs(!uKp$l}WD2*$!2*5Of=;sL8Iz7UjxOR+F-BR|zl z&x0pqu5(3i^=M64@3(RO`M?{nuZ8Px*ftp+y^eF#s5jiLwHWPr`x=VtC=i^(KH3hM ztEj%(QRx`=_FLxMEk*i9V#!QiiRm83F#?`+Fsf!skH8yE%<*tgioQk7c3vZR0v+HVJZS!zzN{4TBeDha|zRZV9FY%N#J&{1oS-2R0_^R zei_&SmV;|oGF5;*;AHR`?52Q6S20zByS=NKrb0Nq9AOxAHX;OrnJ}mVPa-`-(x~8m zuzfMpOt1kRngt$zh-o(1vXp5KIIf;)F1QBzd0<-|(|pj0^aEf+1Ji?G>oRx)Ebc;q zg_3~|ECL;1HRwXY8n6kh!g8s>-6#{zcMN741@1k-^a}m}VUY`NlD89LCDgV)@$P;Z z`NoZ8c%>{G3+=mkamJ?U^I9f`dDx+C|3p7Bv~$4naJ-0PJ&(zX?*M%hr0`D zIoR8$v2mzhDr1rZ-C4q3tWyg$%*NFS#AhGYvxPoIT5f3Wg|egFLWInAKl z>^$YNK`gYp7;73l0y@C`u$QaS8Z;=^q*PE&-{#3oa`K+8V3H%qHOb4yH7^APamAxL zP)_!iQl@*r^Pt=+vQS_c*p89j3ua&hL%_q}aBvMM=kz$_%Nd=8j{QRNr-<|6sSnj0WVyPC!P;;6bF@P|*Ug3tR~9g8d>e4R*4jdZq_M$@Z#X zC^?6bPDi-OL2el?;j4XhF{&`FGvd&fC<8op>?vK8Fp zyA-1)dlPZ(*6^IPkS3+1{DrPyd7+f=0`LA{D|gmA*qXBrNJO(yGh+P^=;dCU`#r8n z&_?0TD6(u}dzCx?&^y zIwZ^94%y584#~2|?e?I(?DJ4Pm4p=%DlGdw5!V~3RQ7yGmVIx*kVP+hKUAsg|Bx&( zAXJaUfsib*AXHZ3K}eREV8cx0I#8(u28+eVacZzr8j%2D^w4+Ng{z>bBt}^A86dL6 z38O4zi4`GP!bK!5!(t;LBP2`M2$iid^)kzQ@%I%pL?=O+yS*L3S?6N3Jaa1XJPT8W)|KrQJO`F0aI{xvcW7C!| z9gp)-d+`rS_{1j2bn+ix+M%`IrL{wA?WDi%?s}ZJ`PXqvSa|WR(iMt4{;T0XR{WKJ zZ$t`nr`{Sl$knTgh^MG>>iYGuPJd_QXAVB0UyMJ_r~G>o!Z~4b9g!+4U0}^nrD0uP zy;(q{O|J95miVJEp69Pho5*~~zc)RRxlTW#BOmY% zS&JbHC+!@DTDs>&T_?=0u7mtXDFOY1kT+E;3boLL^mwEtuMzU+;!D8C`E3P|Lw2)~ zS1NXaycun`r0#%R-uCnym0%_&wY`jt;OLKSdtX1Dw?1>jzjf)xvG@Ni-E}OwTEBl( zrqZhQ$3~Us%OK5y1s!2cVJJ7>HMExUSWoXo(Vn73q=kl?VPkKUAwD=VUQf#pbH9Tc zLT+z6Ms!Zk&9CHR`u6-OS*MU^EmIzcrwCIt!Bf6qljm`npu5WSMVX)IJ^6F_c|4Q! zRih^id{y$>CVlb!%+O@0uH$bKjkv2Xs_V5kC)MbG8J(Qu!ARL#Ba7)NLAJR9DX$ZUm^Yo9$Ji#yPEd|fw_Q!k1o?I!b18ugV#bJT| z-|fjyd&HC8)%q7>Gu41L?X%xf`M;?BU&ZJ2i*--L zpPHv=MkHzXFKev#G%RVjuYsuDzi$46N)4In|NDZsl>6W7Q*_JU-e7R>g~j@Myg}C2 z*2Z+au!kBaO5|zG!!u*?I7F_6i?^|;9@vIwi$^kE^7O^?tfwB&Axo~~*?;K+cg1-VB9To2DSYa9Lh{`+pNzx+Wc0U5}ll(v>A2%?-tv&x11&Si%m^ z@@#d^j+X>4g4_}mmko-SxwHf#(lR>r<)-LhPUo^gs6DCK!1H|b3OtLJOM5$(OP3BW zPyeQ?rGc(qTrRzEuXq#B^DBlT`ti!Okk{e)xPEoz+F(0n5uS4k93JH<^Vo}{F+>|% zq{o+9rn|)tiHxt_SQGTxU%2Xy;tP7=>dRcJ_g`~B*=zN;*KBco_&SjXGhX4ZSlbk) zM%C(XY`mYl{27ntSRWeB zw@t-BP4i#eWhnOhcR$sn_&I;i)8Do7Fa4YM?y~V^-F@IPU-sWTP-%y5+E1?ARl!n! z@sY)Lp5;H>Hprz$H2VMa_WU%y3&un`IE9a6w>GFdKs=(vl+4DCmH~U%?8{BMU zS-3>;E4~&Rf55L86=9ri;j>1IgLj1|&q2Y{WsH#Q7+;F0yv0u1dv9#tnZ49VcJpfy zJi~W3g%9v5UvnRRK|vjp%5QW0x=Bn}rn$rFmn~~p(JU*KmiRi;co%mV8`C+K!QC4F zPVo|BVPAfNRrEaL@BR3`NS=94 z*#4bNNxO`%%eY$c24BTg`0=E1bt>1#@JmKTJx40#{>+%akRM^k@lTk};(p2Z;r)CZ z`TH9<+{V+4LmtL-_85nnc%ohPS!#UxAkRk3_;VZmThUdPY@hVn> zm->G6D*se6zH@{ppv$|D@La`5eVu;Z7IyZZsQ9|^$Wi{eB`|mUjr?Q$Lb$Rv8Gm_` zYjHC1<+pP>KWx;rv(AoG95h<6{66qqdy8M-y~f^OaDydgvO`gU3;Sr9MWe2BZ5&}l z{R*R@@?JOo>m5$E+V(aPeQdmRhA&%rpRxNqUuWL#+x~n0Zv2Ir5(dY6OaVYC8Zl{{)e|X9J>c7N*%7~roo+@$NW7b|L?rb z72(cM^zKMSMH#+dck^gRBhmv<^*o>J7JF5{8e``z9&3##N=GzAtdFbN^PU=r@n%-I z=NoNG{h86;9;=EC$7sD2sXkLw>3hbh1}bNz@3vDV`2Ofr{Z#KjVzla4=^O1*^Ho8m z?^%~BR>LZdzq!yoHe8bn~Rw;bT*Wp$N;^X@$s+f*7|1v@=?m9nFnXx@a z{a$(ZFIO~EBWeXJ!56?;;7ec?coeJ#Ujb)>XTUjNI1Z>aX1W&af_^Ue1~?Bq2G)UX zAm1W-AIw4er{Di7+dMMrk(?Piu3M8O`HCnL2wI&}1_rY$RnSKNm2RDN6 zfscY6;C%3RV1Lbb{$7=2R3@lvoF%TOT8X{@Elvtt8^EuSw#5bYHk7>KYw4}hz1N|R zK~fkCehtQf3Xa8tQcZ%%M9>C(Z&0ozjmVC4G8hG>fMTzKQcou6hJF}$4e4x9MrJq| z4}Gpi-ax}6p-6!u5BwAcqfF+5GGzte@4-ToW5GeN9|wL0{diF9ia=>#0yqr$6Tw_? z5;z8&49Zok1syHXFfe(@D1{<#h40xUbx-`^qxcfToq^kd`!w!$qa#WEhEsD}iL!C` z$1PXy|W?m?RxZ)?#8J%{xC zF;od=ks^%6P!vghk?<~sg$*-Zov0NQB*MnP*iC{>w&;CBG>m*YR3%tKS*B?z^xu)D4a5VTfJp_5Asb2#plFfS7LQV9Wqi)`4Oz6G*e!$ zRRu;xMrZ>nO@{X}PaCy}h&;1_M>VH2-L&UhX=$0JUfr_UQeZD-yYY5*?j^bn)*(K0 zdpS%KMK{|`I!s2Gj4~N*(rq%vWL%JzbnVLXs7H+qq;I3a>jx0+$))Xi77ZfpMOt_f z4Ga4|51j~~nHf41ArHHmok7R4P3D-)4bs8ULw*GNA{8C5b6A43+oF?1AMOaIEu(`D zsxhXcQ_OU^&`aI6sR4yJvKI~rvrJZi-L^Tw0?a{Lm3Bz<4vVR`1*yVK_6pLS7-TQL z6?Cw7Fzx7Lawv%T@3!>~D!5;O;y?=;5N8aHgR}YGP z6V}9S}m^K)P~>>rRh>9(y84C&X{=K~en&*TH;Lx z+DY|7IE)4)(3Hh8NdRdF$AdR-VqpGr$O0o)g#5Fg6HNeJokSDCtr(F>;8l#kWUyi! zQ!(fcV=4iYtc)L9nGPbI17-|n@|Hm;Y+)(~FRo;o3Z7ks=>RJpWcm(xZ41+MuR&=)l7@PDx@31kHN*@ zm4}!f04tF10khXLEdiHoz$f)m2uDy+lVrfNW#IV@OwC{w3N8mvgOyl*g$@}y{IH+H zGy*(y1Vi5F`|Z6d%{#9VpD57TV&meIv&IAtWi4}M5nAZdJXwSmYDd}yUIC*(TODKV zS*Q*9a$2%g%G$HgWaP(!+o6|pN)jmNn<`MwHdj$j&NZ&tvSjdD%)&@UKsdZe-VO^j zH_F>#AqOaj)S6~_ODvR+v>a^rBP}@{pd4=VQIQ;AH&2(h4fTKy@I%xmr^Qw@C?~~6 zP!1p+HB55&hzDh(vsGfs`olo>{3R$L zTXP5Wa!!bZK9oNn>C>pV9&{jo0eBYn3&BL#$y=9SFC&C+YY>5oQs-l;5zIy-cNsoq zp2qz+eh08&oSdYrzE85$u$&?Plu}m8zb2)uv;&kAjthFJ^>iQ~wSrP>**`h(jp&-U z6i0cOJPp3=YZ<7fcn9M{Wd!cC7Sg0vDPM+LN($v~8t%{)2U|H<-MK@w`UQ!mHac>U zr~rDg>bZgMZfKo2Ws5AYynN<}JVk1Sk;oDP5)-jCOG4s+3mc8d5(^l9h%E6SBuh*P z6_&W*z{i2uNNfnn5+6eL5+g#g#EG!5puNP3P(8CHG=~aH(CFPeXe5CnBunhT0W#2- z#E(#=5<^0=#F0=v5=%m|#FJ22i76p@A!M5kbxuYPB)Eh!B*28clOPjnKmtwQzCkA> z*o15(;3(zWJXj6&nxikV$BK_E861f}fp#EE2nxv(h9dE)AvO|lwzb*?7|C#~i>u@t1kZ+RJ z#}J!xAv7ZcGmRhBBsSrc2g;$~-CxR%O>`BGNvH6WB;F{Zp~qxnMY*5L#)@xyFd1~g z(G;)<<+8ygXz2eN2_oOX`&5j3YIE@YfN|hjKWYu-BLA{)dZ~>*;Zac(w1#xKNI}KAlJv7Tj%5R|O$$7vC66q+OrxyBhyY z2*>(%r4DDF;X9oc&+OH&XnkFEr370@tM+B4zoa7QL#R<>%E+zH+8Mz zVqZqLuazeg?wzyzo<-uybYIjRABA|ooua5Q9Mea#Eq-YW}*Wn`nG=Ed4%5FZz$f^`#tAaglfh5zRaW^ zy(TM)Y@{~d73yj~+5AIfu2h_SFcKBtMuVz=7Ce6WNm`1jDAq4z#$y1k{+-js73?>+ z>%kXM&Q|DJFuGdZ-Eg@ya>M$i`NjIU{!4l+x6C`;1oI#VOcUe(*7Q7D_-Fb=)6@FI zEU$i}e~9PhTWue1dRUJdFu&%^O1L(Zv=f*Tsa=EimRl}a1Nm{O0sXy@2Vz9x07+LN zec8&Zfc&i36&Avl1hk<{~37OGBET&^-g! zcIx+=VO>7(#Bb7V2i_~uUl`a){jEg*aNy_!ahn?@sDU*FmulUZYUwVsk4A0>5yB|4+T-Fkg?f?l3Ij7uR+;|2Ql z?D!t%V0X~js_m6G+L2CfwC_BAmih(Pi)#Dx&16iwrsoZc=VZNXP!->yw+x!&U-z+k zkHL@eT)k=VQ#sQyg5G`lV6}yhqHWms*i|=wnSE1M+il1T*rVENUx&-lQ!u>_=}3KR zP7*uy{W(jb#{Q~oPvjNrJ%+?bjrf%|3EC&&i5Qn^i?|`y+4W^Zk}_n}i+(evi_IM| zfdQY+vX*PZkbHHdM87&Du}fE(-2&Cth$enO0U@e&w(q-f*>+y53+VlQw%%#mohBD(BoehiHxO zX!*TLof+fnKkH2u_1pFoz3Ow#HTl+Rd1Q{Pmg5y^*qY}nhD(H*HvsR-c|#GQ_RZVK zqFS&K@1_NkabZDcyuFn(@m^8+3*OZW=i}YFP{+hnR*msb_1+Oj$ksOEkZSuwGZie&-#IN9BhFb)|8kMUh)auZ$2+|`2Jg&jk!Mw#cqc4gg7>3~ zrM=e0V)CWMX}5+_;2%o*60x#u$s2elEbWPyRk(B&RHP~ZdfKQw=9z}WZW~} zzYQc-y?l9Pzz$#SJvS9^(rZ_I&!ktc+^vq3=@F|QbnSSJXaVNX<=e5UDnzxF=^+oy z=I4Et4-BxQtNI7$JFXld^7uRt?Y8kw-~Kh@Y?`U~VP6Z@0_W(*w~Tk#F?5G7 z{c%%qmG9KHD#eq0Bey?f=lgxfc5HF*ZoO>x_q^Me_w*zublac*#i=e<`ZhPrbF$la zsp)o)^W0pl6gPIZ|%G-S#&V0^}c~}+OeY3v5H%?ug@B8%nH+If2niQLy zVJ@?AzT$aClY_tJdFGA~PP1{X+2rCap^1^GxUP^9&Rn?#h?oyLN&EEmM>n6XG-pTg zD`D(3yve+qyBm$kyhlMjHHF_{?ro%}aSW#$nQ6R*>&zBOfu}V7NO8KkuQNZ!>b+@Z z{|vq}oSkMxFTNSB+A7U?gSmT{I#z3J8^y2jqh?_~Pf}cL>?-8lAtjrcPHr}bjpoUU z`x!gNqU#Z6);OLS&9lrMGdWzTV?UaIp2hdE>)s!jYVpi6y3OH3$UifOLmlie&o5xi zWutk%iibPZCzWQO z&C`G6w>Zo%qmL_R&A&X!UEHYL`Yd+{gC~sd{=%EZBP(Cxdsuy2Y5e#yzaSZZY~W!S z@~H-%rg)K&`6_P=sr?xZ|7^bbDj&4@r>n%=aDexOs>2J-E=PDO^D$$?QBLDtX8lpt z+0|M_)D3ITFmm4FJv`Ao{T9!$MPGL+8tlQbR%p|x?L}0C>`rr9Mm#eU=qSoGu8qC7;Jb-zyx#7QgqbKZ`rf5TdMOQQ?L5RDb|n?T4H5W*QX`dBcR0L|mB}1uvQ2%?= zN_FCw4USex{Hl=>t#*5lCn<7`#}a=LQ4){WhkKuSGFpACYDyL>D$L zmVk@E$>2P23ivQs3cdlBS?Q_Z^GHtvSAx^QrQi&38OZHKPk?=qo(=W`r-S1)no7GN ztcBt}Fb$NSLWK{JUa18-TxD@JSPcCdD}5g*2Cf4)gAagpU^%$aTon&3;>@22U^SmWugXykAXQB zhk$=adMLOD%mt-f9w;3Q1AhRAgXh5!;QxXnLHUi+0*2;maLiB0D1hRp#l|-Ys*AVc zRebB#mw4oN{1hhOGoq1F&Tu5FDe8ktqdZy7>tU}_ z^q~z~mY729Hp~dq$fpQ%qm<}GX1CLclaj_67m`(c7g6% zeZ7+d^7&oHohd3VL-OaKI$LGex|On{S<&C`w%Z*d8fHBv1a zMKLCS6ERvuM2I!iSk2*ZS$Z#;2(|Qake!wskM5(are%#qLzZ8HmYnRe$|P#h(P5UH zgu3CDoUBnA#aIvr_ePqX`bt%sb6G9Flv z1-U;w7GcQ)w3|0OSn@!~G81CNaTpK(%9%Yv7By5U^h~Ac7Hbx)F@*9PAnC$c!+RxXV z(avsGp#rR-?jjp|H8sdT+vBw&|B$8630kOs$R_Gd)Fw>mh_=MWBD9xa$&<8+6P49= zG0H?+t}D^TkB_nB$^P*LHpmpX+H2`cHKM+jjb)n6n3=8|HDcsc3=kh*{v9<9%PiiK zr^DWkmOKMx`dQ;B*YffPTJlV+@=Qyv_8S`5LdzldxAZGvM55KsD#%HeyjpYCIFqf! z8f2tc@_m}!o@&W!wGzKq#6$O^(L~D=>$I@20agbOXl{3!Ri4{ZQ#)CD)$VX4p}f?+ z#zcE}5ZwU1|4vAUXnS|mh~R`EbXg3u7-2EeVwA;bi?IRP(zN=gQD61sLJxxP^7Pgchbg7gXl1CuQc52 z)_|^CC{GRd)02+GM&0=)-pjAN2hqY~@@9&bng zkq|CfB5cq%y;qBtY$tW=a6hL@-I9 zX+}8-GI{?ZE%D}5B$LFNipUzqL4~o$Fito8HF#lls{Y(pqhfyUIRgwY4BJfeL8uXyzVsITe3Cr&i zZfbooDUE%Z`hhbVnA-7SZ!_|`tE8IP3Vd!r?TCr>CUzTy^<|@O(_|gmX!~?ohc;S+ zv#dI4Og$BBSc_mE$2G)Uc2+v$CU_LQ8>~h7S>Q(~CmZiVxp)ZQ$TI`6 zsud$|M?A|$?rr$q7>nl-4`~kg$xX^`^y;p9^*(b+YT4<+MX6<{kx1LX7EoGU_p{Y1 zC=rm2tynvr*o6wyMKl(iYczFNV`{#Icn;5T8);HUYD=BqBeflPg1-+?R&IYcZxZ#` z;}5D-Sxq<}w%CjIl9B6Ye8kOi0%#a8Zv`(T-umg!S zojV7NkZ9vCV>I7^+qKvw0mqK-E0HDW_}hkzz;jEM*b|O#9VsL6Cn!q{3f7f4Bzjo| zb@=laI-;YX%x&F!vO4hJxfapmi}!7qO_;%PP{`C@dPkxTE}cyhbr7Lmm(veCB+&=6 zd_9seekcp0}_33fiWfep#GZ@eTXWKO7y{X0cnhh>R!Vjz)Da)471RWe46w? z{Y*L7GmwGV#h=3@8sTc!C{c)L11t;!_q{9Ok?2u$gk?$JgB`()gL0bU8yyBGf-OiV zfmhy=AV8Fkj{ZMSAQOLo8`E8Nh_Y7)wuN7XSF*AFPUS1q@c%{pv@hVOPYdu*CZr*2 z2QZG?udeRP@d0+}P`jRpMXmiCgT6?e?kHBD>kA-mp*IpWN-XZtkg@jcq;g HM=|<8RPmd^ diff --git a/bundles/noos_exp/inc/gap.h b/bundles/noos_exp/inc/gap.h index e7edb2ffb..69180228e 100644 --- a/bundles/noos_exp/inc/gap.h +++ b/bundles/noos_exp/inc/gap.h @@ -1273,7 +1273,7 @@ uint8_t gap_rx_test_v2(uint8_t rx_channel, uint8_t phy, uint8_t modulation_index uint8_t gap_rx_test_v3(uint8_t rx_channel, uint8_t phy, uint8_t modulation_index, uint8_t expected_cte_length, uint8_t expected_cte_type, uint8_t slot_durations, - uint8_t switching_pattern_length, uint8_t *antenna_ids); + uint8_t switching_pattern_length, const uint8_t *antenna_ids); /** * @brief Start a test where the DUT generates test reference packets at a fixed interval. @@ -1310,7 +1310,7 @@ uint8_t gap_tx_test_v2(uint8_t tx_channel, uint8_t test_data_length, uint8_t gap_tx_test_v4(uint8_t tx_channel, uint8_t test_data_length, uint8_t packet_payload, uint8_t phy, uint8_t cte_length, uint8_t cte_type, - uint8_t switching_pattern_length, uint8_t *antenna_ids, + uint8_t switching_pattern_length, const uint8_t *antenna_ids, int8_t tx_power_level); /** diff --git a/bundles/noos_exp/inc/ll_api.h b/bundles/noos_exp/inc/ll_api.h index a1178c67c..bd6d44875 100644 --- a/bundles/noos_exp/inc/ll_api.h +++ b/bundles/noos_exp/inc/ll_api.h @@ -98,6 +98,57 @@ void ll_set_initiating_coded_scheme(const coded_scheme_t scheme); */ void ll_hint_on_ce_len(const uint16_t conn_handle, const uint16_t min_ce_len, const uint16_t max_ce_len); +/** + **************************************************************************************** + * @brief Create a connection directly (without advertising & initiating) + * + * @param[in] role connection role. master (0), slave (1) + * @param[in] addr_types address types for advertiser and initiator + * bit [0] for slave, bit [1] for master + * 0: public address; 1: random address + * @param[in] adv_addr address of advertiser + * @param[in] init_addr address of initiator + * @param[in] rx_phy Rx PHY (1: 1M, 2: 2M, 3: Coded) + * @param[in] tx_phy Tx PHY (1: 1M, 2: 2M, 3: Coded) + * @param[in] access_addr access address + * @param[in] crc_init CRC init + * @param[in] interval connection interval (unit: us) + * @param[in] sup_timeout supervision timeout (unit: 10ms) + * @param[in] channel_map channel map + * @param[in] ch_sel_algo channel selection algorithm (1 or 2) + * @param[in] hop_inc hop increment for CSA#1 ([5..16]) + * @param[in] min_ce_len information parameter about the minimum length of connection + * event needed for this LE connection. + * @param[in] max_ce_len information parameter about the maximum length of connection + * event needed for this LE connection. + * @param[in] start_time start time of the 1st connectin event + * @param[in] slave_latency slave latency + * @param[in] sleep_clk_acc sleep clock accuracy + * @param[in] sync_window slave's sync window for 1st connection event + * @return 0 if successful else error code + **************************************************************************************** + */ +int ll_create_conn( + uint8_t role, + uint8_t addr_types, + const uint8_t *adv_addr, + const uint8_t *init_addr, + uint8_t rx_phy, + uint8_t tx_phy, + uint32_t access_addr, + uint32_t crc_init, + uint32_t interval, + uint16_t sup_timeout, + const uint8_t *channel_map, + uint8_t ch_sel_algo, + uint8_t hop_inc, + uint16_t min_ce_len, + uint16_t max_ce_len, + uint64_t start_time, + uint16_t slave_latency, + uint8_t sleep_clk_acc, + uint32_t sync_window); + /** **************************************************************************************** * @brief Set tx power of a connection diff --git a/bundles/noos_exp/inc/platform_api.h b/bundles/noos_exp/inc/platform_api.h index 630aec5e4..6700b4a48 100644 --- a/bundles/noos_exp/inc/platform_api.h +++ b/bundles/noos_exp/inc/platform_api.h @@ -753,7 +753,7 @@ void platform_delete_timer(f_platform_timer_callback callback); * the generic OS interface. * * @param[in] id task identifier - * @param[in] start start address of the new stack + * @param[in] start start (lowest) address of the new stack * @param[in] size size of the new stack in bytes **************************************************************************************** */ @@ -841,6 +841,21 @@ typedef struct platform_hci_link_layer_interf */ const platform_hci_link_layer_interf_t *platform_get_link_layer_interf(void); +typedef void (*f_platform_function)(void *user_data); + +/** + **************************************************************************************** + * @brief Call a function on a separate dedicated stack + * + * @param[in] f the function to be called + * @param[in] user_data user data passed to `f` + * @param[in] start start (lowest) address of the dedicated stack + * @param[in] size size of the dedicated stack in bytes + **************************************************************************************** + */ +void platform_call_on_stack(f_platform_function f, void *user_data, + void *stack_start, uint32_t stack_size); + #ifdef __cplusplus } #endif diff --git a/bundles/noos_extension/ING9168xx/apis.json b/bundles/noos_extension/ING9168xx/apis.json index 358b11211..be3e37588 100644 --- a/bundles/noos_extension/ING9168xx/apis.json +++ b/bundles/noos_extension/ING9168xx/apis.json @@ -177,6 +177,7 @@ "ll_channel_monitor_check_each_pdu": "0x0200c2e3", "ll_channel_monitor_run": "0x0200c345", "ll_config": "0x0200c415", + "ll_create_conn": "0x0200c431", "ll_free": "0x0200c66b", "ll_get_conn_events_info": "0x0200c675", "ll_get_conn_info": "0x0200c75d", diff --git a/bundles/noos_extension/ING9168xx/meta.json b/bundles/noos_extension/ING9168xx/meta.json index 1bbc7c043..18a945c69 100644 --- a/bundles/noos_extension/ING9168xx/meta.json +++ b/bundles/noos_extension/ING9168xx/meta.json @@ -13,6 +13,6 @@ "version": [ 2, 2, - 52 + 53 ] } \ No newline at end of file diff --git a/bundles/noos_extension/ING9168xx/platform.bin b/bundles/noos_extension/ING9168xx/platform.bin index 2e99cf6dff4108f08379548f7a149a14d8361b0b..ce974268b5f8559db4c0302482ec3a0a715593ce 100644 GIT binary patch delta 20 ccmcaIi}T7X&I$h+O`90o7#X)QGKKg609pG77ytkO delta 20 ccmcaIi}T7X&I$h+O_~_n7#X)QGKKg609o({7XSbN diff --git a/bundles/noos_extension/ING9187xx/apis.json b/bundles/noos_extension/ING9187xx/apis.json index f72718a0e..68e39777d 100644 --- a/bundles/noos_extension/ING9187xx/apis.json +++ b/bundles/noos_extension/ING9187xx/apis.json @@ -1,271 +1,272 @@ { - "att_dispatch_client_can_send_now": "0x0000565d", - "att_dispatch_client_request_can_send_now_event": "0x00005663", - "att_dispatch_register_client": "0x00005669", - "att_dispatch_register_server": "0x0000567d", - "att_dispatch_server_can_send_now": "0x00005691", - "att_dispatch_server_request_can_send_now_event": "0x00005697", - "att_emit_general_event": "0x00005749", - "att_server_can_send_packet_now": "0x00005e79", - "att_server_deferred_read_response": "0x00005e7d", - "att_server_get_mtu": "0x00005e95", - "att_server_indicate": "0x00005f0d", - "att_server_init": "0x00005f91", - "att_server_notify": "0x00005fcd", - "att_server_register_packet_handler": "0x000060e5", - "att_server_request_can_send_now_event": "0x000060f1", - "att_set_db": "0x0000610d", - "att_set_read_callback": "0x00006121", - "att_set_write_callback": "0x0000612d", - "bd_addr_cmp": "0x0000629d", - "bd_addr_copy": "0x000062a3", - "bd_addr_to_str": "0x000062ad", - "big_endian_read_16": "0x000062e5", - "big_endian_read_32": "0x000062ed", - "big_endian_store_16": "0x00006301", - "big_endian_store_32": "0x0000630d", - "btstack_config": "0x00006445", - "btstack_memory_pool_create": "0x00006593", - "btstack_memory_pool_free": "0x000065bd", - "btstack_memory_pool_get": "0x0000661d", - "btstack_push_user_msg": "0x00006665", - "btstack_push_user_runnable": "0x00006671", - "btstack_reset": "0x0000667d", - "char_for_nibble": "0x00006941", - "gap_add_dev_to_periodic_list": "0x000071e9", - "gap_add_whitelist": "0x000071f9", - "gap_aes_encrypt": "0x00007205", - "gap_clear_white_lists": "0x0000723d", - "gap_clr_adv_set": "0x00007249", - "gap_clr_periodic_adv_list": "0x00007255", - "gap_create_connection_cancel": "0x00007261", - "gap_disconnect": "0x0000726d", - "gap_disconnect_all": "0x00007299", - "gap_ext_create_connection": "0x000072d9", - "gap_get_connection_parameter_range": "0x000073b1", - "gap_le_read_channel_map": "0x000073ed", - "gap_periodic_adv_create_sync": "0x00007459", - "gap_periodic_adv_create_sync_cancel": "0x0000747d", - "gap_periodic_adv_term_sync": "0x00007489", - "gap_read_periodic_adv_list_size": "0x00007511", - "gap_read_phy": "0x0000751d", - "gap_read_remote_used_features": "0x00007529", - "gap_read_remote_version": "0x00007535", - "gap_read_rssi": "0x00007541", - "gap_remove_whitelist": "0x0000754d", - "gap_rmv_adv_set": "0x000075c9", - "gap_rmv_dev_from_periodic_list": "0x000075d5", - "gap_rx_test_v2": "0x000075e5", - "gap_set_adv_set_random_addr": "0x0000761d", - "gap_set_callback_for_next_hci": "0x00007659", - "gap_set_connection_parameter_range": "0x00007679", - "gap_set_data_length": "0x00007691", - "gap_set_def_phy": "0x000076a9", - "gap_set_ext_adv_data": "0x000076b9", - "gap_set_ext_adv_enable": "0x000076d1", - "gap_set_ext_adv_para": "0x00007741", - "gap_set_ext_scan_enable": "0x00007819", - "gap_set_ext_scan_para": "0x00007831", - "gap_set_ext_scan_response_data": "0x000078d1", - "gap_set_host_channel_classification": "0x000078e9", - "gap_set_periodic_adv_data": "0x000078f9", - "gap_set_periodic_adv_enable": "0x00007969", - "gap_set_periodic_adv_para": "0x00007979", - "gap_set_phy": "0x00007991", - "gap_set_random_device_address": "0x000079ad", - "gap_start_ccm": "0x000079dd", - "gap_test_end": "0x00007a25", - "gap_tx_test_v2": "0x00007a31", - "gap_tx_test_v4": "0x00007a49", - "gap_update_connection_parameters": "0x00007a6d", - "gap_vendor_tx_continuous_wave": "0x00007ab1", - "gatt_client_cancel_write": "0x00007fd9", - "gatt_client_discover_characteristic_descriptors": "0x00007fff", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x0000803f", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x0000808f", - "gatt_client_discover_characteristics_for_service": "0x000080df", - "gatt_client_discover_primary_services": "0x00008115", - "gatt_client_discover_primary_services_by_uuid128": "0x00008147", - "gatt_client_discover_primary_services_by_uuid16": "0x0000818b", - "gatt_client_execute_write": "0x000081c7", - "gatt_client_find_included_services_for_service": "0x000081ed", - "gatt_client_get_mtu": "0x0000821b", - "gatt_client_is_ready": "0x000082bd", - "gatt_client_listen_for_characteristic_value_updates": "0x000082d3", - "gatt_client_prepare_write": "0x000082f5", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x00008331", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x0000835b", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008361", - "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x0000838f", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x00008395", - "gatt_client_read_multiple_characteristic_values": "0x000083c3", - "gatt_client_read_value_of_characteristic_using_value_handle": "0x000083f3", - "gatt_client_read_value_of_characteristics_by_uuid128": "0x00008421", - "gatt_client_read_value_of_characteristics_by_uuid16": "0x0000846d", - "gatt_client_register_handler": "0x000084b9", - "gatt_client_reliable_write_long_value_of_characteristic": "0x000084c5", - "gatt_client_signed_write_without_response": "0x000088f5", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x000089b9", - "gatt_client_write_client_characteristic_configuration": "0x000089f3", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x00008a45", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008a55", - "gatt_client_write_long_value_of_characteristic": "0x00008a91", - "gatt_client_write_long_value_of_characteristic_with_offset": "0x00008aa1", - "gatt_client_write_value_of_characteristic": "0x00008add", - "gatt_client_write_value_of_characteristic_without_response": "0x00008b13", - "hci_add_event_handler": "0x0000a039", - "hci_power_control": "0x0000a7d9", - "hci_register_acl_packet_handler": "0x0000a98d", - "kv_commit": "0x0000b129", - "kv_get": "0x0000b185", - "kv_init": "0x0000b191", - "kv_init_backend": "0x0000b211", - "kv_put": "0x0000b225", - "kv_remove": "0x0000b231", - "kv_remove_all": "0x0000b265", - "kv_value_modified": "0x0000b295", - "kv_value_modified_of_key": "0x0000b2b1", - "kv_visit": "0x0000b2bd", - "l2cap_add_event_handler": "0x0000b34d", - "l2cap_can_send_packet_now": "0x0000b35d", - "l2cap_create_le_credit_based_connection_request": "0x0000b519", - "l2cap_credit_based_send": "0x0000b65d", - "l2cap_credit_based_send_continue": "0x0000b689", - "l2cap_disconnect": "0x0000b705", - "l2cap_get_le_credit_based_connection_credits": "0x0000b955", - "l2cap_get_peer_mtu_for_local_cid": "0x0000b971", - "l2cap_init": "0x0000bd45", - "l2cap_le_send_flow_control_credit": "0x0000be3b", - "l2cap_max_le_mtu": "0x0000c145", - "l2cap_register_packet_handler": "0x0000c26d", - "l2cap_register_service": "0x0000c279", - "l2cap_request_can_send_now_event": "0x0000c389", - "l2cap_request_connection_parameter_update": "0x0000c3a3", - "l2cap_send_echo_request": "0x0000c87d", - "l2cap_unregister_service": "0x0000c93d", - "le_device_db_add": "0x0000c995", - "le_device_db_find": "0x0000ca6d", - "le_device_db_from_key": "0x0000ca99", - "le_device_db_iter_cur": "0x0000caa1", - "le_device_db_iter_cur_key": "0x0000caa5", - "le_device_db_iter_init": "0x0000caa9", - "le_device_db_iter_next": "0x0000cab1", - "le_device_db_remove_key": "0x0000cad7", - "ll_ackable_packet_alloc": "0x0000cb03", - "ll_ackable_packet_get_status": "0x0000cc35", - "ll_ackable_packet_run": "0x0000cca5", - "ll_ackable_packet_set_tx_data": "0x0000cd41", - "ll_aes_encrypt": "0x0000cd5d", - "ll_channel_monitor_alloc": "0x0000cdd9", - "ll_channel_monitor_check_each_pdu": "0x0000ce5b", - "ll_channel_monitor_run": "0x0000cec1", - "ll_config": "0x0000cf75", - "ll_free": "0x0000cfab", - "ll_get_heap_free_size": "0x0000cfb5", - "ll_hint_on_ce_len": "0x0000cfc9", - "ll_legacy_adv_set_interval": "0x0000d001", - "ll_lock_frequency": "0x0000d011", - "ll_malloc": "0x0000d075", - "ll_query_timing_info": "0x0000d1ad", - "ll_raw_packet_alloc": "0x0000d1f9", - "ll_raw_packet_free": "0x0000d2cd", - "ll_raw_packet_get_bare_rx_data": "0x0000d305", - "ll_raw_packet_get_rx_data": "0x0000d3cb", - "ll_raw_packet_recv": "0x0000d46d", - "ll_raw_packet_send": "0x0000d529", - "ll_raw_packet_set_bare_data": "0x0000d611", - "ll_raw_packet_set_bare_mode": "0x0000d64f", - "ll_raw_packet_set_param": "0x0000d755", - "ll_raw_packet_set_tx_data": "0x0000d7b3", - "ll_register_hci_acl_previewer": "0x0000d819", - "ll_scan_set_fixed_channel": "0x0000d87d", - "ll_set_adv_access_address": "0x0000da95", - "ll_set_adv_coded_scheme": "0x0000daa1", - "ll_set_conn_acl_report_latency": "0x0000dad1", - "ll_set_conn_coded_scheme": "0x0000db01", - "ll_set_conn_interval_unit": "0x0000db2d", - "ll_set_conn_latency": "0x0000db39", - "ll_set_conn_tx_power": "0x0000db69", - "ll_set_def_antenna": "0x0000dbb1", - "ll_set_initiating_coded_scheme": "0x0000dbcd", - "ll_set_max_conn_number": "0x0000dbd9", - "ll_unlock_frequency": "0x0000dc6d", - "nibble_for_char": "0x0001df11", - "platform_32k_rc_auto_tune": "0x0001dfad", - "platform_32k_rc_tune": "0x0001e029", - "platform_calibrate_32k": "0x0001e03d", - "platform_config": "0x0001e041", - "platform_controller_run": "0x0001e165", - "platform_delete_timer": "0x0001e199", - "platform_enable_irq": "0x0001e1a1", - "platform_get_gen_os_driver": "0x0001e1d9", - "platform_get_link_layer_interf": "0x0001e1e5", - "platform_get_task_handle": "0x0001e1ed", - "platform_get_timer_counter": "0x0001e205", - "platform_get_us_time": "0x0001e209", - "platform_get_version": "0x0001e20d", - "platform_hrng": "0x0001e215", - "platform_init_controller": "0x0001e21d", - "platform_os_idle_resumed_hook": "0x0001e239", - "platform_patch_rf_init_data": "0x0001e23d", - "platform_post_sleep_processing": "0x0001e249", - "platform_pre_sleep_processing": "0x0001e24f", - "platform_pre_suppress_ticks_and_sleep_processing": "0x0001e255", - "platform_printf": "0x0001e259", - "platform_raise_assertion": "0x0001e26d", - "platform_rand": "0x0001e281", - "platform_read_info": "0x0001e285", - "platform_read_persistent_reg": "0x0001e2b5", - "platform_reset": "0x0001e2c5", - "platform_set_abs_timer": "0x0001e2e9", - "platform_set_evt_callback": "0x0001e2ed", - "platform_set_evt_callback_table": "0x0001e301", - "platform_set_irq_callback": "0x0001e30d", - "platform_set_irq_callback_table": "0x0001e329", - "platform_set_rf_clk_source": "0x0001e335", - "platform_set_rf_init_data": "0x0001e341", - "platform_set_rf_power_mapping": "0x0001e34d", - "platform_set_timer": "0x0001e359", - "platform_shutdown": "0x0001e35d", - "platform_switch_app": "0x0001e361", - "platform_trace_raw": "0x0001e38d", - "platform_write_persistent_reg": "0x0001e3a5", - "printf_hexdump": "0x0001e3b5", - "reverse_128": "0x0001e6f5", - "reverse_24": "0x0001e6fb", - "reverse_256": "0x0001e701", - "reverse_48": "0x0001e707", - "reverse_56": "0x0001e70d", - "reverse_64": "0x0001e713", - "reverse_bd_addr": "0x0001e719", - "reverse_bytes": "0x0001e71f", - "sm_add_event_handler": "0x0001e8ed", - "sm_address_resolution_lookup": "0x0001ea45", - "sm_authenticated": "0x0001edc1", - "sm_authorization_decline": "0x0001edcf", - "sm_authorization_grant": "0x0001edef", - "sm_authorization_state": "0x0001ee0f", - "sm_bonding_decline": "0x0001ee29", - "sm_config": "0x0001f285", - "sm_config_conn": "0x0001f29d", - "sm_encryption_key_size": "0x0001f453", - "sm_just_works_confirm": "0x0001f9d9", - "sm_le_device_key": "0x0001fd25", - "sm_passkey_input": "0x0001fdbb", - "sm_private_random_address_generation_get": "0x00020175", - "sm_private_random_address_generation_get_mode": "0x0002017d", - "sm_private_random_address_generation_set_mode": "0x00020189", - "sm_private_random_address_generation_set_update_period": "0x000201b1", - "sm_register_external_ltk_callback": "0x000202ed", - "sm_register_oob_data_callback": "0x000202f9", - "sm_request_pairing": "0x00020305", - "sm_send_security_request": "0x00020ddb", - "sm_set_accepted_stk_generation_methods": "0x00020e01", - "sm_set_authentication_requirements": "0x00020e0d", - "sm_set_encryption_key_size_range": "0x00020e19", - "sscanf_bd_addr": "0x000211e9", - "sysSetPublicDeviceAddr": "0x0002159d", - "uuid128_to_str": "0x00021ba9", - "uuid_add_bluetooth_prefix": "0x00021c01", - "uuid_has_bluetooth_prefix": "0x00021c21" + "att_dispatch_client_can_send_now": "0x000056a5", + "att_dispatch_client_request_can_send_now_event": "0x000056ab", + "att_dispatch_register_client": "0x000056b1", + "att_dispatch_register_server": "0x000056c5", + "att_dispatch_server_can_send_now": "0x000056d9", + "att_dispatch_server_request_can_send_now_event": "0x000056df", + "att_emit_general_event": "0x00005791", + "att_server_can_send_packet_now": "0x00005ec1", + "att_server_deferred_read_response": "0x00005ec5", + "att_server_get_mtu": "0x00005edd", + "att_server_indicate": "0x00005f55", + "att_server_init": "0x00005fd9", + "att_server_notify": "0x00006015", + "att_server_register_packet_handler": "0x0000612d", + "att_server_request_can_send_now_event": "0x00006139", + "att_set_db": "0x00006155", + "att_set_read_callback": "0x00006169", + "att_set_write_callback": "0x00006175", + "bd_addr_cmp": "0x000062e5", + "bd_addr_copy": "0x000062eb", + "bd_addr_to_str": "0x000062f5", + "big_endian_read_16": "0x0000632d", + "big_endian_read_32": "0x00006335", + "big_endian_store_16": "0x00006349", + "big_endian_store_32": "0x00006355", + "btstack_config": "0x0000648d", + "btstack_memory_pool_create": "0x000065db", + "btstack_memory_pool_free": "0x00006605", + "btstack_memory_pool_get": "0x00006665", + "btstack_push_user_msg": "0x000066ad", + "btstack_push_user_runnable": "0x000066b9", + "btstack_reset": "0x000066c5", + "char_for_nibble": "0x00006989", + "gap_add_dev_to_periodic_list": "0x00007231", + "gap_add_whitelist": "0x00007241", + "gap_aes_encrypt": "0x0000724d", + "gap_clear_white_lists": "0x00007285", + "gap_clr_adv_set": "0x00007291", + "gap_clr_periodic_adv_list": "0x0000729d", + "gap_create_connection_cancel": "0x000072a9", + "gap_disconnect": "0x000072b5", + "gap_disconnect_all": "0x000072e1", + "gap_ext_create_connection": "0x00007321", + "gap_get_connection_parameter_range": "0x000073f9", + "gap_le_read_channel_map": "0x00007435", + "gap_periodic_adv_create_sync": "0x000074a1", + "gap_periodic_adv_create_sync_cancel": "0x000074c5", + "gap_periodic_adv_term_sync": "0x000074d1", + "gap_read_periodic_adv_list_size": "0x00007559", + "gap_read_phy": "0x00007565", + "gap_read_remote_used_features": "0x00007571", + "gap_read_remote_version": "0x0000757d", + "gap_read_rssi": "0x00007589", + "gap_remove_whitelist": "0x00007595", + "gap_rmv_adv_set": "0x00007611", + "gap_rmv_dev_from_periodic_list": "0x0000761d", + "gap_rx_test_v2": "0x0000762d", + "gap_set_adv_set_random_addr": "0x00007665", + "gap_set_callback_for_next_hci": "0x000076a1", + "gap_set_connection_parameter_range": "0x000076c1", + "gap_set_data_length": "0x000076d9", + "gap_set_def_phy": "0x000076f1", + "gap_set_ext_adv_data": "0x00007701", + "gap_set_ext_adv_enable": "0x00007719", + "gap_set_ext_adv_para": "0x00007789", + "gap_set_ext_scan_enable": "0x00007861", + "gap_set_ext_scan_para": "0x00007879", + "gap_set_ext_scan_response_data": "0x00007919", + "gap_set_host_channel_classification": "0x00007931", + "gap_set_periodic_adv_data": "0x00007941", + "gap_set_periodic_adv_enable": "0x000079b1", + "gap_set_periodic_adv_para": "0x000079c1", + "gap_set_phy": "0x000079d9", + "gap_set_random_device_address": "0x000079f5", + "gap_start_ccm": "0x00007a25", + "gap_test_end": "0x00007a6d", + "gap_tx_test_v2": "0x00007a79", + "gap_tx_test_v4": "0x00007a91", + "gap_update_connection_parameters": "0x00007ab5", + "gap_vendor_tx_continuous_wave": "0x00007af9", + "gatt_client_cancel_write": "0x00008021", + "gatt_client_discover_characteristic_descriptors": "0x00008047", + "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x00008087", + "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x000080d7", + "gatt_client_discover_characteristics_for_service": "0x00008127", + "gatt_client_discover_primary_services": "0x0000815d", + "gatt_client_discover_primary_services_by_uuid128": "0x0000818f", + "gatt_client_discover_primary_services_by_uuid16": "0x000081d3", + "gatt_client_execute_write": "0x0000820f", + "gatt_client_find_included_services_for_service": "0x00008235", + "gatt_client_get_mtu": "0x00008263", + "gatt_client_is_ready": "0x00008305", + "gatt_client_listen_for_characteristic_value_updates": "0x0000831b", + "gatt_client_prepare_write": "0x0000833d", + "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x00008379", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x000083a3", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x000083a9", + "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x000083d7", + "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x000083dd", + "gatt_client_read_multiple_characteristic_values": "0x0000840b", + "gatt_client_read_value_of_characteristic_using_value_handle": "0x0000843b", + "gatt_client_read_value_of_characteristics_by_uuid128": "0x00008469", + "gatt_client_read_value_of_characteristics_by_uuid16": "0x000084b5", + "gatt_client_register_handler": "0x00008501", + "gatt_client_reliable_write_long_value_of_characteristic": "0x0000850d", + "gatt_client_signed_write_without_response": "0x0000893d", + "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x00008a01", + "gatt_client_write_client_characteristic_configuration": "0x00008a3b", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x00008a8d", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008a9d", + "gatt_client_write_long_value_of_characteristic": "0x00008ad9", + "gatt_client_write_long_value_of_characteristic_with_offset": "0x00008ae9", + "gatt_client_write_value_of_characteristic": "0x00008b25", + "gatt_client_write_value_of_characteristic_without_response": "0x00008b5b", + "hci_add_event_handler": "0x0000a081", + "hci_power_control": "0x0000a821", + "hci_register_acl_packet_handler": "0x0000a9d5", + "kv_commit": "0x0000b171", + "kv_get": "0x0000b1cd", + "kv_init": "0x0000b1d9", + "kv_init_backend": "0x0000b259", + "kv_put": "0x0000b26d", + "kv_remove": "0x0000b279", + "kv_remove_all": "0x0000b2ad", + "kv_value_modified": "0x0000b2dd", + "kv_value_modified_of_key": "0x0000b2f9", + "kv_visit": "0x0000b305", + "l2cap_add_event_handler": "0x0000b395", + "l2cap_can_send_packet_now": "0x0000b3a5", + "l2cap_create_le_credit_based_connection_request": "0x0000b561", + "l2cap_credit_based_send": "0x0000b6a5", + "l2cap_credit_based_send_continue": "0x0000b6d1", + "l2cap_disconnect": "0x0000b74d", + "l2cap_get_le_credit_based_connection_credits": "0x0000b99d", + "l2cap_get_peer_mtu_for_local_cid": "0x0000b9b9", + "l2cap_init": "0x0000bd8d", + "l2cap_le_send_flow_control_credit": "0x0000be83", + "l2cap_max_le_mtu": "0x0000c18d", + "l2cap_register_packet_handler": "0x0000c2b5", + "l2cap_register_service": "0x0000c2c1", + "l2cap_request_can_send_now_event": "0x0000c3d1", + "l2cap_request_connection_parameter_update": "0x0000c3eb", + "l2cap_send_echo_request": "0x0000c8c5", + "l2cap_unregister_service": "0x0000c985", + "le_device_db_add": "0x0000c9dd", + "le_device_db_find": "0x0000cab5", + "le_device_db_from_key": "0x0000cae1", + "le_device_db_iter_cur": "0x0000cae9", + "le_device_db_iter_cur_key": "0x0000caed", + "le_device_db_iter_init": "0x0000caf1", + "le_device_db_iter_next": "0x0000caf9", + "le_device_db_remove_key": "0x0000cb1f", + "ll_ackable_packet_alloc": "0x0000cb4b", + "ll_ackable_packet_get_status": "0x0000cc7d", + "ll_ackable_packet_run": "0x0000cced", + "ll_ackable_packet_set_tx_data": "0x0000cd89", + "ll_aes_encrypt": "0x0000cda5", + "ll_channel_monitor_alloc": "0x0000ce21", + "ll_channel_monitor_check_each_pdu": "0x0000cea3", + "ll_channel_monitor_run": "0x0000cf09", + "ll_config": "0x0000cfbd", + "ll_free": "0x0000cff3", + "ll_get_heap_free_size": "0x0000cffd", + "ll_hint_on_ce_len": "0x0000d011", + "ll_legacy_adv_set_interval": "0x0000d049", + "ll_lock_frequency": "0x0000d059", + "ll_malloc": "0x0000d0bd", + "ll_query_timing_info": "0x0000d1f5", + "ll_raw_packet_alloc": "0x0000d241", + "ll_raw_packet_free": "0x0000d315", + "ll_raw_packet_get_bare_rx_data": "0x0000d34d", + "ll_raw_packet_get_rx_data": "0x0000d413", + "ll_raw_packet_recv": "0x0000d4b5", + "ll_raw_packet_send": "0x0000d571", + "ll_raw_packet_set_bare_data": "0x0000d659", + "ll_raw_packet_set_bare_mode": "0x0000d697", + "ll_raw_packet_set_param": "0x0000d79d", + "ll_raw_packet_set_tx_data": "0x0000d7fb", + "ll_register_hci_acl_previewer": "0x0000d861", + "ll_scan_set_fixed_channel": "0x0000d8c5", + "ll_set_adv_access_address": "0x0000dadd", + "ll_set_adv_coded_scheme": "0x0000dae9", + "ll_set_conn_acl_report_latency": "0x0000db19", + "ll_set_conn_coded_scheme": "0x0000db49", + "ll_set_conn_interval_unit": "0x0000db75", + "ll_set_conn_latency": "0x0000db81", + "ll_set_conn_tx_power": "0x0000dbb1", + "ll_set_def_antenna": "0x0000dbf9", + "ll_set_initiating_coded_scheme": "0x0000dc15", + "ll_set_max_conn_number": "0x0000dc21", + "ll_unlock_frequency": "0x0000dcb5", + "nibble_for_char": "0x0001df59", + "platform_32k_rc_auto_tune": "0x0001dff5", + "platform_32k_rc_tune": "0x0001e071", + "platform_calibrate_32k": "0x0001e085", + "platform_call_on_stack": "0x000040ef", + "platform_config": "0x0001e089", + "platform_controller_run": "0x0001e1ad", + "platform_delete_timer": "0x0001e1e1", + "platform_enable_irq": "0x0001e1e9", + "platform_get_gen_os_driver": "0x0001e221", + "platform_get_link_layer_interf": "0x0001e22d", + "platform_get_task_handle": "0x0001e235", + "platform_get_timer_counter": "0x0001e24d", + "platform_get_us_time": "0x0001e251", + "platform_get_version": "0x0001e255", + "platform_hrng": "0x0001e25d", + "platform_init_controller": "0x0001e265", + "platform_os_idle_resumed_hook": "0x0001e281", + "platform_patch_rf_init_data": "0x0001e285", + "platform_post_sleep_processing": "0x0001e291", + "platform_pre_sleep_processing": "0x0001e297", + "platform_pre_suppress_ticks_and_sleep_processing": "0x0001e29d", + "platform_printf": "0x0001e2a1", + "platform_raise_assertion": "0x0001e2b5", + "platform_rand": "0x0001e2c9", + "platform_read_info": "0x0001e2cd", + "platform_read_persistent_reg": "0x0001e2fd", + "platform_reset": "0x0001e30d", + "platform_set_abs_timer": "0x0001e331", + "platform_set_evt_callback": "0x0001e335", + "platform_set_evt_callback_table": "0x0001e349", + "platform_set_irq_callback": "0x0001e355", + "platform_set_irq_callback_table": "0x0001e371", + "platform_set_rf_clk_source": "0x0001e37d", + "platform_set_rf_init_data": "0x0001e389", + "platform_set_rf_power_mapping": "0x0001e395", + "platform_set_timer": "0x0001e3a1", + "platform_shutdown": "0x0001e3a5", + "platform_switch_app": "0x0001e3a9", + "platform_trace_raw": "0x0001e3d5", + "platform_write_persistent_reg": "0x0001e3ed", + "printf_hexdump": "0x0001e3fd", + "reverse_128": "0x0001e73d", + "reverse_24": "0x0001e743", + "reverse_256": "0x0001e749", + "reverse_48": "0x0001e74f", + "reverse_56": "0x0001e755", + "reverse_64": "0x0001e75b", + "reverse_bd_addr": "0x0001e761", + "reverse_bytes": "0x0001e767", + "sm_add_event_handler": "0x0001e935", + "sm_address_resolution_lookup": "0x0001ea8d", + "sm_authenticated": "0x0001ee09", + "sm_authorization_decline": "0x0001ee17", + "sm_authorization_grant": "0x0001ee37", + "sm_authorization_state": "0x0001ee57", + "sm_bonding_decline": "0x0001ee71", + "sm_config": "0x0001f2cd", + "sm_config_conn": "0x0001f2e5", + "sm_encryption_key_size": "0x0001f49b", + "sm_just_works_confirm": "0x0001fa21", + "sm_le_device_key": "0x0001fd6d", + "sm_passkey_input": "0x0001fe03", + "sm_private_random_address_generation_get": "0x000201bd", + "sm_private_random_address_generation_get_mode": "0x000201c5", + "sm_private_random_address_generation_set_mode": "0x000201d1", + "sm_private_random_address_generation_set_update_period": "0x000201f9", + "sm_register_external_ltk_callback": "0x00020335", + "sm_register_oob_data_callback": "0x00020341", + "sm_request_pairing": "0x0002034d", + "sm_send_security_request": "0x00020e23", + "sm_set_accepted_stk_generation_methods": "0x00020e49", + "sm_set_authentication_requirements": "0x00020e55", + "sm_set_encryption_key_size_range": "0x00020e61", + "sscanf_bd_addr": "0x00021231", + "sysSetPublicDeviceAddr": "0x000215e5", + "uuid128_to_str": "0x00021bf1", + "uuid_add_bluetooth_prefix": "0x00021c49", + "uuid_has_bluetooth_prefix": "0x00021c69" } \ No newline at end of file diff --git a/bundles/noos_extension/ING9187xx/meta.json b/bundles/noos_extension/ING9187xx/meta.json index 77f91d3f2..2b7828071 100644 --- a/bundles/noos_extension/ING9187xx/meta.json +++ b/bundles/noos_extension/ING9187xx/meta.json @@ -8,11 +8,11 @@ }, "rom": { "base": 16384, - "size": 128340 + "size": 128416 }, "version": [ 1, 9, - 38 + 39 ] } \ No newline at end of file diff --git a/bundles/noos_extension/ING9187xx/platform.bin b/bundles/noos_extension/ING9187xx/platform.bin index 893b12d3b805f60e9a399d489f129399e1fe3b6b..a03e9576e3e41e2353ff522ca8b744dc1b3b33a2 100644 GIT binary patch delta 6386 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 F^uPH~OsW6? delta 7007 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 Np)+rpjp3@#{{kpkT%-U1 diff --git a/bundles/noos_extension/inc/gap.h b/bundles/noos_extension/inc/gap.h index 68eee5323..595bde525 100644 --- a/bundles/noos_extension/inc/gap.h +++ b/bundles/noos_extension/inc/gap.h @@ -1287,7 +1287,7 @@ uint8_t gap_rx_test_v2(uint8_t rx_channel, uint8_t phy, uint8_t modulation_index uint8_t gap_rx_test_v3(uint8_t rx_channel, uint8_t phy, uint8_t modulation_index, uint8_t expected_cte_length, uint8_t expected_cte_type, uint8_t slot_durations, - uint8_t switching_pattern_length, uint8_t *antenna_ids); + uint8_t switching_pattern_length, const uint8_t *antenna_ids); /** * @brief Start a test where the DUT generates test reference packets at a fixed interval. @@ -1324,7 +1324,7 @@ uint8_t gap_tx_test_v2(uint8_t tx_channel, uint8_t test_data_length, uint8_t gap_tx_test_v4(uint8_t tx_channel, uint8_t test_data_length, uint8_t packet_payload, uint8_t phy, uint8_t cte_length, uint8_t cte_type, - uint8_t switching_pattern_length, uint8_t *antenna_ids, + uint8_t switching_pattern_length, const uint8_t *antenna_ids, int8_t tx_power_level); /** diff --git a/bundles/noos_extension/inc/ll_api.h b/bundles/noos_extension/inc/ll_api.h index ea73ea12f..40dfae771 100644 --- a/bundles/noos_extension/inc/ll_api.h +++ b/bundles/noos_extension/inc/ll_api.h @@ -98,6 +98,57 @@ void ll_set_initiating_coded_scheme(const coded_scheme_t scheme); */ void ll_hint_on_ce_len(const uint16_t conn_handle, const uint16_t min_ce_len, const uint16_t max_ce_len); +/** + **************************************************************************************** + * @brief Create a connection directly (without advertising & initiating) + * + * @param[in] role connection role. master (0), slave (1) + * @param[in] addr_types address types for advertiser and initiator + * bit [0] for slave, bit [1] for master + * 0: public address; 1: random address + * @param[in] adv_addr address of advertiser + * @param[in] init_addr address of initiator + * @param[in] rx_phy Rx PHY (1: 1M, 2: 2M, 3: Coded) + * @param[in] tx_phy Tx PHY (1: 1M, 2: 2M, 3: Coded) + * @param[in] access_addr access address + * @param[in] crc_init CRC init + * @param[in] interval connection interval (unit: us) + * @param[in] sup_timeout supervision timeout (unit: 10ms) + * @param[in] channel_map channel map + * @param[in] ch_sel_algo channel selection algorithm (1 or 2) + * @param[in] hop_inc hop increment for CSA#1 ([5..16]) + * @param[in] min_ce_len information parameter about the minimum length of connection + * event needed for this LE connection. + * @param[in] max_ce_len information parameter about the maximum length of connection + * event needed for this LE connection. + * @param[in] start_time start time of the 1st connectin event + * @param[in] slave_latency slave latency + * @param[in] sleep_clk_acc sleep clock accuracy + * @param[in] sync_window slave's sync window for 1st connection event + * @return 0 if successful else error code + **************************************************************************************** + */ +int ll_create_conn( + uint8_t role, + uint8_t addr_types, + const uint8_t *adv_addr, + const uint8_t *init_addr, + uint8_t rx_phy, + uint8_t tx_phy, + uint32_t access_addr, + uint32_t crc_init, + uint32_t interval, + uint16_t sup_timeout, + const uint8_t *channel_map, + uint8_t ch_sel_algo, + uint8_t hop_inc, + uint16_t min_ce_len, + uint16_t max_ce_len, + uint64_t start_time, + uint16_t slave_latency, + uint8_t sleep_clk_acc, + uint32_t sync_window); + /** **************************************************************************************** * @brief Set tx power of a connection diff --git a/bundles/noos_mass_conn/ING9168xx/meta.json b/bundles/noos_mass_conn/ING9168xx/meta.json index afd929b11..3fc83327a 100644 --- a/bundles/noos_mass_conn/ING9168xx/meta.json +++ b/bundles/noos_mass_conn/ING9168xx/meta.json @@ -13,6 +13,6 @@ "version": [ 2, 2, - 52 + 53 ] } \ No newline at end of file diff --git a/bundles/noos_mass_conn/ING9168xx/platform.bin b/bundles/noos_mass_conn/ING9168xx/platform.bin index bd475a854f28000d7fc60d51ef732094cb32dabf..33f01a8070f5e4bd071f59713966f3711d7f6683 100644 GIT binary patch delta 20 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 aaL)RjbJoJ11Nsbzob?0au}hpK9sC~}adN=` diff --git a/bundles/noos_mass_conn/ING9188xx/apis.json b/bundles/noos_mass_conn/ING9188xx/apis.json index 55112da74..607560bd2 100644 --- a/bundles/noos_mass_conn/ING9188xx/apis.json +++ b/bundles/noos_mass_conn/ING9188xx/apis.json @@ -1,265 +1,266 @@ { - "att_dispatch_client_can_send_now": "0x00005781", - "att_dispatch_client_request_can_send_now_event": "0x00005787", - "att_dispatch_register_client": "0x0000578d", - "att_dispatch_register_server": "0x000057a1", - "att_dispatch_server_can_send_now": "0x000057b5", - "att_dispatch_server_request_can_send_now_event": "0x000057bb", - "att_emit_general_event": "0x0000586d", - "att_server_can_send_packet_now": "0x00005f9d", - "att_server_deferred_read_response": "0x00005fa1", - "att_server_get_mtu": "0x00005fb9", - "att_server_indicate": "0x00006031", - "att_server_init": "0x000060b5", - "att_server_notify": "0x000060f1", - "att_server_register_packet_handler": "0x00006209", - "att_server_request_can_send_now_event": "0x00006215", - "att_set_db": "0x00006231", - "att_set_read_callback": "0x00006245", - "att_set_write_callback": "0x00006251", - "bd_addr_cmp": "0x000063c1", - "bd_addr_copy": "0x000063c7", - "bd_addr_to_str": "0x000063d1", - "big_endian_read_16": "0x00006409", - "big_endian_read_32": "0x00006411", - "big_endian_store_16": "0x00006425", - "big_endian_store_32": "0x00006431", - "btstack_config": "0x00006569", - "btstack_memory_pool_create": "0x000066b7", - "btstack_memory_pool_free": "0x000066e1", - "btstack_memory_pool_get": "0x00006741", - "btstack_push_user_msg": "0x00006789", - "btstack_push_user_runnable": "0x00006795", - "btstack_reset": "0x000067a1", - "char_for_nibble": "0x00006a65", - "gap_add_dev_to_periodic_list": "0x00007381", - "gap_add_whitelist": "0x00007391", - "gap_aes_encrypt": "0x0000739d", - "gap_clear_white_lists": "0x000073d5", - "gap_clr_adv_set": "0x000073e1", - "gap_clr_periodic_adv_list": "0x000073ed", - "gap_create_connection_cancel": "0x000073f9", - "gap_default_periodic_adv_sync_transfer_param": "0x00007405", - "gap_disconnect": "0x0000741d", - "gap_disconnect_all": "0x00007449", - "gap_ext_create_connection": "0x00007489", - "gap_get_connection_parameter_range": "0x00007561", - "gap_le_read_channel_map": "0x00007599", - "gap_periodic_adv_create_sync": "0x00007605", - "gap_periodic_adv_create_sync_cancel": "0x00007629", - "gap_periodic_adv_set_info_transfer": "0x00007635", - "gap_periodic_adv_sync_transfer": "0x00007645", - "gap_periodic_adv_sync_transfer_param": "0x00007655", - "gap_periodic_adv_term_sync": "0x00007671", - "gap_read_antenna_info": "0x000076f9", - "gap_read_periodic_adv_list_size": "0x00007705", - "gap_read_phy": "0x00007711", - "gap_read_remote_used_features": "0x0000771d", - "gap_read_remote_version": "0x00007729", - "gap_read_rssi": "0x00007735", - "gap_remove_whitelist": "0x00007741", - "gap_rmv_adv_set": "0x000077bd", - "gap_rmv_dev_from_periodic_list": "0x000077c9", - "gap_rx_test_v2": "0x000077d9", - "gap_rx_test_v3": "0x000077e9", - "gap_set_adv_set_random_addr": "0x00007835", - "gap_set_callback_for_next_hci": "0x00007871", - "gap_set_connection_cte_request_enable": "0x00007899", - "gap_set_connection_cte_response_enable": "0x000078b5", - "gap_set_connection_cte_rx_param": "0x000078c5", - "gap_set_connection_cte_tx_param": "0x00007919", - "gap_set_connection_parameter_range": "0x00007965", - "gap_set_connectionless_cte_tx_enable": "0x00007981", - "gap_set_connectionless_cte_tx_param": "0x00007991", - "gap_set_connectionless_iq_sampling_enable": "0x000079ed", - "gap_set_data_length": "0x00007a49", - "gap_set_def_phy": "0x00007a61", - "gap_set_ext_adv_data": "0x00007a71", - "gap_set_ext_adv_enable": "0x00007a89", - "gap_set_ext_adv_para": "0x00007af9", - "gap_set_ext_scan_enable": "0x00007bd1", - "gap_set_ext_scan_para": "0x00007be9", - "gap_set_ext_scan_response_data": "0x00007c89", - "gap_set_host_channel_classification": "0x00007ca1", - "gap_set_periodic_adv_data": "0x00007cb1", - "gap_set_periodic_adv_enable": "0x00007d21", - "gap_set_periodic_adv_para": "0x00007d31", - "gap_set_periodic_adv_rx_enable": "0x00007d49", - "gap_set_phy": "0x00007d59", - "gap_set_random_device_address": "0x00007d75", - "gap_start_ccm": "0x00007da5", - "gap_test_end": "0x00007ded", - "gap_tx_test_v2": "0x00007df9", - "gap_tx_test_v4": "0x00007e11", - "gap_update_connection_parameters": "0x00007e35", - "gap_vendor_tx_continuous_wave": "0x00007e79", - "gatt_client_cancel_write": "0x000083a1", - "gatt_client_discover_characteristic_descriptors": "0x000083c7", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x00008407", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x00008457", - "gatt_client_discover_characteristics_for_service": "0x000084a7", - "gatt_client_discover_primary_services": "0x000084dd", - "gatt_client_discover_primary_services_by_uuid128": "0x0000850f", - "gatt_client_discover_primary_services_by_uuid16": "0x00008553", - "gatt_client_execute_write": "0x0000858f", - "gatt_client_find_included_services_for_service": "0x000085b5", - "gatt_client_get_mtu": "0x000085e3", - "gatt_client_is_ready": "0x00008685", - "gatt_client_listen_for_characteristic_value_updates": "0x0000869b", - "gatt_client_prepare_write": "0x000086bd", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x000086f9", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x00008723", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008729", - "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x00008757", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x0000875d", - "gatt_client_read_multiple_characteristic_values": "0x0000878b", - "gatt_client_read_value_of_characteristic_using_value_handle": "0x000087bb", - "gatt_client_read_value_of_characteristics_by_uuid128": "0x000087e9", - "gatt_client_read_value_of_characteristics_by_uuid16": "0x00008835", - "gatt_client_register_handler": "0x00008881", - "gatt_client_reliable_write_long_value_of_characteristic": "0x0000888d", - "gatt_client_signed_write_without_response": "0x00008cbd", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x00008d81", - "gatt_client_write_client_characteristic_configuration": "0x00008dbb", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x00008e0d", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008e1d", - "gatt_client_write_long_value_of_characteristic": "0x00008e59", - "gatt_client_write_long_value_of_characteristic_with_offset": "0x00008e69", - "gatt_client_write_value_of_characteristic": "0x00008ea5", - "gatt_client_write_value_of_characteristic_without_response": "0x00008edb", - "hci_add_event_handler": "0x0000a41d", - "hci_power_control": "0x0000abc1", - "hci_register_acl_packet_handler": "0x0000ad75", - "kv_commit": "0x0000b525", - "kv_get": "0x0000b581", - "kv_init": "0x0000b58d", - "kv_init_backend": "0x0000b60d", - "kv_put": "0x0000b621", - "kv_remove": "0x0000b62d", - "kv_remove_all": "0x0000b661", - "kv_value_modified": "0x0000b691", - "kv_value_modified_of_key": "0x0000b6ad", - "kv_visit": "0x0000b6b9", - "l2cap_add_event_handler": "0x0000b749", - "l2cap_can_send_packet_now": "0x0000b759", - "l2cap_create_le_credit_based_connection_request": "0x0000b915", - "l2cap_credit_based_send": "0x0000ba59", - "l2cap_credit_based_send_continue": "0x0000ba85", - "l2cap_disconnect": "0x0000bb01", - "l2cap_get_le_credit_based_connection_credits": "0x0000bd51", - "l2cap_get_peer_mtu_for_local_cid": "0x0000bd6d", - "l2cap_init": "0x0000c141", - "l2cap_le_send_flow_control_credit": "0x0000c237", - "l2cap_max_le_mtu": "0x0000c541", - "l2cap_register_packet_handler": "0x0000c669", - "l2cap_register_service": "0x0000c675", - "l2cap_request_can_send_now_event": "0x0000c785", - "l2cap_request_connection_parameter_update": "0x0000c79f", - "l2cap_send_echo_request": "0x0000cc79", - "l2cap_unregister_service": "0x0000cd39", - "le_device_db_add": "0x0000cd91", - "le_device_db_find": "0x0000ce69", - "le_device_db_from_key": "0x0000ce95", - "le_device_db_iter_cur": "0x0000ce9d", - "le_device_db_iter_cur_key": "0x0000cea1", - "le_device_db_iter_init": "0x0000cea5", - "le_device_db_iter_next": "0x0000cead", - "le_device_db_remove_key": "0x0000ced3", - "ll_aes_encrypt": "0x0000cf01", - "ll_config": "0x0000cf7d", - "ll_free": "0x0000cfb3", - "ll_get_heap_free_size": "0x0000cfbd", - "ll_hint_on_ce_len": "0x0000cfd1", - "ll_legacy_adv_set_interval": "0x0000d009", - "ll_malloc": "0x0000d019", - "ll_query_timing_info": "0x0000d151", - "ll_register_hci_acl_previewer": "0x0000d19d", - "ll_scan_set_fixed_channel": "0x0000d201", - "ll_set_adv_access_address": "0x0000d419", - "ll_set_adv_coded_scheme": "0x0000d425", - "ll_set_conn_acl_report_latency": "0x0000d455", - "ll_set_conn_coded_scheme": "0x0000d485", - "ll_set_conn_latency": "0x0000d4b1", - "ll_set_conn_tx_power": "0x0000d4e1", - "ll_set_def_antenna": "0x0000d529", - "ll_set_initiating_coded_scheme": "0x0000d545", - "ll_set_max_conn_number": "0x0000d551", - "nibble_for_char": "0x0001e5c5", - "platform_32k_rc_auto_tune": "0x0001e661", - "platform_32k_rc_tune": "0x0001e6dd", - "platform_calibrate_32k": "0x0001e6f1", - "platform_config": "0x0001e6f5", - "platform_controller_run": "0x0001e819", - "platform_delete_timer": "0x0001e84d", - "platform_enable_irq": "0x0001e855", - "platform_get_gen_os_driver": "0x0001e88d", - "platform_get_link_layer_interf": "0x0001e899", - "platform_get_task_handle": "0x0001e8a1", - "platform_get_timer_counter": "0x0001e8b9", - "platform_get_us_time": "0x0001e8bd", - "platform_get_version": "0x0001e8c1", - "platform_hrng": "0x0001e8c9", - "platform_init_controller": "0x0001e8d1", - "platform_os_idle_resumed_hook": "0x0001e8ed", - "platform_patch_rf_init_data": "0x0001e8f1", - "platform_post_sleep_processing": "0x0001e8fd", - "platform_pre_sleep_processing": "0x0001e903", - "platform_pre_suppress_ticks_and_sleep_processing": "0x0001e909", - "platform_printf": "0x0001e90d", - "platform_raise_assertion": "0x0001e921", - "platform_rand": "0x0001e935", - "platform_read_info": "0x0001e939", - "platform_read_persistent_reg": "0x0001e969", - "platform_reset": "0x0001e979", - "platform_set_abs_timer": "0x0001e99d", - "platform_set_evt_callback": "0x0001e9a1", - "platform_set_evt_callback_table": "0x0001e9b5", - "platform_set_irq_callback": "0x0001e9c1", - "platform_set_irq_callback_table": "0x0001e9dd", - "platform_set_rf_clk_source": "0x0001e9e9", - "platform_set_rf_init_data": "0x0001e9f5", - "platform_set_rf_power_mapping": "0x0001ea01", - "platform_set_timer": "0x0001ea0d", - "platform_shutdown": "0x0001ea11", - "platform_switch_app": "0x0001ea15", - "platform_trace_raw": "0x0001ea41", - "platform_write_persistent_reg": "0x0001ea59", - "printf_hexdump": "0x0001ea69", - "reverse_128": "0x0001ede1", - "reverse_24": "0x0001ede7", - "reverse_256": "0x0001eded", - "reverse_48": "0x0001edf3", - "reverse_56": "0x0001edf9", - "reverse_64": "0x0001edff", - "reverse_bd_addr": "0x0001ee05", - "reverse_bytes": "0x0001ee0b", - "sm_add_event_handler": "0x0001f0f9", - "sm_address_resolution_lookup": "0x0001f251", - "sm_authenticated": "0x0001f5cd", - "sm_authorization_decline": "0x0001f5db", - "sm_authorization_grant": "0x0001f5fb", - "sm_authorization_state": "0x0001f61b", - "sm_bonding_decline": "0x0001f635", - "sm_config": "0x0001fa91", - "sm_config_conn": "0x0001faa9", - "sm_encryption_key_size": "0x0001fc5f", - "sm_just_works_confirm": "0x000201e5", - "sm_le_device_key": "0x00020531", - "sm_passkey_input": "0x000205c7", - "sm_private_random_address_generation_get": "0x00020981", - "sm_private_random_address_generation_get_mode": "0x00020989", - "sm_private_random_address_generation_set_mode": "0x00020995", - "sm_private_random_address_generation_set_update_period": "0x000209bd", - "sm_register_external_ltk_callback": "0x00020af9", - "sm_register_oob_data_callback": "0x00020b05", - "sm_request_pairing": "0x00020b11", - "sm_send_security_request": "0x000215e7", - "sm_set_accepted_stk_generation_methods": "0x0002160d", - "sm_set_authentication_requirements": "0x00021619", - "sm_set_encryption_key_size_range": "0x00021625", - "sscanf_bd_addr": "0x00021981", - "sysSetPublicDeviceAddr": "0x00021d35", - "uuid128_to_str": "0x000224d5", - "uuid_add_bluetooth_prefix": "0x0002252d", - "uuid_has_bluetooth_prefix": "0x0002254d" + "att_dispatch_client_can_send_now": "0x000057c9", + "att_dispatch_client_request_can_send_now_event": "0x000057cf", + "att_dispatch_register_client": "0x000057d5", + "att_dispatch_register_server": "0x000057e9", + "att_dispatch_server_can_send_now": "0x000057fd", + "att_dispatch_server_request_can_send_now_event": "0x00005803", + "att_emit_general_event": "0x000058b5", + "att_server_can_send_packet_now": "0x00005fe5", + "att_server_deferred_read_response": "0x00005fe9", + "att_server_get_mtu": "0x00006001", + "att_server_indicate": "0x00006079", + "att_server_init": "0x000060fd", + "att_server_notify": "0x00006139", + "att_server_register_packet_handler": "0x00006251", + "att_server_request_can_send_now_event": "0x0000625d", + "att_set_db": "0x00006279", + "att_set_read_callback": "0x0000628d", + "att_set_write_callback": "0x00006299", + "bd_addr_cmp": "0x00006409", + "bd_addr_copy": "0x0000640f", + "bd_addr_to_str": "0x00006419", + "big_endian_read_16": "0x00006451", + "big_endian_read_32": "0x00006459", + "big_endian_store_16": "0x0000646d", + "big_endian_store_32": "0x00006479", + "btstack_config": "0x000065b1", + "btstack_memory_pool_create": "0x000066ff", + "btstack_memory_pool_free": "0x00006729", + "btstack_memory_pool_get": "0x00006789", + "btstack_push_user_msg": "0x000067d1", + "btstack_push_user_runnable": "0x000067dd", + "btstack_reset": "0x000067e9", + "char_for_nibble": "0x00006aad", + "gap_add_dev_to_periodic_list": "0x000073c9", + "gap_add_whitelist": "0x000073d9", + "gap_aes_encrypt": "0x000073e5", + "gap_clear_white_lists": "0x0000741d", + "gap_clr_adv_set": "0x00007429", + "gap_clr_periodic_adv_list": "0x00007435", + "gap_create_connection_cancel": "0x00007441", + "gap_default_periodic_adv_sync_transfer_param": "0x0000744d", + "gap_disconnect": "0x00007465", + "gap_disconnect_all": "0x00007491", + "gap_ext_create_connection": "0x000074d1", + "gap_get_connection_parameter_range": "0x000075a9", + "gap_le_read_channel_map": "0x000075e1", + "gap_periodic_adv_create_sync": "0x0000764d", + "gap_periodic_adv_create_sync_cancel": "0x00007671", + "gap_periodic_adv_set_info_transfer": "0x0000767d", + "gap_periodic_adv_sync_transfer": "0x0000768d", + "gap_periodic_adv_sync_transfer_param": "0x0000769d", + "gap_periodic_adv_term_sync": "0x000076b9", + "gap_read_antenna_info": "0x00007741", + "gap_read_periodic_adv_list_size": "0x0000774d", + "gap_read_phy": "0x00007759", + "gap_read_remote_used_features": "0x00007765", + "gap_read_remote_version": "0x00007771", + "gap_read_rssi": "0x0000777d", + "gap_remove_whitelist": "0x00007789", + "gap_rmv_adv_set": "0x00007805", + "gap_rmv_dev_from_periodic_list": "0x00007811", + "gap_rx_test_v2": "0x00007821", + "gap_rx_test_v3": "0x00007831", + "gap_set_adv_set_random_addr": "0x0000787d", + "gap_set_callback_for_next_hci": "0x000078b9", + "gap_set_connection_cte_request_enable": "0x000078e1", + "gap_set_connection_cte_response_enable": "0x000078fd", + "gap_set_connection_cte_rx_param": "0x0000790d", + "gap_set_connection_cte_tx_param": "0x00007961", + "gap_set_connection_parameter_range": "0x000079ad", + "gap_set_connectionless_cte_tx_enable": "0x000079c9", + "gap_set_connectionless_cte_tx_param": "0x000079d9", + "gap_set_connectionless_iq_sampling_enable": "0x00007a35", + "gap_set_data_length": "0x00007a91", + "gap_set_def_phy": "0x00007aa9", + "gap_set_ext_adv_data": "0x00007ab9", + "gap_set_ext_adv_enable": "0x00007ad1", + "gap_set_ext_adv_para": "0x00007b41", + "gap_set_ext_scan_enable": "0x00007c19", + "gap_set_ext_scan_para": "0x00007c31", + "gap_set_ext_scan_response_data": "0x00007cd1", + "gap_set_host_channel_classification": "0x00007ce9", + "gap_set_periodic_adv_data": "0x00007cf9", + "gap_set_periodic_adv_enable": "0x00007d69", + "gap_set_periodic_adv_para": "0x00007d79", + "gap_set_periodic_adv_rx_enable": "0x00007d91", + "gap_set_phy": "0x00007da1", + "gap_set_random_device_address": "0x00007dbd", + "gap_start_ccm": "0x00007ded", + "gap_test_end": "0x00007e35", + "gap_tx_test_v2": "0x00007e41", + "gap_tx_test_v4": "0x00007e59", + "gap_update_connection_parameters": "0x00007e7d", + "gap_vendor_tx_continuous_wave": "0x00007ec1", + "gatt_client_cancel_write": "0x000083e9", + "gatt_client_discover_characteristic_descriptors": "0x0000840f", + "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x0000844f", + "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x0000849f", + "gatt_client_discover_characteristics_for_service": "0x000084ef", + "gatt_client_discover_primary_services": "0x00008525", + "gatt_client_discover_primary_services_by_uuid128": "0x00008557", + "gatt_client_discover_primary_services_by_uuid16": "0x0000859b", + "gatt_client_execute_write": "0x000085d7", + "gatt_client_find_included_services_for_service": "0x000085fd", + "gatt_client_get_mtu": "0x0000862b", + "gatt_client_is_ready": "0x000086cd", + "gatt_client_listen_for_characteristic_value_updates": "0x000086e3", + "gatt_client_prepare_write": "0x00008705", + "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x00008741", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x0000876b", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008771", + "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x0000879f", + "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x000087a5", + "gatt_client_read_multiple_characteristic_values": "0x000087d3", + "gatt_client_read_value_of_characteristic_using_value_handle": "0x00008803", + "gatt_client_read_value_of_characteristics_by_uuid128": "0x00008831", + "gatt_client_read_value_of_characteristics_by_uuid16": "0x0000887d", + "gatt_client_register_handler": "0x000088c9", + "gatt_client_reliable_write_long_value_of_characteristic": "0x000088d5", + "gatt_client_signed_write_without_response": "0x00008d05", + "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x00008dc9", + "gatt_client_write_client_characteristic_configuration": "0x00008e03", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x00008e55", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008e65", + "gatt_client_write_long_value_of_characteristic": "0x00008ea1", + "gatt_client_write_long_value_of_characteristic_with_offset": "0x00008eb1", + "gatt_client_write_value_of_characteristic": "0x00008eed", + "gatt_client_write_value_of_characteristic_without_response": "0x00008f23", + "hci_add_event_handler": "0x0000a465", + "hci_power_control": "0x0000ac09", + "hci_register_acl_packet_handler": "0x0000adbd", + "kv_commit": "0x0000b56d", + "kv_get": "0x0000b5c9", + "kv_init": "0x0000b5d5", + "kv_init_backend": "0x0000b655", + "kv_put": "0x0000b669", + "kv_remove": "0x0000b675", + "kv_remove_all": "0x0000b6a9", + "kv_value_modified": "0x0000b6d9", + "kv_value_modified_of_key": "0x0000b6f5", + "kv_visit": "0x0000b701", + "l2cap_add_event_handler": "0x0000b791", + "l2cap_can_send_packet_now": "0x0000b7a1", + "l2cap_create_le_credit_based_connection_request": "0x0000b95d", + "l2cap_credit_based_send": "0x0000baa1", + "l2cap_credit_based_send_continue": "0x0000bacd", + "l2cap_disconnect": "0x0000bb49", + "l2cap_get_le_credit_based_connection_credits": "0x0000bd99", + "l2cap_get_peer_mtu_for_local_cid": "0x0000bdb5", + "l2cap_init": "0x0000c189", + "l2cap_le_send_flow_control_credit": "0x0000c27f", + "l2cap_max_le_mtu": "0x0000c589", + "l2cap_register_packet_handler": "0x0000c6b1", + "l2cap_register_service": "0x0000c6bd", + "l2cap_request_can_send_now_event": "0x0000c7cd", + "l2cap_request_connection_parameter_update": "0x0000c7e7", + "l2cap_send_echo_request": "0x0000ccc1", + "l2cap_unregister_service": "0x0000cd81", + "le_device_db_add": "0x0000cdd9", + "le_device_db_find": "0x0000ceb1", + "le_device_db_from_key": "0x0000cedd", + "le_device_db_iter_cur": "0x0000cee5", + "le_device_db_iter_cur_key": "0x0000cee9", + "le_device_db_iter_init": "0x0000ceed", + "le_device_db_iter_next": "0x0000cef5", + "le_device_db_remove_key": "0x0000cf1b", + "ll_aes_encrypt": "0x0000cf49", + "ll_config": "0x0000cfc5", + "ll_free": "0x0000cffb", + "ll_get_heap_free_size": "0x0000d005", + "ll_hint_on_ce_len": "0x0000d019", + "ll_legacy_adv_set_interval": "0x0000d051", + "ll_malloc": "0x0000d061", + "ll_query_timing_info": "0x0000d199", + "ll_register_hci_acl_previewer": "0x0000d1e5", + "ll_scan_set_fixed_channel": "0x0000d249", + "ll_set_adv_access_address": "0x0000d461", + "ll_set_adv_coded_scheme": "0x0000d46d", + "ll_set_conn_acl_report_latency": "0x0000d49d", + "ll_set_conn_coded_scheme": "0x0000d4cd", + "ll_set_conn_latency": "0x0000d4f9", + "ll_set_conn_tx_power": "0x0000d529", + "ll_set_def_antenna": "0x0000d571", + "ll_set_initiating_coded_scheme": "0x0000d58d", + "ll_set_max_conn_number": "0x0000d599", + "nibble_for_char": "0x0001e60d", + "platform_32k_rc_auto_tune": "0x0001e6a9", + "platform_32k_rc_tune": "0x0001e725", + "platform_calibrate_32k": "0x0001e739", + "platform_call_on_stack": "0x000040ef", + "platform_config": "0x0001e73d", + "platform_controller_run": "0x0001e861", + "platform_delete_timer": "0x0001e895", + "platform_enable_irq": "0x0001e89d", + "platform_get_gen_os_driver": "0x0001e8d5", + "platform_get_link_layer_interf": "0x0001e8e1", + "platform_get_task_handle": "0x0001e8e9", + "platform_get_timer_counter": "0x0001e901", + "platform_get_us_time": "0x0001e905", + "platform_get_version": "0x0001e909", + "platform_hrng": "0x0001e911", + "platform_init_controller": "0x0001e919", + "platform_os_idle_resumed_hook": "0x0001e935", + "platform_patch_rf_init_data": "0x0001e939", + "platform_post_sleep_processing": "0x0001e945", + "platform_pre_sleep_processing": "0x0001e94b", + "platform_pre_suppress_ticks_and_sleep_processing": "0x0001e951", + "platform_printf": "0x0001e955", + "platform_raise_assertion": "0x0001e969", + "platform_rand": "0x0001e97d", + "platform_read_info": "0x0001e981", + "platform_read_persistent_reg": "0x0001e9b1", + "platform_reset": "0x0001e9c1", + "platform_set_abs_timer": "0x0001e9e5", + "platform_set_evt_callback": "0x0001e9e9", + "platform_set_evt_callback_table": "0x0001e9fd", + "platform_set_irq_callback": "0x0001ea09", + "platform_set_irq_callback_table": "0x0001ea25", + "platform_set_rf_clk_source": "0x0001ea31", + "platform_set_rf_init_data": "0x0001ea3d", + "platform_set_rf_power_mapping": "0x0001ea49", + "platform_set_timer": "0x0001ea55", + "platform_shutdown": "0x0001ea59", + "platform_switch_app": "0x0001ea5d", + "platform_trace_raw": "0x0001ea89", + "platform_write_persistent_reg": "0x0001eaa1", + "printf_hexdump": "0x0001eab1", + "reverse_128": "0x0001ee29", + "reverse_24": "0x0001ee2f", + "reverse_256": "0x0001ee35", + "reverse_48": "0x0001ee3b", + "reverse_56": "0x0001ee41", + "reverse_64": "0x0001ee47", + "reverse_bd_addr": "0x0001ee4d", + "reverse_bytes": "0x0001ee53", + "sm_add_event_handler": "0x0001f141", + "sm_address_resolution_lookup": "0x0001f299", + "sm_authenticated": "0x0001f615", + "sm_authorization_decline": "0x0001f623", + "sm_authorization_grant": "0x0001f643", + "sm_authorization_state": "0x0001f663", + "sm_bonding_decline": "0x0001f67d", + "sm_config": "0x0001fad9", + "sm_config_conn": "0x0001faf1", + "sm_encryption_key_size": "0x0001fca7", + "sm_just_works_confirm": "0x0002022d", + "sm_le_device_key": "0x00020579", + "sm_passkey_input": "0x0002060f", + "sm_private_random_address_generation_get": "0x000209c9", + "sm_private_random_address_generation_get_mode": "0x000209d1", + "sm_private_random_address_generation_set_mode": "0x000209dd", + "sm_private_random_address_generation_set_update_period": "0x00020a05", + "sm_register_external_ltk_callback": "0x00020b41", + "sm_register_oob_data_callback": "0x00020b4d", + "sm_request_pairing": "0x00020b59", + "sm_send_security_request": "0x0002162f", + "sm_set_accepted_stk_generation_methods": "0x00021655", + "sm_set_authentication_requirements": "0x00021661", + "sm_set_encryption_key_size_range": "0x0002166d", + "sscanf_bd_addr": "0x000219c9", + "sysSetPublicDeviceAddr": "0x00021d7d", + "uuid128_to_str": "0x0002251d", + "uuid_add_bluetooth_prefix": "0x00022575", + "uuid_has_bluetooth_prefix": "0x00022595" } \ No newline at end of file diff --git a/bundles/noos_mass_conn/ING9188xx/meta.json b/bundles/noos_mass_conn/ING9188xx/meta.json index e34e4cdef..164ab842a 100644 --- a/bundles/noos_mass_conn/ING9188xx/meta.json +++ b/bundles/noos_mass_conn/ING9188xx/meta.json @@ -1,6 +1,6 @@ { "app": { - "base": 147456 + "base": 155648 }, "ram": { "base": 536870912, @@ -8,11 +8,11 @@ }, "rom": { "base": 16384, - "size": 131032 + "size": 131104 }, "version": [ 1, 9, - 38 + 39 ] } \ No newline at end of file diff --git a/bundles/noos_mass_conn/ING9188xx/platform.bin b/bundles/noos_mass_conn/ING9188xx/platform.bin index 2cd601e47b48fdb77aa4a7655f8fb4ceda0d52d2..953db23d4119fcb0c88b160573f77b45d1689285 100644 GIT binary patch delta 7023 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 TPc2JG>y{Qcb+V`a4rl%^2nB9L delta 6794 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 diff --git a/bundles/noos_mini/ING9187xx/apis.json b/bundles/noos_mini/ING9187xx/apis.json index 64fb1ed31..d61e08c57 100644 --- a/bundles/noos_mini/ING9187xx/apis.json +++ b/bundles/noos_mini/ING9187xx/apis.json @@ -1,251 +1,252 @@ { - "att_dispatch_client_can_send_now": "0x00005655", - "att_dispatch_client_request_can_send_now_event": "0x0000565b", - "att_dispatch_register_client": "0x00005661", - "att_dispatch_register_server": "0x00005675", - "att_dispatch_server_can_send_now": "0x00005689", - "att_dispatch_server_request_can_send_now_event": "0x0000568f", - "att_emit_general_event": "0x00005741", - "att_server_can_send_packet_now": "0x00005e6d", - "att_server_deferred_read_response": "0x00005e71", - "att_server_get_mtu": "0x00005e89", - "att_server_indicate": "0x00005ef5", - "att_server_init": "0x00005f79", - "att_server_notify": "0x00005fb5", - "att_server_register_packet_handler": "0x000060cd", - "att_server_request_can_send_now_event": "0x000060d9", - "att_set_db": "0x000060f5", - "att_set_read_callback": "0x00006109", - "att_set_write_callback": "0x00006115", - "bd_addr_cmp": "0x00006285", - "bd_addr_copy": "0x0000628b", - "bd_addr_to_str": "0x00006295", - "big_endian_read_16": "0x000062cd", - "big_endian_read_32": "0x000062d5", - "big_endian_store_16": "0x000062e9", - "big_endian_store_32": "0x000062f5", - "btstack_config": "0x0000642d", - "btstack_memory_pool_create": "0x0000657b", - "btstack_memory_pool_free": "0x000065a5", - "btstack_memory_pool_get": "0x00006605", - "btstack_push_user_msg": "0x0000664d", - "btstack_push_user_runnable": "0x00006659", - "btstack_reset": "0x00006665", - "char_for_nibble": "0x00006929", - "gap_add_dev_to_periodic_list": "0x000071c9", - "gap_add_whitelist": "0x000071d9", - "gap_aes_encrypt": "0x000071e5", - "gap_clear_white_lists": "0x0000721d", - "gap_clr_adv_set": "0x00007229", - "gap_clr_periodic_adv_list": "0x00007235", - "gap_create_connection_cancel": "0x00007241", - "gap_disconnect": "0x0000724d", - "gap_disconnect_all": "0x00007279", - "gap_ext_create_connection": "0x000072b9", - "gap_get_connection_parameter_range": "0x00007391", - "gap_le_read_channel_map": "0x000073c9", - "gap_periodic_adv_create_sync": "0x00007435", - "gap_periodic_adv_create_sync_cancel": "0x00007459", - "gap_periodic_adv_term_sync": "0x00007465", - "gap_read_periodic_adv_list_size": "0x000074ed", - "gap_read_phy": "0x000074f9", - "gap_read_remote_used_features": "0x00007505", - "gap_read_remote_version": "0x00007511", - "gap_read_rssi": "0x0000751d", - "gap_remove_whitelist": "0x00007529", - "gap_rmv_adv_set": "0x000075a5", - "gap_rmv_dev_from_periodic_list": "0x000075b1", - "gap_rx_test_v2": "0x000075c1", - "gap_set_adv_set_random_addr": "0x000075f9", - "gap_set_callback_for_next_hci": "0x00007635", - "gap_set_connection_parameter_range": "0x00007655", - "gap_set_data_length": "0x0000766d", - "gap_set_def_phy": "0x00007685", - "gap_set_ext_adv_data": "0x00007695", - "gap_set_ext_adv_enable": "0x000076ad", - "gap_set_ext_adv_para": "0x0000771d", - "gap_set_ext_scan_enable": "0x000077f5", - "gap_set_ext_scan_para": "0x0000780d", - "gap_set_ext_scan_response_data": "0x000078ad", - "gap_set_host_channel_classification": "0x000078c5", - "gap_set_periodic_adv_data": "0x000078d5", - "gap_set_periodic_adv_enable": "0x00007945", - "gap_set_periodic_adv_para": "0x00007955", - "gap_set_phy": "0x0000796d", - "gap_set_random_device_address": "0x00007989", - "gap_start_ccm": "0x000079b9", - "gap_test_end": "0x00007a01", - "gap_tx_test_v2": "0x00007a0d", - "gap_tx_test_v4": "0x00007a25", - "gap_update_connection_parameters": "0x00007a49", - "gap_vendor_tx_continuous_wave": "0x00007a89", - "gatt_client_cancel_write": "0x00007fb1", - "gatt_client_discover_characteristic_descriptors": "0x00007fd7", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x00008017", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x00008067", - "gatt_client_discover_characteristics_for_service": "0x000080b7", - "gatt_client_discover_primary_services": "0x000080ed", - "gatt_client_discover_primary_services_by_uuid128": "0x0000811f", - "gatt_client_discover_primary_services_by_uuid16": "0x00008163", - "gatt_client_execute_write": "0x0000819f", - "gatt_client_find_included_services_for_service": "0x000081c5", - "gatt_client_get_mtu": "0x000081f3", - "gatt_client_is_ready": "0x00008291", - "gatt_client_listen_for_characteristic_value_updates": "0x000082a7", - "gatt_client_prepare_write": "0x000082c7", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x00008303", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x0000832d", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008333", - "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x00008361", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x00008367", - "gatt_client_read_multiple_characteristic_values": "0x00008395", - "gatt_client_read_value_of_characteristic_using_value_handle": "0x000083c5", - "gatt_client_read_value_of_characteristics_by_uuid128": "0x000083f3", - "gatt_client_read_value_of_characteristics_by_uuid16": "0x0000843f", - "gatt_client_register_handler": "0x00008489", - "gatt_client_reliable_write_long_value_of_characteristic": "0x00008495", - "gatt_client_signed_write_without_response": "0x00008899", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x0000895d", - "gatt_client_write_client_characteristic_configuration": "0x00008997", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x000089e9", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x000089f9", - "gatt_client_write_long_value_of_characteristic": "0x00008a35", - "gatt_client_write_long_value_of_characteristic_with_offset": "0x00008a45", - "gatt_client_write_value_of_characteristic": "0x00008a81", - "gatt_client_write_value_of_characteristic_without_response": "0x00008ab7", - "hci_add_event_handler": "0x00009fd1", - "hci_power_control": "0x0000a759", - "hci_register_acl_packet_handler": "0x0000a90d", - "kv_commit": "0x0000b09d", - "kv_get": "0x0000b0f9", - "kv_init": "0x0000b105", - "kv_init_backend": "0x0000b181", - "kv_put": "0x0000b195", - "kv_remove": "0x0000b1a1", - "kv_remove_all": "0x0000b1d5", - "kv_value_modified": "0x0000b205", - "kv_value_modified_of_key": "0x0000b221", - "kv_visit": "0x0000b22d", - "l2cap_add_event_handler": "0x0000b2bd", - "l2cap_can_send_packet_now": "0x0000b2cd", - "l2cap_create_le_credit_based_connection_request": "0x0000b489", - "l2cap_credit_based_send": "0x0000b5cd", - "l2cap_credit_based_send_continue": "0x0000b5f9", - "l2cap_disconnect": "0x0000b675", - "l2cap_get_le_credit_based_connection_credits": "0x0000b8c5", - "l2cap_get_peer_mtu_for_local_cid": "0x0000b8e1", - "l2cap_init": "0x0000bcb5", - "l2cap_le_send_flow_control_credit": "0x0000bdab", - "l2cap_max_le_mtu": "0x0000c0b5", - "l2cap_register_packet_handler": "0x0000c1dd", - "l2cap_register_service": "0x0000c1e9", - "l2cap_request_can_send_now_event": "0x0000c2f9", - "l2cap_request_connection_parameter_update": "0x0000c313", - "l2cap_send_echo_request": "0x0000c7ed", - "l2cap_unregister_service": "0x0000c8ad", - "le_device_db_add": "0x0000c905", - "le_device_db_find": "0x0000c9cd", - "le_device_db_from_key": "0x0000c9f9", - "le_device_db_iter_cur": "0x0000ca01", - "le_device_db_iter_cur_key": "0x0000ca05", - "le_device_db_iter_init": "0x0000ca09", - "le_device_db_iter_next": "0x0000ca11", - "le_device_db_remove_key": "0x0000ca37", - "ll_aes_encrypt": "0x0000ca65", - "ll_config": "0x0000cae1", - "ll_free": "0x0000cb17", - "ll_get_heap_free_size": "0x0000cb21", - "ll_hint_on_ce_len": "0x0000cb35", - "ll_legacy_adv_set_interval": "0x0000cb6d", - "ll_malloc": "0x0000cb7d", - "ll_query_timing_info": "0x0000ccb5", - "ll_register_hci_acl_previewer": "0x0000cd01", - "ll_scan_set_fixed_channel": "0x0000cd65", - "ll_set_adv_access_address": "0x0000cf7d", - "ll_set_adv_coded_scheme": "0x0000cf89", - "ll_set_conn_acl_report_latency": "0x0000cfb1", - "ll_set_conn_coded_scheme": "0x0000cfdd", - "ll_set_conn_latency": "0x0000d005", - "ll_set_conn_tx_power": "0x0000d031", - "ll_set_def_antenna": "0x0000d075", - "ll_set_initiating_coded_scheme": "0x0000d091", - "ll_set_max_conn_number": "0x0000d09d", - "nibble_for_char": "0x0001d105", - "platform_32k_rc_auto_tune": "0x0001d195", - "platform_32k_rc_tune": "0x0001d211", - "platform_calibrate_32k": "0x0001d225", - "platform_config": "0x0001d229", - "platform_controller_run": "0x0001d34d", - "platform_delete_timer": "0x0001d381", - "platform_enable_irq": "0x0001d389", - "platform_get_gen_os_driver": "0x0001d3c1", - "platform_get_link_layer_interf": "0x0001d3cd", - "platform_get_task_handle": "0x0001d3d5", - "platform_get_timer_counter": "0x0001d3ed", - "platform_get_us_time": "0x0001d3f1", - "platform_get_version": "0x0001d3f5", - "platform_hrng": "0x0001d3fd", - "platform_init_controller": "0x0001d405", - "platform_os_idle_resumed_hook": "0x0001d421", - "platform_patch_rf_init_data": "0x0001d425", - "platform_post_sleep_processing": "0x0001d431", - "platform_pre_sleep_processing": "0x0001d437", - "platform_pre_suppress_ticks_and_sleep_processing": "0x0001d43d", - "platform_printf": "0x0001d441", - "platform_raise_assertion": "0x0001d455", - "platform_rand": "0x0001d469", - "platform_read_info": "0x0001d46d", - "platform_read_persistent_reg": "0x0001d49d", - "platform_reset": "0x0001d4ad", - "platform_set_abs_timer": "0x0001d4d1", - "platform_set_evt_callback": "0x0001d4d5", - "platform_set_evt_callback_table": "0x0001d4e9", - "platform_set_irq_callback": "0x0001d4f5", - "platform_set_irq_callback_table": "0x0001d511", - "platform_set_rf_clk_source": "0x0001d51d", - "platform_set_rf_init_data": "0x0001d529", - "platform_set_rf_power_mapping": "0x0001d535", - "platform_set_timer": "0x0001d541", - "platform_shutdown": "0x0001d545", - "platform_switch_app": "0x0001d549", - "platform_trace_raw": "0x0001d575", - "platform_write_persistent_reg": "0x0001d58d", - "printf_hexdump": "0x0001d59d", - "reverse_128": "0x0001d8d5", - "reverse_24": "0x0001d8db", - "reverse_256": "0x0001d8e1", - "reverse_48": "0x0001d8e7", - "reverse_56": "0x0001d8ed", - "reverse_64": "0x0001d8f3", - "reverse_bd_addr": "0x0001d8f9", - "reverse_bytes": "0x0001d8ff", - "sm_add_event_handler": "0x0001da9d", - "sm_address_resolution_lookup": "0x0001dbf5", - "sm_authenticated": "0x0001df71", - "sm_authorization_decline": "0x0001df7f", - "sm_authorization_grant": "0x0001df9f", - "sm_authorization_state": "0x0001dfbf", - "sm_bonding_decline": "0x0001dfd9", - "sm_config": "0x0001e435", - "sm_config_conn": "0x0001e44d", - "sm_encryption_key_size": "0x0001e603", - "sm_just_works_confirm": "0x0001eb89", - "sm_le_device_key": "0x0001eed5", - "sm_passkey_input": "0x0001ef6b", - "sm_private_random_address_generation_get": "0x0001f325", - "sm_private_random_address_generation_get_mode": "0x0001f32d", - "sm_private_random_address_generation_set_mode": "0x0001f339", - "sm_private_random_address_generation_set_update_period": "0x0001f361", - "sm_register_external_ltk_callback": "0x0001f49d", - "sm_register_oob_data_callback": "0x0001f4a9", - "sm_request_pairing": "0x0001f4b5", - "sm_send_security_request": "0x0001ff8b", - "sm_set_accepted_stk_generation_methods": "0x0001ffb1", - "sm_set_authentication_requirements": "0x0001ffbd", - "sm_set_encryption_key_size_range": "0x0001ffc9", - "sscanf_bd_addr": "0x00020325", - "sysSetPublicDeviceAddr": "0x000206d9", - "uuid128_to_str": "0x00020ce5", - "uuid_add_bluetooth_prefix": "0x00020d3d", - "uuid_has_bluetooth_prefix": "0x00020d5d" + "att_dispatch_client_can_send_now": "0x0000569d", + "att_dispatch_client_request_can_send_now_event": "0x000056a3", + "att_dispatch_register_client": "0x000056a9", + "att_dispatch_register_server": "0x000056bd", + "att_dispatch_server_can_send_now": "0x000056d1", + "att_dispatch_server_request_can_send_now_event": "0x000056d7", + "att_emit_general_event": "0x00005789", + "att_server_can_send_packet_now": "0x00005eb5", + "att_server_deferred_read_response": "0x00005eb9", + "att_server_get_mtu": "0x00005ed1", + "att_server_indicate": "0x00005f3d", + "att_server_init": "0x00005fc1", + "att_server_notify": "0x00005ffd", + "att_server_register_packet_handler": "0x00006115", + "att_server_request_can_send_now_event": "0x00006121", + "att_set_db": "0x0000613d", + "att_set_read_callback": "0x00006151", + "att_set_write_callback": "0x0000615d", + "bd_addr_cmp": "0x000062cd", + "bd_addr_copy": "0x000062d3", + "bd_addr_to_str": "0x000062dd", + "big_endian_read_16": "0x00006315", + "big_endian_read_32": "0x0000631d", + "big_endian_store_16": "0x00006331", + "big_endian_store_32": "0x0000633d", + "btstack_config": "0x00006475", + "btstack_memory_pool_create": "0x000065c3", + "btstack_memory_pool_free": "0x000065ed", + "btstack_memory_pool_get": "0x0000664d", + "btstack_push_user_msg": "0x00006695", + "btstack_push_user_runnable": "0x000066a1", + "btstack_reset": "0x000066ad", + "char_for_nibble": "0x00006971", + "gap_add_dev_to_periodic_list": "0x00007211", + "gap_add_whitelist": "0x00007221", + "gap_aes_encrypt": "0x0000722d", + "gap_clear_white_lists": "0x00007265", + "gap_clr_adv_set": "0x00007271", + "gap_clr_periodic_adv_list": "0x0000727d", + "gap_create_connection_cancel": "0x00007289", + "gap_disconnect": "0x00007295", + "gap_disconnect_all": "0x000072c1", + "gap_ext_create_connection": "0x00007301", + "gap_get_connection_parameter_range": "0x000073d9", + "gap_le_read_channel_map": "0x00007411", + "gap_periodic_adv_create_sync": "0x0000747d", + "gap_periodic_adv_create_sync_cancel": "0x000074a1", + "gap_periodic_adv_term_sync": "0x000074ad", + "gap_read_periodic_adv_list_size": "0x00007535", + "gap_read_phy": "0x00007541", + "gap_read_remote_used_features": "0x0000754d", + "gap_read_remote_version": "0x00007559", + "gap_read_rssi": "0x00007565", + "gap_remove_whitelist": "0x00007571", + "gap_rmv_adv_set": "0x000075ed", + "gap_rmv_dev_from_periodic_list": "0x000075f9", + "gap_rx_test_v2": "0x00007609", + "gap_set_adv_set_random_addr": "0x00007641", + "gap_set_callback_for_next_hci": "0x0000767d", + "gap_set_connection_parameter_range": "0x0000769d", + "gap_set_data_length": "0x000076b5", + "gap_set_def_phy": "0x000076cd", + "gap_set_ext_adv_data": "0x000076dd", + "gap_set_ext_adv_enable": "0x000076f5", + "gap_set_ext_adv_para": "0x00007765", + "gap_set_ext_scan_enable": "0x0000783d", + "gap_set_ext_scan_para": "0x00007855", + "gap_set_ext_scan_response_data": "0x000078f5", + "gap_set_host_channel_classification": "0x0000790d", + "gap_set_periodic_adv_data": "0x0000791d", + "gap_set_periodic_adv_enable": "0x0000798d", + "gap_set_periodic_adv_para": "0x0000799d", + "gap_set_phy": "0x000079b5", + "gap_set_random_device_address": "0x000079d1", + "gap_start_ccm": "0x00007a01", + "gap_test_end": "0x00007a49", + "gap_tx_test_v2": "0x00007a55", + "gap_tx_test_v4": "0x00007a6d", + "gap_update_connection_parameters": "0x00007a91", + "gap_vendor_tx_continuous_wave": "0x00007ad1", + "gatt_client_cancel_write": "0x00007ff9", + "gatt_client_discover_characteristic_descriptors": "0x0000801f", + "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x0000805f", + "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x000080af", + "gatt_client_discover_characteristics_for_service": "0x000080ff", + "gatt_client_discover_primary_services": "0x00008135", + "gatt_client_discover_primary_services_by_uuid128": "0x00008167", + "gatt_client_discover_primary_services_by_uuid16": "0x000081ab", + "gatt_client_execute_write": "0x000081e7", + "gatt_client_find_included_services_for_service": "0x0000820d", + "gatt_client_get_mtu": "0x0000823b", + "gatt_client_is_ready": "0x000082d9", + "gatt_client_listen_for_characteristic_value_updates": "0x000082ef", + "gatt_client_prepare_write": "0x0000830f", + "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x0000834b", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x00008375", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x0000837b", + "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x000083a9", + "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x000083af", + "gatt_client_read_multiple_characteristic_values": "0x000083dd", + "gatt_client_read_value_of_characteristic_using_value_handle": "0x0000840d", + "gatt_client_read_value_of_characteristics_by_uuid128": "0x0000843b", + "gatt_client_read_value_of_characteristics_by_uuid16": "0x00008487", + "gatt_client_register_handler": "0x000084d1", + "gatt_client_reliable_write_long_value_of_characteristic": "0x000084dd", + "gatt_client_signed_write_without_response": "0x000088e1", + "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x000089a5", + "gatt_client_write_client_characteristic_configuration": "0x000089df", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x00008a31", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008a41", + "gatt_client_write_long_value_of_characteristic": "0x00008a7d", + "gatt_client_write_long_value_of_characteristic_with_offset": "0x00008a8d", + "gatt_client_write_value_of_characteristic": "0x00008ac9", + "gatt_client_write_value_of_characteristic_without_response": "0x00008aff", + "hci_add_event_handler": "0x0000a019", + "hci_power_control": "0x0000a7a1", + "hci_register_acl_packet_handler": "0x0000a955", + "kv_commit": "0x0000b0e5", + "kv_get": "0x0000b141", + "kv_init": "0x0000b14d", + "kv_init_backend": "0x0000b1c9", + "kv_put": "0x0000b1dd", + "kv_remove": "0x0000b1e9", + "kv_remove_all": "0x0000b21d", + "kv_value_modified": "0x0000b24d", + "kv_value_modified_of_key": "0x0000b269", + "kv_visit": "0x0000b275", + "l2cap_add_event_handler": "0x0000b305", + "l2cap_can_send_packet_now": "0x0000b315", + "l2cap_create_le_credit_based_connection_request": "0x0000b4d1", + "l2cap_credit_based_send": "0x0000b615", + "l2cap_credit_based_send_continue": "0x0000b641", + "l2cap_disconnect": "0x0000b6bd", + "l2cap_get_le_credit_based_connection_credits": "0x0000b90d", + "l2cap_get_peer_mtu_for_local_cid": "0x0000b929", + "l2cap_init": "0x0000bcfd", + "l2cap_le_send_flow_control_credit": "0x0000bdf3", + "l2cap_max_le_mtu": "0x0000c0fd", + "l2cap_register_packet_handler": "0x0000c225", + "l2cap_register_service": "0x0000c231", + "l2cap_request_can_send_now_event": "0x0000c341", + "l2cap_request_connection_parameter_update": "0x0000c35b", + "l2cap_send_echo_request": "0x0000c835", + "l2cap_unregister_service": "0x0000c8f5", + "le_device_db_add": "0x0000c94d", + "le_device_db_find": "0x0000ca15", + "le_device_db_from_key": "0x0000ca41", + "le_device_db_iter_cur": "0x0000ca49", + "le_device_db_iter_cur_key": "0x0000ca4d", + "le_device_db_iter_init": "0x0000ca51", + "le_device_db_iter_next": "0x0000ca59", + "le_device_db_remove_key": "0x0000ca7f", + "ll_aes_encrypt": "0x0000caad", + "ll_config": "0x0000cb29", + "ll_free": "0x0000cb5f", + "ll_get_heap_free_size": "0x0000cb69", + "ll_hint_on_ce_len": "0x0000cb7d", + "ll_legacy_adv_set_interval": "0x0000cbb5", + "ll_malloc": "0x0000cbc5", + "ll_query_timing_info": "0x0000ccfd", + "ll_register_hci_acl_previewer": "0x0000cd49", + "ll_scan_set_fixed_channel": "0x0000cdad", + "ll_set_adv_access_address": "0x0000cfc5", + "ll_set_adv_coded_scheme": "0x0000cfd1", + "ll_set_conn_acl_report_latency": "0x0000cff9", + "ll_set_conn_coded_scheme": "0x0000d025", + "ll_set_conn_latency": "0x0000d04d", + "ll_set_conn_tx_power": "0x0000d079", + "ll_set_def_antenna": "0x0000d0bd", + "ll_set_initiating_coded_scheme": "0x0000d0d9", + "ll_set_max_conn_number": "0x0000d0e5", + "nibble_for_char": "0x0001d14d", + "platform_32k_rc_auto_tune": "0x0001d1dd", + "platform_32k_rc_tune": "0x0001d259", + "platform_calibrate_32k": "0x0001d26d", + "platform_call_on_stack": "0x000040ef", + "platform_config": "0x0001d271", + "platform_controller_run": "0x0001d395", + "platform_delete_timer": "0x0001d3c9", + "platform_enable_irq": "0x0001d3d1", + "platform_get_gen_os_driver": "0x0001d409", + "platform_get_link_layer_interf": "0x0001d415", + "platform_get_task_handle": "0x0001d41d", + "platform_get_timer_counter": "0x0001d435", + "platform_get_us_time": "0x0001d439", + "platform_get_version": "0x0001d43d", + "platform_hrng": "0x0001d445", + "platform_init_controller": "0x0001d44d", + "platform_os_idle_resumed_hook": "0x0001d469", + "platform_patch_rf_init_data": "0x0001d46d", + "platform_post_sleep_processing": "0x0001d479", + "platform_pre_sleep_processing": "0x0001d47f", + "platform_pre_suppress_ticks_and_sleep_processing": "0x0001d485", + "platform_printf": "0x0001d489", + "platform_raise_assertion": "0x0001d49d", + "platform_rand": "0x0001d4b1", + "platform_read_info": "0x0001d4b5", + "platform_read_persistent_reg": "0x0001d4e5", + "platform_reset": "0x0001d4f5", + "platform_set_abs_timer": "0x0001d519", + "platform_set_evt_callback": "0x0001d51d", + "platform_set_evt_callback_table": "0x0001d531", + "platform_set_irq_callback": "0x0001d53d", + "platform_set_irq_callback_table": "0x0001d559", + "platform_set_rf_clk_source": "0x0001d565", + "platform_set_rf_init_data": "0x0001d571", + "platform_set_rf_power_mapping": "0x0001d57d", + "platform_set_timer": "0x0001d589", + "platform_shutdown": "0x0001d58d", + "platform_switch_app": "0x0001d591", + "platform_trace_raw": "0x0001d5bd", + "platform_write_persistent_reg": "0x0001d5d5", + "printf_hexdump": "0x0001d5e5", + "reverse_128": "0x0001d91d", + "reverse_24": "0x0001d923", + "reverse_256": "0x0001d929", + "reverse_48": "0x0001d92f", + "reverse_56": "0x0001d935", + "reverse_64": "0x0001d93b", + "reverse_bd_addr": "0x0001d941", + "reverse_bytes": "0x0001d947", + "sm_add_event_handler": "0x0001dae5", + "sm_address_resolution_lookup": "0x0001dc3d", + "sm_authenticated": "0x0001dfb9", + "sm_authorization_decline": "0x0001dfc7", + "sm_authorization_grant": "0x0001dfe7", + "sm_authorization_state": "0x0001e007", + "sm_bonding_decline": "0x0001e021", + "sm_config": "0x0001e47d", + "sm_config_conn": "0x0001e495", + "sm_encryption_key_size": "0x0001e64b", + "sm_just_works_confirm": "0x0001ebd1", + "sm_le_device_key": "0x0001ef1d", + "sm_passkey_input": "0x0001efb3", + "sm_private_random_address_generation_get": "0x0001f36d", + "sm_private_random_address_generation_get_mode": "0x0001f375", + "sm_private_random_address_generation_set_mode": "0x0001f381", + "sm_private_random_address_generation_set_update_period": "0x0001f3a9", + "sm_register_external_ltk_callback": "0x0001f4e5", + "sm_register_oob_data_callback": "0x0001f4f1", + "sm_request_pairing": "0x0001f4fd", + "sm_send_security_request": "0x0001ffd3", + "sm_set_accepted_stk_generation_methods": "0x0001fff9", + "sm_set_authentication_requirements": "0x00020005", + "sm_set_encryption_key_size_range": "0x00020011", + "sscanf_bd_addr": "0x0002036d", + "sysSetPublicDeviceAddr": "0x00020721", + "uuid128_to_str": "0x00020d2d", + "uuid_add_bluetooth_prefix": "0x00020d85", + "uuid_has_bluetooth_prefix": "0x00020da5" } \ No newline at end of file diff --git a/bundles/noos_mini/ING9187xx/meta.json b/bundles/noos_mini/ING9187xx/meta.json index 544d71661..32442a8dd 100644 --- a/bundles/noos_mini/ING9187xx/meta.json +++ b/bundles/noos_mini/ING9187xx/meta.json @@ -8,11 +8,11 @@ }, "rom": { "base": 16384, - "size": 124432 + "size": 124504 }, "version": [ 1, 9, - 38 + 39 ] } \ No newline at end of file diff --git a/bundles/noos_mini/ING9187xx/platform.bin b/bundles/noos_mini/ING9187xx/platform.bin index a69c3fd0ed5b5ad8a70121a06b716f3ae4eb6b9c..e7710dd49bc28ecbff3e585f6eadaffdc2f0306b 100644 GIT binary patch delta 6337 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 an?0HKxm)dX%aSq&X1eE2HL}0tjQ<6ZHnPtE diff --git a/bundles/noos_mini/ING9188xx/apis.json b/bundles/noos_mini/ING9188xx/apis.json index 788049f16..f07fd5340 100644 --- a/bundles/noos_mini/ING9188xx/apis.json +++ b/bundles/noos_mini/ING9188xx/apis.json @@ -1,265 +1,266 @@ { - "att_dispatch_client_can_send_now": "0x00005779", - "att_dispatch_client_request_can_send_now_event": "0x0000577f", - "att_dispatch_register_client": "0x00005785", - "att_dispatch_register_server": "0x00005799", - "att_dispatch_server_can_send_now": "0x000057ad", - "att_dispatch_server_request_can_send_now_event": "0x000057b3", - "att_emit_general_event": "0x00005865", - "att_server_can_send_packet_now": "0x00005f91", - "att_server_deferred_read_response": "0x00005f95", - "att_server_get_mtu": "0x00005fad", - "att_server_indicate": "0x00006019", - "att_server_init": "0x0000609d", - "att_server_notify": "0x000060d9", - "att_server_register_packet_handler": "0x000061f1", - "att_server_request_can_send_now_event": "0x000061fd", - "att_set_db": "0x00006219", - "att_set_read_callback": "0x0000622d", - "att_set_write_callback": "0x00006239", - "bd_addr_cmp": "0x000063a9", - "bd_addr_copy": "0x000063af", - "bd_addr_to_str": "0x000063b9", - "big_endian_read_16": "0x000063f1", - "big_endian_read_32": "0x000063f9", - "big_endian_store_16": "0x0000640d", - "big_endian_store_32": "0x00006419", - "btstack_config": "0x00006551", - "btstack_memory_pool_create": "0x0000669f", - "btstack_memory_pool_free": "0x000066c9", - "btstack_memory_pool_get": "0x00006729", - "btstack_push_user_msg": "0x00006771", - "btstack_push_user_runnable": "0x0000677d", - "btstack_reset": "0x00006789", - "char_for_nibble": "0x00006a4d", - "gap_add_dev_to_periodic_list": "0x0000735d", - "gap_add_whitelist": "0x0000736d", - "gap_aes_encrypt": "0x00007379", - "gap_clear_white_lists": "0x000073b1", - "gap_clr_adv_set": "0x000073bd", - "gap_clr_periodic_adv_list": "0x000073c9", - "gap_create_connection_cancel": "0x000073d5", - "gap_default_periodic_adv_sync_transfer_param": "0x000073e1", - "gap_disconnect": "0x000073f9", - "gap_disconnect_all": "0x00007425", - "gap_ext_create_connection": "0x00007465", - "gap_get_connection_parameter_range": "0x0000753d", - "gap_le_read_channel_map": "0x00007575", - "gap_periodic_adv_create_sync": "0x000075e1", - "gap_periodic_adv_create_sync_cancel": "0x00007605", - "gap_periodic_adv_set_info_transfer": "0x00007611", - "gap_periodic_adv_sync_transfer": "0x00007621", - "gap_periodic_adv_sync_transfer_param": "0x00007631", - "gap_periodic_adv_term_sync": "0x0000764d", - "gap_read_antenna_info": "0x000076d5", - "gap_read_periodic_adv_list_size": "0x000076e1", - "gap_read_phy": "0x000076ed", - "gap_read_remote_used_features": "0x000076f9", - "gap_read_remote_version": "0x00007705", - "gap_read_rssi": "0x00007711", - "gap_remove_whitelist": "0x0000771d", - "gap_rmv_adv_set": "0x00007799", - "gap_rmv_dev_from_periodic_list": "0x000077a5", - "gap_rx_test_v2": "0x000077b5", - "gap_rx_test_v3": "0x000077c5", - "gap_set_adv_set_random_addr": "0x00007811", - "gap_set_callback_for_next_hci": "0x0000784d", - "gap_set_connection_cte_request_enable": "0x0000786d", - "gap_set_connection_cte_response_enable": "0x00007889", - "gap_set_connection_cte_rx_param": "0x00007899", - "gap_set_connection_cte_tx_param": "0x000078ed", - "gap_set_connection_parameter_range": "0x00007939", - "gap_set_connectionless_cte_tx_enable": "0x00007951", - "gap_set_connectionless_cte_tx_param": "0x00007961", - "gap_set_connectionless_iq_sampling_enable": "0x000079bd", - "gap_set_data_length": "0x00007a19", - "gap_set_def_phy": "0x00007a31", - "gap_set_ext_adv_data": "0x00007a41", - "gap_set_ext_adv_enable": "0x00007a59", - "gap_set_ext_adv_para": "0x00007ac9", - "gap_set_ext_scan_enable": "0x00007ba1", - "gap_set_ext_scan_para": "0x00007bb9", - "gap_set_ext_scan_response_data": "0x00007c59", - "gap_set_host_channel_classification": "0x00007c71", - "gap_set_periodic_adv_data": "0x00007c81", - "gap_set_periodic_adv_enable": "0x00007cf1", - "gap_set_periodic_adv_para": "0x00007d01", - "gap_set_periodic_adv_rx_enable": "0x00007d19", - "gap_set_phy": "0x00007d29", - "gap_set_random_device_address": "0x00007d45", - "gap_start_ccm": "0x00007d75", - "gap_test_end": "0x00007dbd", - "gap_tx_test_v2": "0x00007dc9", - "gap_tx_test_v4": "0x00007de1", - "gap_update_connection_parameters": "0x00007e05", - "gap_vendor_tx_continuous_wave": "0x00007e45", - "gatt_client_cancel_write": "0x0000836d", - "gatt_client_discover_characteristic_descriptors": "0x00008393", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x000083d3", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x00008423", - "gatt_client_discover_characteristics_for_service": "0x00008473", - "gatt_client_discover_primary_services": "0x000084a9", - "gatt_client_discover_primary_services_by_uuid128": "0x000084db", - "gatt_client_discover_primary_services_by_uuid16": "0x0000851f", - "gatt_client_execute_write": "0x0000855b", - "gatt_client_find_included_services_for_service": "0x00008581", - "gatt_client_get_mtu": "0x000085af", - "gatt_client_is_ready": "0x0000864d", - "gatt_client_listen_for_characteristic_value_updates": "0x00008663", - "gatt_client_prepare_write": "0x00008683", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x000086bf", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x000086e9", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x000086ef", - "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x0000871d", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x00008723", - "gatt_client_read_multiple_characteristic_values": "0x00008751", - "gatt_client_read_value_of_characteristic_using_value_handle": "0x00008781", - "gatt_client_read_value_of_characteristics_by_uuid128": "0x000087af", - "gatt_client_read_value_of_characteristics_by_uuid16": "0x000087fb", - "gatt_client_register_handler": "0x00008845", - "gatt_client_reliable_write_long_value_of_characteristic": "0x00008851", - "gatt_client_signed_write_without_response": "0x00008c55", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x00008d19", - "gatt_client_write_client_characteristic_configuration": "0x00008d53", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x00008da5", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008db5", - "gatt_client_write_long_value_of_characteristic": "0x00008df1", - "gatt_client_write_long_value_of_characteristic_with_offset": "0x00008e01", - "gatt_client_write_value_of_characteristic": "0x00008e3d", - "gatt_client_write_value_of_characteristic_without_response": "0x00008e73", - "hci_add_event_handler": "0x0000a3a9", - "hci_power_control": "0x0000ab31", - "hci_register_acl_packet_handler": "0x0000ace5", - "kv_commit": "0x0000b475", - "kv_get": "0x0000b4d1", - "kv_init": "0x0000b4dd", - "kv_init_backend": "0x0000b559", - "kv_put": "0x0000b56d", - "kv_remove": "0x0000b579", - "kv_remove_all": "0x0000b5ad", - "kv_value_modified": "0x0000b5dd", - "kv_value_modified_of_key": "0x0000b5f9", - "kv_visit": "0x0000b605", - "l2cap_add_event_handler": "0x0000b695", - "l2cap_can_send_packet_now": "0x0000b6a5", - "l2cap_create_le_credit_based_connection_request": "0x0000b861", - "l2cap_credit_based_send": "0x0000b9a5", - "l2cap_credit_based_send_continue": "0x0000b9d1", - "l2cap_disconnect": "0x0000ba4d", - "l2cap_get_le_credit_based_connection_credits": "0x0000bc9d", - "l2cap_get_peer_mtu_for_local_cid": "0x0000bcb9", - "l2cap_init": "0x0000c08d", - "l2cap_le_send_flow_control_credit": "0x0000c183", - "l2cap_max_le_mtu": "0x0000c48d", - "l2cap_register_packet_handler": "0x0000c5b5", - "l2cap_register_service": "0x0000c5c1", - "l2cap_request_can_send_now_event": "0x0000c6d1", - "l2cap_request_connection_parameter_update": "0x0000c6eb", - "l2cap_send_echo_request": "0x0000cbc5", - "l2cap_unregister_service": "0x0000cc85", - "le_device_db_add": "0x0000ccdd", - "le_device_db_find": "0x0000cda5", - "le_device_db_from_key": "0x0000cdd1", - "le_device_db_iter_cur": "0x0000cdd9", - "le_device_db_iter_cur_key": "0x0000cddd", - "le_device_db_iter_init": "0x0000cde1", - "le_device_db_iter_next": "0x0000cde9", - "le_device_db_remove_key": "0x0000ce0f", - "ll_aes_encrypt": "0x0000ce3d", - "ll_config": "0x0000ceb9", - "ll_free": "0x0000ceef", - "ll_get_heap_free_size": "0x0000cef9", - "ll_hint_on_ce_len": "0x0000cf0d", - "ll_legacy_adv_set_interval": "0x0000cf45", - "ll_malloc": "0x0000cf55", - "ll_query_timing_info": "0x0000d08d", - "ll_register_hci_acl_previewer": "0x0000d0d9", - "ll_scan_set_fixed_channel": "0x0000d13d", - "ll_set_adv_access_address": "0x0000d355", - "ll_set_adv_coded_scheme": "0x0000d361", - "ll_set_conn_acl_report_latency": "0x0000d389", - "ll_set_conn_coded_scheme": "0x0000d3b5", - "ll_set_conn_latency": "0x0000d3dd", - "ll_set_conn_tx_power": "0x0000d409", - "ll_set_def_antenna": "0x0000d44d", - "ll_set_initiating_coded_scheme": "0x0000d469", - "ll_set_max_conn_number": "0x0000d475", - "nibble_for_char": "0x0001e3b1", - "platform_32k_rc_auto_tune": "0x0001e441", - "platform_32k_rc_tune": "0x0001e4bd", - "platform_calibrate_32k": "0x0001e4d1", - "platform_config": "0x0001e4d5", - "platform_controller_run": "0x0001e5f9", - "platform_delete_timer": "0x0001e62d", - "platform_enable_irq": "0x0001e635", - "platform_get_gen_os_driver": "0x0001e66d", - "platform_get_link_layer_interf": "0x0001e679", - "platform_get_task_handle": "0x0001e681", - "platform_get_timer_counter": "0x0001e699", - "platform_get_us_time": "0x0001e69d", - "platform_get_version": "0x0001e6a1", - "platform_hrng": "0x0001e6a9", - "platform_init_controller": "0x0001e6b1", - "platform_os_idle_resumed_hook": "0x0001e6cd", - "platform_patch_rf_init_data": "0x0001e6d1", - "platform_post_sleep_processing": "0x0001e6dd", - "platform_pre_sleep_processing": "0x0001e6e3", - "platform_pre_suppress_ticks_and_sleep_processing": "0x0001e6e9", - "platform_printf": "0x0001e6ed", - "platform_raise_assertion": "0x0001e701", - "platform_rand": "0x0001e715", - "platform_read_info": "0x0001e719", - "platform_read_persistent_reg": "0x0001e749", - "platform_reset": "0x0001e759", - "platform_set_abs_timer": "0x0001e77d", - "platform_set_evt_callback": "0x0001e781", - "platform_set_evt_callback_table": "0x0001e795", - "platform_set_irq_callback": "0x0001e7a1", - "platform_set_irq_callback_table": "0x0001e7bd", - "platform_set_rf_clk_source": "0x0001e7c9", - "platform_set_rf_init_data": "0x0001e7d5", - "platform_set_rf_power_mapping": "0x0001e7e1", - "platform_set_timer": "0x0001e7ed", - "platform_shutdown": "0x0001e7f1", - "platform_switch_app": "0x0001e7f5", - "platform_trace_raw": "0x0001e821", - "platform_write_persistent_reg": "0x0001e839", - "printf_hexdump": "0x0001e849", - "reverse_128": "0x0001ebb9", - "reverse_24": "0x0001ebbf", - "reverse_256": "0x0001ebc5", - "reverse_48": "0x0001ebcb", - "reverse_56": "0x0001ebd1", - "reverse_64": "0x0001ebd7", - "reverse_bd_addr": "0x0001ebdd", - "reverse_bytes": "0x0001ebe3", - "sm_add_event_handler": "0x0001eed1", - "sm_address_resolution_lookup": "0x0001f029", - "sm_authenticated": "0x0001f3a5", - "sm_authorization_decline": "0x0001f3b3", - "sm_authorization_grant": "0x0001f3d3", - "sm_authorization_state": "0x0001f3f3", - "sm_bonding_decline": "0x0001f40d", - "sm_config": "0x0001f869", - "sm_config_conn": "0x0001f881", - "sm_encryption_key_size": "0x0001fa37", - "sm_just_works_confirm": "0x0001ffbd", - "sm_le_device_key": "0x00020309", - "sm_passkey_input": "0x0002039f", - "sm_private_random_address_generation_get": "0x00020759", - "sm_private_random_address_generation_get_mode": "0x00020761", - "sm_private_random_address_generation_set_mode": "0x0002076d", - "sm_private_random_address_generation_set_update_period": "0x00020795", - "sm_register_external_ltk_callback": "0x000208d1", - "sm_register_oob_data_callback": "0x000208dd", - "sm_request_pairing": "0x000208e9", - "sm_send_security_request": "0x000213bf", - "sm_set_accepted_stk_generation_methods": "0x000213e5", - "sm_set_authentication_requirements": "0x000213f1", - "sm_set_encryption_key_size_range": "0x000213fd", - "sscanf_bd_addr": "0x00021759", - "sysSetPublicDeviceAddr": "0x00021b0d", - "uuid128_to_str": "0x000222ad", - "uuid_add_bluetooth_prefix": "0x00022305", - "uuid_has_bluetooth_prefix": "0x00022325" + "att_dispatch_client_can_send_now": "0x000057c1", + "att_dispatch_client_request_can_send_now_event": "0x000057c7", + "att_dispatch_register_client": "0x000057cd", + "att_dispatch_register_server": "0x000057e1", + "att_dispatch_server_can_send_now": "0x000057f5", + "att_dispatch_server_request_can_send_now_event": "0x000057fb", + "att_emit_general_event": "0x000058ad", + "att_server_can_send_packet_now": "0x00005fd9", + "att_server_deferred_read_response": "0x00005fdd", + "att_server_get_mtu": "0x00005ff5", + "att_server_indicate": "0x00006061", + "att_server_init": "0x000060e5", + "att_server_notify": "0x00006121", + "att_server_register_packet_handler": "0x00006239", + "att_server_request_can_send_now_event": "0x00006245", + "att_set_db": "0x00006261", + "att_set_read_callback": "0x00006275", + "att_set_write_callback": "0x00006281", + "bd_addr_cmp": "0x000063f1", + "bd_addr_copy": "0x000063f7", + "bd_addr_to_str": "0x00006401", + "big_endian_read_16": "0x00006439", + "big_endian_read_32": "0x00006441", + "big_endian_store_16": "0x00006455", + "big_endian_store_32": "0x00006461", + "btstack_config": "0x00006599", + "btstack_memory_pool_create": "0x000066e7", + "btstack_memory_pool_free": "0x00006711", + "btstack_memory_pool_get": "0x00006771", + "btstack_push_user_msg": "0x000067b9", + "btstack_push_user_runnable": "0x000067c5", + "btstack_reset": "0x000067d1", + "char_for_nibble": "0x00006a95", + "gap_add_dev_to_periodic_list": "0x000073a5", + "gap_add_whitelist": "0x000073b5", + "gap_aes_encrypt": "0x000073c1", + "gap_clear_white_lists": "0x000073f9", + "gap_clr_adv_set": "0x00007405", + "gap_clr_periodic_adv_list": "0x00007411", + "gap_create_connection_cancel": "0x0000741d", + "gap_default_periodic_adv_sync_transfer_param": "0x00007429", + "gap_disconnect": "0x00007441", + "gap_disconnect_all": "0x0000746d", + "gap_ext_create_connection": "0x000074ad", + "gap_get_connection_parameter_range": "0x00007585", + "gap_le_read_channel_map": "0x000075bd", + "gap_periodic_adv_create_sync": "0x00007629", + "gap_periodic_adv_create_sync_cancel": "0x0000764d", + "gap_periodic_adv_set_info_transfer": "0x00007659", + "gap_periodic_adv_sync_transfer": "0x00007669", + "gap_periodic_adv_sync_transfer_param": "0x00007679", + "gap_periodic_adv_term_sync": "0x00007695", + "gap_read_antenna_info": "0x0000771d", + "gap_read_periodic_adv_list_size": "0x00007729", + "gap_read_phy": "0x00007735", + "gap_read_remote_used_features": "0x00007741", + "gap_read_remote_version": "0x0000774d", + "gap_read_rssi": "0x00007759", + "gap_remove_whitelist": "0x00007765", + "gap_rmv_adv_set": "0x000077e1", + "gap_rmv_dev_from_periodic_list": "0x000077ed", + "gap_rx_test_v2": "0x000077fd", + "gap_rx_test_v3": "0x0000780d", + "gap_set_adv_set_random_addr": "0x00007859", + "gap_set_callback_for_next_hci": "0x00007895", + "gap_set_connection_cte_request_enable": "0x000078b5", + "gap_set_connection_cte_response_enable": "0x000078d1", + "gap_set_connection_cte_rx_param": "0x000078e1", + "gap_set_connection_cte_tx_param": "0x00007935", + "gap_set_connection_parameter_range": "0x00007981", + "gap_set_connectionless_cte_tx_enable": "0x00007999", + "gap_set_connectionless_cte_tx_param": "0x000079a9", + "gap_set_connectionless_iq_sampling_enable": "0x00007a05", + "gap_set_data_length": "0x00007a61", + "gap_set_def_phy": "0x00007a79", + "gap_set_ext_adv_data": "0x00007a89", + "gap_set_ext_adv_enable": "0x00007aa1", + "gap_set_ext_adv_para": "0x00007b11", + "gap_set_ext_scan_enable": "0x00007be9", + "gap_set_ext_scan_para": "0x00007c01", + "gap_set_ext_scan_response_data": "0x00007ca1", + "gap_set_host_channel_classification": "0x00007cb9", + "gap_set_periodic_adv_data": "0x00007cc9", + "gap_set_periodic_adv_enable": "0x00007d39", + "gap_set_periodic_adv_para": "0x00007d49", + "gap_set_periodic_adv_rx_enable": "0x00007d61", + "gap_set_phy": "0x00007d71", + "gap_set_random_device_address": "0x00007d8d", + "gap_start_ccm": "0x00007dbd", + "gap_test_end": "0x00007e05", + "gap_tx_test_v2": "0x00007e11", + "gap_tx_test_v4": "0x00007e29", + "gap_update_connection_parameters": "0x00007e4d", + "gap_vendor_tx_continuous_wave": "0x00007e8d", + "gatt_client_cancel_write": "0x000083b5", + "gatt_client_discover_characteristic_descriptors": "0x000083db", + "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x0000841b", + "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x0000846b", + "gatt_client_discover_characteristics_for_service": "0x000084bb", + "gatt_client_discover_primary_services": "0x000084f1", + "gatt_client_discover_primary_services_by_uuid128": "0x00008523", + "gatt_client_discover_primary_services_by_uuid16": "0x00008567", + "gatt_client_execute_write": "0x000085a3", + "gatt_client_find_included_services_for_service": "0x000085c9", + "gatt_client_get_mtu": "0x000085f7", + "gatt_client_is_ready": "0x00008695", + "gatt_client_listen_for_characteristic_value_updates": "0x000086ab", + "gatt_client_prepare_write": "0x000086cb", + "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x00008707", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x00008731", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008737", + "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x00008765", + "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x0000876b", + "gatt_client_read_multiple_characteristic_values": "0x00008799", + "gatt_client_read_value_of_characteristic_using_value_handle": "0x000087c9", + "gatt_client_read_value_of_characteristics_by_uuid128": "0x000087f7", + "gatt_client_read_value_of_characteristics_by_uuid16": "0x00008843", + "gatt_client_register_handler": "0x0000888d", + "gatt_client_reliable_write_long_value_of_characteristic": "0x00008899", + "gatt_client_signed_write_without_response": "0x00008c9d", + "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x00008d61", + "gatt_client_write_client_characteristic_configuration": "0x00008d9b", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x00008ded", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008dfd", + "gatt_client_write_long_value_of_characteristic": "0x00008e39", + "gatt_client_write_long_value_of_characteristic_with_offset": "0x00008e49", + "gatt_client_write_value_of_characteristic": "0x00008e85", + "gatt_client_write_value_of_characteristic_without_response": "0x00008ebb", + "hci_add_event_handler": "0x0000a3f1", + "hci_power_control": "0x0000ab79", + "hci_register_acl_packet_handler": "0x0000ad2d", + "kv_commit": "0x0000b4bd", + "kv_get": "0x0000b519", + "kv_init": "0x0000b525", + "kv_init_backend": "0x0000b5a1", + "kv_put": "0x0000b5b5", + "kv_remove": "0x0000b5c1", + "kv_remove_all": "0x0000b5f5", + "kv_value_modified": "0x0000b625", + "kv_value_modified_of_key": "0x0000b641", + "kv_visit": "0x0000b64d", + "l2cap_add_event_handler": "0x0000b6dd", + "l2cap_can_send_packet_now": "0x0000b6ed", + "l2cap_create_le_credit_based_connection_request": "0x0000b8a9", + "l2cap_credit_based_send": "0x0000b9ed", + "l2cap_credit_based_send_continue": "0x0000ba19", + "l2cap_disconnect": "0x0000ba95", + "l2cap_get_le_credit_based_connection_credits": "0x0000bce5", + "l2cap_get_peer_mtu_for_local_cid": "0x0000bd01", + "l2cap_init": "0x0000c0d5", + "l2cap_le_send_flow_control_credit": "0x0000c1cb", + "l2cap_max_le_mtu": "0x0000c4d5", + "l2cap_register_packet_handler": "0x0000c5fd", + "l2cap_register_service": "0x0000c609", + "l2cap_request_can_send_now_event": "0x0000c719", + "l2cap_request_connection_parameter_update": "0x0000c733", + "l2cap_send_echo_request": "0x0000cc0d", + "l2cap_unregister_service": "0x0000cccd", + "le_device_db_add": "0x0000cd25", + "le_device_db_find": "0x0000cded", + "le_device_db_from_key": "0x0000ce19", + "le_device_db_iter_cur": "0x0000ce21", + "le_device_db_iter_cur_key": "0x0000ce25", + "le_device_db_iter_init": "0x0000ce29", + "le_device_db_iter_next": "0x0000ce31", + "le_device_db_remove_key": "0x0000ce57", + "ll_aes_encrypt": "0x0000ce85", + "ll_config": "0x0000cf01", + "ll_free": "0x0000cf37", + "ll_get_heap_free_size": "0x0000cf41", + "ll_hint_on_ce_len": "0x0000cf55", + "ll_legacy_adv_set_interval": "0x0000cf8d", + "ll_malloc": "0x0000cf9d", + "ll_query_timing_info": "0x0000d0d5", + "ll_register_hci_acl_previewer": "0x0000d121", + "ll_scan_set_fixed_channel": "0x0000d185", + "ll_set_adv_access_address": "0x0000d39d", + "ll_set_adv_coded_scheme": "0x0000d3a9", + "ll_set_conn_acl_report_latency": "0x0000d3d1", + "ll_set_conn_coded_scheme": "0x0000d3fd", + "ll_set_conn_latency": "0x0000d425", + "ll_set_conn_tx_power": "0x0000d451", + "ll_set_def_antenna": "0x0000d495", + "ll_set_initiating_coded_scheme": "0x0000d4b1", + "ll_set_max_conn_number": "0x0000d4bd", + "nibble_for_char": "0x0001e3f9", + "platform_32k_rc_auto_tune": "0x0001e489", + "platform_32k_rc_tune": "0x0001e505", + "platform_calibrate_32k": "0x0001e519", + "platform_call_on_stack": "0x000040ef", + "platform_config": "0x0001e51d", + "platform_controller_run": "0x0001e641", + "platform_delete_timer": "0x0001e675", + "platform_enable_irq": "0x0001e67d", + "platform_get_gen_os_driver": "0x0001e6b5", + "platform_get_link_layer_interf": "0x0001e6c1", + "platform_get_task_handle": "0x0001e6c9", + "platform_get_timer_counter": "0x0001e6e1", + "platform_get_us_time": "0x0001e6e5", + "platform_get_version": "0x0001e6e9", + "platform_hrng": "0x0001e6f1", + "platform_init_controller": "0x0001e6f9", + "platform_os_idle_resumed_hook": "0x0001e715", + "platform_patch_rf_init_data": "0x0001e719", + "platform_post_sleep_processing": "0x0001e725", + "platform_pre_sleep_processing": "0x0001e72b", + "platform_pre_suppress_ticks_and_sleep_processing": "0x0001e731", + "platform_printf": "0x0001e735", + "platform_raise_assertion": "0x0001e749", + "platform_rand": "0x0001e75d", + "platform_read_info": "0x0001e761", + "platform_read_persistent_reg": "0x0001e791", + "platform_reset": "0x0001e7a1", + "platform_set_abs_timer": "0x0001e7c5", + "platform_set_evt_callback": "0x0001e7c9", + "platform_set_evt_callback_table": "0x0001e7dd", + "platform_set_irq_callback": "0x0001e7e9", + "platform_set_irq_callback_table": "0x0001e805", + "platform_set_rf_clk_source": "0x0001e811", + "platform_set_rf_init_data": "0x0001e81d", + "platform_set_rf_power_mapping": "0x0001e829", + "platform_set_timer": "0x0001e835", + "platform_shutdown": "0x0001e839", + "platform_switch_app": "0x0001e83d", + "platform_trace_raw": "0x0001e869", + "platform_write_persistent_reg": "0x0001e881", + "printf_hexdump": "0x0001e891", + "reverse_128": "0x0001ec01", + "reverse_24": "0x0001ec07", + "reverse_256": "0x0001ec0d", + "reverse_48": "0x0001ec13", + "reverse_56": "0x0001ec19", + "reverse_64": "0x0001ec1f", + "reverse_bd_addr": "0x0001ec25", + "reverse_bytes": "0x0001ec2b", + "sm_add_event_handler": "0x0001ef19", + "sm_address_resolution_lookup": "0x0001f071", + "sm_authenticated": "0x0001f3ed", + "sm_authorization_decline": "0x0001f3fb", + "sm_authorization_grant": "0x0001f41b", + "sm_authorization_state": "0x0001f43b", + "sm_bonding_decline": "0x0001f455", + "sm_config": "0x0001f8b1", + "sm_config_conn": "0x0001f8c9", + "sm_encryption_key_size": "0x0001fa7f", + "sm_just_works_confirm": "0x00020005", + "sm_le_device_key": "0x00020351", + "sm_passkey_input": "0x000203e7", + "sm_private_random_address_generation_get": "0x000207a1", + "sm_private_random_address_generation_get_mode": "0x000207a9", + "sm_private_random_address_generation_set_mode": "0x000207b5", + "sm_private_random_address_generation_set_update_period": "0x000207dd", + "sm_register_external_ltk_callback": "0x00020919", + "sm_register_oob_data_callback": "0x00020925", + "sm_request_pairing": "0x00020931", + "sm_send_security_request": "0x00021407", + "sm_set_accepted_stk_generation_methods": "0x0002142d", + "sm_set_authentication_requirements": "0x00021439", + "sm_set_encryption_key_size_range": "0x00021445", + "sscanf_bd_addr": "0x000217a1", + "sysSetPublicDeviceAddr": "0x00021b55", + "uuid128_to_str": "0x000222f5", + "uuid_add_bluetooth_prefix": "0x0002234d", + "uuid_has_bluetooth_prefix": "0x0002236d" } \ No newline at end of file diff --git a/bundles/noos_mini/ING9188xx/meta.json b/bundles/noos_mini/ING9188xx/meta.json index 5fc6a2a98..715b6bd0d 100644 --- a/bundles/noos_mini/ING9188xx/meta.json +++ b/bundles/noos_mini/ING9188xx/meta.json @@ -8,11 +8,11 @@ }, "rom": { "base": 16384, - "size": 130468 + "size": 130536 }, "version": [ 1, 9, - 38 + 39 ] } \ No newline at end of file diff --git a/bundles/noos_mini/ING9188xx/platform.bin b/bundles/noos_mini/ING9188xx/platform.bin index 49e87245fb5948db0d4d0e290af76adcee93465b..9ff46213615c0532f52b59673a12fe51a730c55f 100644 GIT binary patch delta 7090 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 MncCB{s)bYjA41Dm(EtDd delta 6924 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 diff --git a/bundles/noos_mini/inc/gap.h b/bundles/noos_mini/inc/gap.h index 68eee5323..595bde525 100644 --- a/bundles/noos_mini/inc/gap.h +++ b/bundles/noos_mini/inc/gap.h @@ -1287,7 +1287,7 @@ uint8_t gap_rx_test_v2(uint8_t rx_channel, uint8_t phy, uint8_t modulation_index uint8_t gap_rx_test_v3(uint8_t rx_channel, uint8_t phy, uint8_t modulation_index, uint8_t expected_cte_length, uint8_t expected_cte_type, uint8_t slot_durations, - uint8_t switching_pattern_length, uint8_t *antenna_ids); + uint8_t switching_pattern_length, const uint8_t *antenna_ids); /** * @brief Start a test where the DUT generates test reference packets at a fixed interval. @@ -1324,7 +1324,7 @@ uint8_t gap_tx_test_v2(uint8_t tx_channel, uint8_t test_data_length, uint8_t gap_tx_test_v4(uint8_t tx_channel, uint8_t test_data_length, uint8_t packet_payload, uint8_t phy, uint8_t cte_length, uint8_t cte_type, - uint8_t switching_pattern_length, uint8_t *antenna_ids, + uint8_t switching_pattern_length, const uint8_t *antenna_ids, int8_t tx_power_level); /** diff --git a/bundles/noos_mini/inc/ll_api.h b/bundles/noos_mini/inc/ll_api.h index 254e9e756..275c71b50 100644 --- a/bundles/noos_mini/inc/ll_api.h +++ b/bundles/noos_mini/inc/ll_api.h @@ -98,6 +98,59 @@ void ll_set_initiating_coded_scheme(const coded_scheme_t scheme); */ void ll_hint_on_ce_len(const uint16_t conn_handle, const uint16_t min_ce_len, const uint16_t max_ce_len); +/** + **************************************************************************************** + * @brief Create a connection directly (without advertising & initiating) + * + * @param[in] role connection role. master (0), slave (1) + * @param[in] addr_types address types for advertiser and initiator + * bit [0] for slave, bit [1] for master + * 0: public address; 1: random address + * @param[in] adv_addr address of advertiser + * @param[in] init_addr address of initiator + * @param[in] rx_phy Rx PHY (1: 1M, 2: 2M, 3: Coded) + * @param[in] tx_phy Tx PHY (1: 1M, 2: 2M, 3: Coded) + * @param[in] access_addr access address + * @param[in] crc_init CRC init + * @param[in] interval connection interval (unit: us) + * @param[in] sup_timeout supervision timeout (unit: 10ms) + * @param[in] channel_map channel map + * @param[in] ch_sel_algo channel selection algorithm (1 or 2) + * @param[in] hop_inc hop increment for CSA#1 ([5..16]) + * @param[in] min_ce_len information parameter about the minimum length of connection + * event needed for this LE connection. + * @param[in] max_ce_len information parameter about the maximum length of connection + * event needed for this LE connection. + * @param[in] start_time start time of the 1st connectin event + * @param[in] slave_latency slave latency + * @param[in] sleep_clk_acc sleep clock accuracy + * @param[in] sync_window slave's sync window for 1st connection event + * @return 0 if successful else error code + **************************************************************************************** + */ +// int ll_create_conn( +// uint8_t role, +// uint8_t addr_types, +// const uint8_t *adv_addr, +// const uint8_t *init_addr, +// uint8_t rx_phy, +// uint8_t tx_phy, +// uint32_t access_addr, +// uint32_t crc_init, +// uint32_t interval, +// uint16_t sup_timeout, +// const uint8_t *channel_map, +// uint8_t ch_sel_algo, +// uint8_t hop_inc, +// uint16_t min_ce_len, +// uint16_t max_ce_len, +// uint64_t start_time, +// uint16_t slave_latency, +// uint8_t sleep_clk_acc, +// uint32_t sync_window); +// WARNING: ^^^ this API is not available in this release + + /** **************************************************************************************** * @brief Set tx power of a connection diff --git a/bundles/noos_typical/ING9168xx/meta.json b/bundles/noos_typical/ING9168xx/meta.json index 55d2c4933..d7210528b 100644 --- a/bundles/noos_typical/ING9168xx/meta.json +++ b/bundles/noos_typical/ING9168xx/meta.json @@ -13,6 +13,6 @@ "version": [ 2, 2, - 52 + 53 ] } \ No newline at end of file diff --git a/bundles/noos_typical/ING9168xx/platform.bin b/bundles/noos_typical/ING9168xx/platform.bin index 9c8ecdb84bfd5c4ced605c899765650deccc3e59..85b76ab82fbc127871a737ddd64fa570cb086555 100644 GIT binary patch delta 20 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 N$fS9C^LO0;{{TjIrY!&f delta 6344 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 W^{ce{+`f7J@*?X82cu5&kiP>OP1W=O diff --git a/bundles/noos_typical/ING9188xx/apis.json b/bundles/noos_typical/ING9188xx/apis.json index f3b3e330f..4544197ec 100644 --- a/bundles/noos_typical/ING9188xx/apis.json +++ b/bundles/noos_typical/ING9188xx/apis.json @@ -1,265 +1,266 @@ { - "att_dispatch_client_can_send_now": "0x00005781", - "att_dispatch_client_request_can_send_now_event": "0x00005787", - "att_dispatch_register_client": "0x0000578d", - "att_dispatch_register_server": "0x000057a1", - "att_dispatch_server_can_send_now": "0x000057b5", - "att_dispatch_server_request_can_send_now_event": "0x000057bb", - "att_emit_general_event": "0x0000586d", - "att_server_can_send_packet_now": "0x00005f9d", - "att_server_deferred_read_response": "0x00005fa1", - "att_server_get_mtu": "0x00005fb9", - "att_server_indicate": "0x00006031", - "att_server_init": "0x000060b5", - "att_server_notify": "0x000060f1", - "att_server_register_packet_handler": "0x00006209", - "att_server_request_can_send_now_event": "0x00006215", - "att_set_db": "0x00006231", - "att_set_read_callback": "0x00006245", - "att_set_write_callback": "0x00006251", - "bd_addr_cmp": "0x000063c1", - "bd_addr_copy": "0x000063c7", - "bd_addr_to_str": "0x000063d1", - "big_endian_read_16": "0x00006409", - "big_endian_read_32": "0x00006411", - "big_endian_store_16": "0x00006425", - "big_endian_store_32": "0x00006431", - "btstack_config": "0x00006569", - "btstack_memory_pool_create": "0x000066b7", - "btstack_memory_pool_free": "0x000066e1", - "btstack_memory_pool_get": "0x00006741", - "btstack_push_user_msg": "0x00006789", - "btstack_push_user_runnable": "0x00006795", - "btstack_reset": "0x000067a1", - "char_for_nibble": "0x00006a65", - "gap_add_dev_to_periodic_list": "0x00007379", - "gap_add_whitelist": "0x00007389", - "gap_aes_encrypt": "0x00007395", - "gap_clear_white_lists": "0x000073cd", - "gap_clr_adv_set": "0x000073d9", - "gap_clr_periodic_adv_list": "0x000073e5", - "gap_create_connection_cancel": "0x000073f1", - "gap_default_periodic_adv_sync_transfer_param": "0x000073fd", - "gap_disconnect": "0x00007415", - "gap_disconnect_all": "0x00007441", - "gap_ext_create_connection": "0x00007481", - "gap_get_connection_parameter_range": "0x00007559", - "gap_le_read_channel_map": "0x00007595", - "gap_periodic_adv_create_sync": "0x00007601", - "gap_periodic_adv_create_sync_cancel": "0x00007625", - "gap_periodic_adv_set_info_transfer": "0x00007631", - "gap_periodic_adv_sync_transfer": "0x00007641", - "gap_periodic_adv_sync_transfer_param": "0x00007651", - "gap_periodic_adv_term_sync": "0x0000766d", - "gap_read_antenna_info": "0x000076f5", - "gap_read_periodic_adv_list_size": "0x00007701", - "gap_read_phy": "0x0000770d", - "gap_read_remote_used_features": "0x00007719", - "gap_read_remote_version": "0x00007725", - "gap_read_rssi": "0x00007731", - "gap_remove_whitelist": "0x0000773d", - "gap_rmv_adv_set": "0x000077b9", - "gap_rmv_dev_from_periodic_list": "0x000077c5", - "gap_rx_test_v2": "0x000077d5", - "gap_rx_test_v3": "0x000077e5", - "gap_set_adv_set_random_addr": "0x00007831", - "gap_set_callback_for_next_hci": "0x0000786d", - "gap_set_connection_cte_request_enable": "0x0000788d", - "gap_set_connection_cte_response_enable": "0x000078a9", - "gap_set_connection_cte_rx_param": "0x000078b9", - "gap_set_connection_cte_tx_param": "0x0000790d", - "gap_set_connection_parameter_range": "0x00007959", - "gap_set_connectionless_cte_tx_enable": "0x00007971", - "gap_set_connectionless_cte_tx_param": "0x00007981", - "gap_set_connectionless_iq_sampling_enable": "0x000079dd", - "gap_set_data_length": "0x00007a39", - "gap_set_def_phy": "0x00007a51", - "gap_set_ext_adv_data": "0x00007a61", - "gap_set_ext_adv_enable": "0x00007a79", - "gap_set_ext_adv_para": "0x00007ae9", - "gap_set_ext_scan_enable": "0x00007bc1", - "gap_set_ext_scan_para": "0x00007bd9", - "gap_set_ext_scan_response_data": "0x00007c79", - "gap_set_host_channel_classification": "0x00007c91", - "gap_set_periodic_adv_data": "0x00007ca1", - "gap_set_periodic_adv_enable": "0x00007d11", - "gap_set_periodic_adv_para": "0x00007d21", - "gap_set_periodic_adv_rx_enable": "0x00007d39", - "gap_set_phy": "0x00007d49", - "gap_set_random_device_address": "0x00007d65", - "gap_start_ccm": "0x00007d95", - "gap_test_end": "0x00007ddd", - "gap_tx_test_v2": "0x00007de9", - "gap_tx_test_v4": "0x00007e01", - "gap_update_connection_parameters": "0x00007e25", - "gap_vendor_tx_continuous_wave": "0x00007e69", - "gatt_client_cancel_write": "0x00008391", - "gatt_client_discover_characteristic_descriptors": "0x000083b7", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x000083f7", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x00008447", - "gatt_client_discover_characteristics_for_service": "0x00008497", - "gatt_client_discover_primary_services": "0x000084cd", - "gatt_client_discover_primary_services_by_uuid128": "0x000084ff", - "gatt_client_discover_primary_services_by_uuid16": "0x00008543", - "gatt_client_execute_write": "0x0000857f", - "gatt_client_find_included_services_for_service": "0x000085a5", - "gatt_client_get_mtu": "0x000085d3", - "gatt_client_is_ready": "0x00008675", - "gatt_client_listen_for_characteristic_value_updates": "0x0000868b", - "gatt_client_prepare_write": "0x000086ad", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x000086e9", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x00008713", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008719", - "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x00008747", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x0000874d", - "gatt_client_read_multiple_characteristic_values": "0x0000877b", - "gatt_client_read_value_of_characteristic_using_value_handle": "0x000087ab", - "gatt_client_read_value_of_characteristics_by_uuid128": "0x000087d9", - "gatt_client_read_value_of_characteristics_by_uuid16": "0x00008825", - "gatt_client_register_handler": "0x00008871", - "gatt_client_reliable_write_long_value_of_characteristic": "0x0000887d", - "gatt_client_signed_write_without_response": "0x00008cad", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x00008d71", - "gatt_client_write_client_characteristic_configuration": "0x00008dab", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x00008dfd", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008e0d", - "gatt_client_write_long_value_of_characteristic": "0x00008e49", - "gatt_client_write_long_value_of_characteristic_with_offset": "0x00008e59", - "gatt_client_write_value_of_characteristic": "0x00008e95", - "gatt_client_write_value_of_characteristic_without_response": "0x00008ecb", - "hci_add_event_handler": "0x0000a40d", - "hci_power_control": "0x0000aba9", - "hci_register_acl_packet_handler": "0x0000ad5d", - "kv_commit": "0x0000b4f9", - "kv_get": "0x0000b555", - "kv_init": "0x0000b561", - "kv_init_backend": "0x0000b5e1", - "kv_put": "0x0000b5f5", - "kv_remove": "0x0000b601", - "kv_remove_all": "0x0000b635", - "kv_value_modified": "0x0000b665", - "kv_value_modified_of_key": "0x0000b681", - "kv_visit": "0x0000b68d", - "l2cap_add_event_handler": "0x0000b71d", - "l2cap_can_send_packet_now": "0x0000b72d", - "l2cap_create_le_credit_based_connection_request": "0x0000b8e9", - "l2cap_credit_based_send": "0x0000ba2d", - "l2cap_credit_based_send_continue": "0x0000ba59", - "l2cap_disconnect": "0x0000bad5", - "l2cap_get_le_credit_based_connection_credits": "0x0000bd25", - "l2cap_get_peer_mtu_for_local_cid": "0x0000bd41", - "l2cap_init": "0x0000c115", - "l2cap_le_send_flow_control_credit": "0x0000c20b", - "l2cap_max_le_mtu": "0x0000c515", - "l2cap_register_packet_handler": "0x0000c63d", - "l2cap_register_service": "0x0000c649", - "l2cap_request_can_send_now_event": "0x0000c759", - "l2cap_request_connection_parameter_update": "0x0000c773", - "l2cap_send_echo_request": "0x0000cc4d", - "l2cap_unregister_service": "0x0000cd0d", - "le_device_db_add": "0x0000cd65", - "le_device_db_find": "0x0000ce3d", - "le_device_db_from_key": "0x0000ce69", - "le_device_db_iter_cur": "0x0000ce71", - "le_device_db_iter_cur_key": "0x0000ce75", - "le_device_db_iter_init": "0x0000ce79", - "le_device_db_iter_next": "0x0000ce81", - "le_device_db_remove_key": "0x0000cea7", - "ll_aes_encrypt": "0x0000ced5", - "ll_config": "0x0000cf51", - "ll_free": "0x0000cf87", - "ll_get_heap_free_size": "0x0000cf91", - "ll_hint_on_ce_len": "0x0000cfa5", - "ll_legacy_adv_set_interval": "0x0000cfdd", - "ll_malloc": "0x0000cfed", - "ll_query_timing_info": "0x0000d125", - "ll_register_hci_acl_previewer": "0x0000d171", - "ll_scan_set_fixed_channel": "0x0000d1d5", - "ll_set_adv_access_address": "0x0000d3ed", - "ll_set_adv_coded_scheme": "0x0000d3f9", - "ll_set_conn_acl_report_latency": "0x0000d429", - "ll_set_conn_coded_scheme": "0x0000d459", - "ll_set_conn_latency": "0x0000d485", - "ll_set_conn_tx_power": "0x0000d4b5", - "ll_set_def_antenna": "0x0000d4fd", - "ll_set_initiating_coded_scheme": "0x0000d519", - "ll_set_max_conn_number": "0x0000d525", - "nibble_for_char": "0x0001e581", - "platform_32k_rc_auto_tune": "0x0001e61d", - "platform_32k_rc_tune": "0x0001e699", - "platform_calibrate_32k": "0x0001e6ad", - "platform_config": "0x0001e6b1", - "platform_controller_run": "0x0001e7d5", - "platform_delete_timer": "0x0001e809", - "platform_enable_irq": "0x0001e811", - "platform_get_gen_os_driver": "0x0001e849", - "platform_get_link_layer_interf": "0x0001e855", - "platform_get_task_handle": "0x0001e85d", - "platform_get_timer_counter": "0x0001e875", - "platform_get_us_time": "0x0001e879", - "platform_get_version": "0x0001e87d", - "platform_hrng": "0x0001e885", - "platform_init_controller": "0x0001e88d", - "platform_os_idle_resumed_hook": "0x0001e8a9", - "platform_patch_rf_init_data": "0x0001e8ad", - "platform_post_sleep_processing": "0x0001e8b9", - "platform_pre_sleep_processing": "0x0001e8bf", - "platform_pre_suppress_ticks_and_sleep_processing": "0x0001e8c5", - "platform_printf": "0x0001e8c9", - "platform_raise_assertion": "0x0001e8dd", - "platform_rand": "0x0001e8f1", - "platform_read_info": "0x0001e8f5", - "platform_read_persistent_reg": "0x0001e925", - "platform_reset": "0x0001e935", - "platform_set_abs_timer": "0x0001e959", - "platform_set_evt_callback": "0x0001e95d", - "platform_set_evt_callback_table": "0x0001e971", - "platform_set_irq_callback": "0x0001e97d", - "platform_set_irq_callback_table": "0x0001e999", - "platform_set_rf_clk_source": "0x0001e9a5", - "platform_set_rf_init_data": "0x0001e9b1", - "platform_set_rf_power_mapping": "0x0001e9bd", - "platform_set_timer": "0x0001e9c9", - "platform_shutdown": "0x0001e9cd", - "platform_switch_app": "0x0001e9d1", - "platform_trace_raw": "0x0001e9fd", - "platform_write_persistent_reg": "0x0001ea15", - "printf_hexdump": "0x0001ea25", - "reverse_128": "0x0001ed9d", - "reverse_24": "0x0001eda3", - "reverse_256": "0x0001eda9", - "reverse_48": "0x0001edaf", - "reverse_56": "0x0001edb5", - "reverse_64": "0x0001edbb", - "reverse_bd_addr": "0x0001edc1", - "reverse_bytes": "0x0001edc7", - "sm_add_event_handler": "0x0001f0b5", - "sm_address_resolution_lookup": "0x0001f20d", - "sm_authenticated": "0x0001f589", - "sm_authorization_decline": "0x0001f597", - "sm_authorization_grant": "0x0001f5b7", - "sm_authorization_state": "0x0001f5d7", - "sm_bonding_decline": "0x0001f5f1", - "sm_config": "0x0001fa4d", - "sm_config_conn": "0x0001fa65", - "sm_encryption_key_size": "0x0001fc1b", - "sm_just_works_confirm": "0x000201a1", - "sm_le_device_key": "0x000204ed", - "sm_passkey_input": "0x00020583", - "sm_private_random_address_generation_get": "0x0002093d", - "sm_private_random_address_generation_get_mode": "0x00020945", - "sm_private_random_address_generation_set_mode": "0x00020951", - "sm_private_random_address_generation_set_update_period": "0x00020979", - "sm_register_external_ltk_callback": "0x00020ab5", - "sm_register_oob_data_callback": "0x00020ac1", - "sm_request_pairing": "0x00020acd", - "sm_send_security_request": "0x000215a3", - "sm_set_accepted_stk_generation_methods": "0x000215c9", - "sm_set_authentication_requirements": "0x000215d5", - "sm_set_encryption_key_size_range": "0x000215e1", - "sscanf_bd_addr": "0x0002193d", - "sysSetPublicDeviceAddr": "0x00021cf1", - "uuid128_to_str": "0x00022491", - "uuid_add_bluetooth_prefix": "0x000224e9", - "uuid_has_bluetooth_prefix": "0x00022509" + "att_dispatch_client_can_send_now": "0x000057c9", + "att_dispatch_client_request_can_send_now_event": "0x000057cf", + "att_dispatch_register_client": "0x000057d5", + "att_dispatch_register_server": "0x000057e9", + "att_dispatch_server_can_send_now": "0x000057fd", + "att_dispatch_server_request_can_send_now_event": "0x00005803", + "att_emit_general_event": "0x000058b5", + "att_server_can_send_packet_now": "0x00005fe5", + "att_server_deferred_read_response": "0x00005fe9", + "att_server_get_mtu": "0x00006001", + "att_server_indicate": "0x00006079", + "att_server_init": "0x000060fd", + "att_server_notify": "0x00006139", + "att_server_register_packet_handler": "0x00006251", + "att_server_request_can_send_now_event": "0x0000625d", + "att_set_db": "0x00006279", + "att_set_read_callback": "0x0000628d", + "att_set_write_callback": "0x00006299", + "bd_addr_cmp": "0x00006409", + "bd_addr_copy": "0x0000640f", + "bd_addr_to_str": "0x00006419", + "big_endian_read_16": "0x00006451", + "big_endian_read_32": "0x00006459", + "big_endian_store_16": "0x0000646d", + "big_endian_store_32": "0x00006479", + "btstack_config": "0x000065b1", + "btstack_memory_pool_create": "0x000066ff", + "btstack_memory_pool_free": "0x00006729", + "btstack_memory_pool_get": "0x00006789", + "btstack_push_user_msg": "0x000067d1", + "btstack_push_user_runnable": "0x000067dd", + "btstack_reset": "0x000067e9", + "char_for_nibble": "0x00006aad", + "gap_add_dev_to_periodic_list": "0x000073c1", + "gap_add_whitelist": "0x000073d1", + "gap_aes_encrypt": "0x000073dd", + "gap_clear_white_lists": "0x00007415", + "gap_clr_adv_set": "0x00007421", + "gap_clr_periodic_adv_list": "0x0000742d", + "gap_create_connection_cancel": "0x00007439", + "gap_default_periodic_adv_sync_transfer_param": "0x00007445", + "gap_disconnect": "0x0000745d", + "gap_disconnect_all": "0x00007489", + "gap_ext_create_connection": "0x000074c9", + "gap_get_connection_parameter_range": "0x000075a1", + "gap_le_read_channel_map": "0x000075dd", + "gap_periodic_adv_create_sync": "0x00007649", + "gap_periodic_adv_create_sync_cancel": "0x0000766d", + "gap_periodic_adv_set_info_transfer": "0x00007679", + "gap_periodic_adv_sync_transfer": "0x00007689", + "gap_periodic_adv_sync_transfer_param": "0x00007699", + "gap_periodic_adv_term_sync": "0x000076b5", + "gap_read_antenna_info": "0x0000773d", + "gap_read_periodic_adv_list_size": "0x00007749", + "gap_read_phy": "0x00007755", + "gap_read_remote_used_features": "0x00007761", + "gap_read_remote_version": "0x0000776d", + "gap_read_rssi": "0x00007779", + "gap_remove_whitelist": "0x00007785", + "gap_rmv_adv_set": "0x00007801", + "gap_rmv_dev_from_periodic_list": "0x0000780d", + "gap_rx_test_v2": "0x0000781d", + "gap_rx_test_v3": "0x0000782d", + "gap_set_adv_set_random_addr": "0x00007879", + "gap_set_callback_for_next_hci": "0x000078b5", + "gap_set_connection_cte_request_enable": "0x000078d5", + "gap_set_connection_cte_response_enable": "0x000078f1", + "gap_set_connection_cte_rx_param": "0x00007901", + "gap_set_connection_cte_tx_param": "0x00007955", + "gap_set_connection_parameter_range": "0x000079a1", + "gap_set_connectionless_cte_tx_enable": "0x000079b9", + "gap_set_connectionless_cte_tx_param": "0x000079c9", + "gap_set_connectionless_iq_sampling_enable": "0x00007a25", + "gap_set_data_length": "0x00007a81", + "gap_set_def_phy": "0x00007a99", + "gap_set_ext_adv_data": "0x00007aa9", + "gap_set_ext_adv_enable": "0x00007ac1", + "gap_set_ext_adv_para": "0x00007b31", + "gap_set_ext_scan_enable": "0x00007c09", + "gap_set_ext_scan_para": "0x00007c21", + "gap_set_ext_scan_response_data": "0x00007cc1", + "gap_set_host_channel_classification": "0x00007cd9", + "gap_set_periodic_adv_data": "0x00007ce9", + "gap_set_periodic_adv_enable": "0x00007d59", + "gap_set_periodic_adv_para": "0x00007d69", + "gap_set_periodic_adv_rx_enable": "0x00007d81", + "gap_set_phy": "0x00007d91", + "gap_set_random_device_address": "0x00007dad", + "gap_start_ccm": "0x00007ddd", + "gap_test_end": "0x00007e25", + "gap_tx_test_v2": "0x00007e31", + "gap_tx_test_v4": "0x00007e49", + "gap_update_connection_parameters": "0x00007e6d", + "gap_vendor_tx_continuous_wave": "0x00007eb1", + "gatt_client_cancel_write": "0x000083d9", + "gatt_client_discover_characteristic_descriptors": "0x000083ff", + "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x0000843f", + "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x0000848f", + "gatt_client_discover_characteristics_for_service": "0x000084df", + "gatt_client_discover_primary_services": "0x00008515", + "gatt_client_discover_primary_services_by_uuid128": "0x00008547", + "gatt_client_discover_primary_services_by_uuid16": "0x0000858b", + "gatt_client_execute_write": "0x000085c7", + "gatt_client_find_included_services_for_service": "0x000085ed", + "gatt_client_get_mtu": "0x0000861b", + "gatt_client_is_ready": "0x000086bd", + "gatt_client_listen_for_characteristic_value_updates": "0x000086d3", + "gatt_client_prepare_write": "0x000086f5", + "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x00008731", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x0000875b", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008761", + "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x0000878f", + "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x00008795", + "gatt_client_read_multiple_characteristic_values": "0x000087c3", + "gatt_client_read_value_of_characteristic_using_value_handle": "0x000087f3", + "gatt_client_read_value_of_characteristics_by_uuid128": "0x00008821", + "gatt_client_read_value_of_characteristics_by_uuid16": "0x0000886d", + "gatt_client_register_handler": "0x000088b9", + "gatt_client_reliable_write_long_value_of_characteristic": "0x000088c5", + "gatt_client_signed_write_without_response": "0x00008cf5", + "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x00008db9", + "gatt_client_write_client_characteristic_configuration": "0x00008df3", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x00008e45", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008e55", + "gatt_client_write_long_value_of_characteristic": "0x00008e91", + "gatt_client_write_long_value_of_characteristic_with_offset": "0x00008ea1", + "gatt_client_write_value_of_characteristic": "0x00008edd", + "gatt_client_write_value_of_characteristic_without_response": "0x00008f13", + "hci_add_event_handler": "0x0000a455", + "hci_power_control": "0x0000abf1", + "hci_register_acl_packet_handler": "0x0000ada5", + "kv_commit": "0x0000b541", + "kv_get": "0x0000b59d", + "kv_init": "0x0000b5a9", + "kv_init_backend": "0x0000b629", + "kv_put": "0x0000b63d", + "kv_remove": "0x0000b649", + "kv_remove_all": "0x0000b67d", + "kv_value_modified": "0x0000b6ad", + "kv_value_modified_of_key": "0x0000b6c9", + "kv_visit": "0x0000b6d5", + "l2cap_add_event_handler": "0x0000b765", + "l2cap_can_send_packet_now": "0x0000b775", + "l2cap_create_le_credit_based_connection_request": "0x0000b931", + "l2cap_credit_based_send": "0x0000ba75", + "l2cap_credit_based_send_continue": "0x0000baa1", + "l2cap_disconnect": "0x0000bb1d", + "l2cap_get_le_credit_based_connection_credits": "0x0000bd6d", + "l2cap_get_peer_mtu_for_local_cid": "0x0000bd89", + "l2cap_init": "0x0000c15d", + "l2cap_le_send_flow_control_credit": "0x0000c253", + "l2cap_max_le_mtu": "0x0000c55d", + "l2cap_register_packet_handler": "0x0000c685", + "l2cap_register_service": "0x0000c691", + "l2cap_request_can_send_now_event": "0x0000c7a1", + "l2cap_request_connection_parameter_update": "0x0000c7bb", + "l2cap_send_echo_request": "0x0000cc95", + "l2cap_unregister_service": "0x0000cd55", + "le_device_db_add": "0x0000cdad", + "le_device_db_find": "0x0000ce85", + "le_device_db_from_key": "0x0000ceb1", + "le_device_db_iter_cur": "0x0000ceb9", + "le_device_db_iter_cur_key": "0x0000cebd", + "le_device_db_iter_init": "0x0000cec1", + "le_device_db_iter_next": "0x0000cec9", + "le_device_db_remove_key": "0x0000ceef", + "ll_aes_encrypt": "0x0000cf1d", + "ll_config": "0x0000cf99", + "ll_free": "0x0000cfcf", + "ll_get_heap_free_size": "0x0000cfd9", + "ll_hint_on_ce_len": "0x0000cfed", + "ll_legacy_adv_set_interval": "0x0000d025", + "ll_malloc": "0x0000d035", + "ll_query_timing_info": "0x0000d16d", + "ll_register_hci_acl_previewer": "0x0000d1b9", + "ll_scan_set_fixed_channel": "0x0000d21d", + "ll_set_adv_access_address": "0x0000d435", + "ll_set_adv_coded_scheme": "0x0000d441", + "ll_set_conn_acl_report_latency": "0x0000d471", + "ll_set_conn_coded_scheme": "0x0000d4a1", + "ll_set_conn_latency": "0x0000d4cd", + "ll_set_conn_tx_power": "0x0000d4fd", + "ll_set_def_antenna": "0x0000d545", + "ll_set_initiating_coded_scheme": "0x0000d561", + "ll_set_max_conn_number": "0x0000d56d", + "nibble_for_char": "0x0001e5c9", + "platform_32k_rc_auto_tune": "0x0001e665", + "platform_32k_rc_tune": "0x0001e6e1", + "platform_calibrate_32k": "0x0001e6f5", + "platform_call_on_stack": "0x000040ef", + "platform_config": "0x0001e6f9", + "platform_controller_run": "0x0001e81d", + "platform_delete_timer": "0x0001e851", + "platform_enable_irq": "0x0001e859", + "platform_get_gen_os_driver": "0x0001e891", + "platform_get_link_layer_interf": "0x0001e89d", + "platform_get_task_handle": "0x0001e8a5", + "platform_get_timer_counter": "0x0001e8bd", + "platform_get_us_time": "0x0001e8c1", + "platform_get_version": "0x0001e8c5", + "platform_hrng": "0x0001e8cd", + "platform_init_controller": "0x0001e8d5", + "platform_os_idle_resumed_hook": "0x0001e8f1", + "platform_patch_rf_init_data": "0x0001e8f5", + "platform_post_sleep_processing": "0x0001e901", + "platform_pre_sleep_processing": "0x0001e907", + "platform_pre_suppress_ticks_and_sleep_processing": "0x0001e90d", + "platform_printf": "0x0001e911", + "platform_raise_assertion": "0x0001e925", + "platform_rand": "0x0001e939", + "platform_read_info": "0x0001e93d", + "platform_read_persistent_reg": "0x0001e96d", + "platform_reset": "0x0001e97d", + "platform_set_abs_timer": "0x0001e9a1", + "platform_set_evt_callback": "0x0001e9a5", + "platform_set_evt_callback_table": "0x0001e9b9", + "platform_set_irq_callback": "0x0001e9c5", + "platform_set_irq_callback_table": "0x0001e9e1", + "platform_set_rf_clk_source": "0x0001e9ed", + "platform_set_rf_init_data": "0x0001e9f9", + "platform_set_rf_power_mapping": "0x0001ea05", + "platform_set_timer": "0x0001ea11", + "platform_shutdown": "0x0001ea15", + "platform_switch_app": "0x0001ea19", + "platform_trace_raw": "0x0001ea45", + "platform_write_persistent_reg": "0x0001ea5d", + "printf_hexdump": "0x0001ea6d", + "reverse_128": "0x0001ede5", + "reverse_24": "0x0001edeb", + "reverse_256": "0x0001edf1", + "reverse_48": "0x0001edf7", + "reverse_56": "0x0001edfd", + "reverse_64": "0x0001ee03", + "reverse_bd_addr": "0x0001ee09", + "reverse_bytes": "0x0001ee0f", + "sm_add_event_handler": "0x0001f0fd", + "sm_address_resolution_lookup": "0x0001f255", + "sm_authenticated": "0x0001f5d1", + "sm_authorization_decline": "0x0001f5df", + "sm_authorization_grant": "0x0001f5ff", + "sm_authorization_state": "0x0001f61f", + "sm_bonding_decline": "0x0001f639", + "sm_config": "0x0001fa95", + "sm_config_conn": "0x0001faad", + "sm_encryption_key_size": "0x0001fc63", + "sm_just_works_confirm": "0x000201e9", + "sm_le_device_key": "0x00020535", + "sm_passkey_input": "0x000205cb", + "sm_private_random_address_generation_get": "0x00020985", + "sm_private_random_address_generation_get_mode": "0x0002098d", + "sm_private_random_address_generation_set_mode": "0x00020999", + "sm_private_random_address_generation_set_update_period": "0x000209c1", + "sm_register_external_ltk_callback": "0x00020afd", + "sm_register_oob_data_callback": "0x00020b09", + "sm_request_pairing": "0x00020b15", + "sm_send_security_request": "0x000215eb", + "sm_set_accepted_stk_generation_methods": "0x00021611", + "sm_set_authentication_requirements": "0x0002161d", + "sm_set_encryption_key_size_range": "0x00021629", + "sscanf_bd_addr": "0x00021985", + "sysSetPublicDeviceAddr": "0x00021d39", + "uuid128_to_str": "0x000224d9", + "uuid_add_bluetooth_prefix": "0x00022531", + "uuid_has_bluetooth_prefix": "0x00022551" } \ No newline at end of file diff --git a/bundles/noos_typical/ING9188xx/meta.json b/bundles/noos_typical/ING9188xx/meta.json index c953a5293..46b82ed38 100644 --- a/bundles/noos_typical/ING9188xx/meta.json +++ b/bundles/noos_typical/ING9188xx/meta.json @@ -8,11 +8,11 @@ }, "rom": { "base": 16384, - "size": 130960 + "size": 131028 }, "version": [ 1, 9, - 38 + 39 ] } \ No newline at end of file diff --git a/bundles/noos_typical/ING9188xx/platform.bin b/bundles/noos_typical/ING9188xx/platform.bin index 695964cc62ba961ccc6172c769553d34f070ddae..5fda934accf2ab71af6eb065a8969e94ffb4bc43 100644 GIT binary patch delta 6918 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 Y6V1!-F)t4pkvKZhxje$Xrk}_E54yXAwg3PC delta 6710 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 CP2M~J delta 6337 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 Zf|Kksci3m<4oVu56gacUNDfuW{|l!y*xUdB diff --git a/bundles/typical/ING9188xx/apis.json b/bundles/typical/ING9188xx/apis.json index 2b4eff47c..76719b5a8 100644 --- a/bundles/typical/ING9188xx/apis.json +++ b/bundles/typical/ING9188xx/apis.json @@ -1,344 +1,345 @@ { - "att_dispatch_client_can_send_now": "0x00005875", - "att_dispatch_client_request_can_send_now_event": "0x0000587b", - "att_dispatch_register_client": "0x00005881", - "att_dispatch_register_server": "0x00005895", - "att_dispatch_server_can_send_now": "0x000058a9", - "att_dispatch_server_request_can_send_now_event": "0x000058af", - "att_emit_general_event": "0x00005961", - "att_server_can_send_packet_now": "0x00006091", - "att_server_deferred_read_response": "0x00006095", - "att_server_get_mtu": "0x000060ad", - "att_server_indicate": "0x00006125", - "att_server_init": "0x000061a9", - "att_server_notify": "0x000061e5", - "att_server_register_packet_handler": "0x000062fd", - "att_server_request_can_send_now_event": "0x00006309", - "att_set_db": "0x00006325", - "att_set_read_callback": "0x00006339", - "att_set_write_callback": "0x00006345", - "bd_addr_cmp": "0x000064b5", - "bd_addr_copy": "0x000064bb", - "bd_addr_to_str": "0x000064c5", - "big_endian_read_16": "0x000064fd", - "big_endian_read_32": "0x00006505", - "big_endian_store_16": "0x00006519", - "big_endian_store_32": "0x00006525", - "btstack_config": "0x00006679", - "btstack_memory_pool_create": "0x000067b7", - "btstack_memory_pool_free": "0x000067e1", - "btstack_memory_pool_get": "0x00006841", - "btstack_push_user_msg": "0x000068a9", - "btstack_push_user_runnable": "0x000068b5", - "btstack_reset": "0x000068c1", - "char_for_nibble": "0x00006b9d", - "eTaskConfirmSleepModeStatus": "0x00006e81", - "gap_add_dev_to_periodic_list": "0x000074ed", - "gap_add_whitelist": "0x000074fd", - "gap_aes_encrypt": "0x00007509", - "gap_clear_white_lists": "0x00007541", - "gap_clr_adv_set": "0x0000754d", - "gap_clr_periodic_adv_list": "0x00007559", - "gap_create_connection_cancel": "0x00007565", - "gap_default_periodic_adv_sync_transfer_param": "0x00007571", - "gap_disconnect": "0x00007589", - "gap_disconnect_all": "0x000075b5", - "gap_ext_create_connection": "0x000075f5", - "gap_get_connection_parameter_range": "0x000076cd", - "gap_le_read_channel_map": "0x00007709", - "gap_periodic_adv_create_sync": "0x00007775", - "gap_periodic_adv_create_sync_cancel": "0x00007799", - "gap_periodic_adv_set_info_transfer": "0x000077a5", - "gap_periodic_adv_sync_transfer": "0x000077b5", - "gap_periodic_adv_sync_transfer_param": "0x000077c5", - "gap_periodic_adv_term_sync": "0x000077e1", - "gap_read_antenna_info": "0x00007869", - "gap_read_periodic_adv_list_size": "0x00007875", - "gap_read_phy": "0x00007881", - "gap_read_remote_used_features": "0x0000788d", - "gap_read_remote_version": "0x00007899", - "gap_read_rssi": "0x000078a5", - "gap_remove_whitelist": "0x000078b1", - "gap_rmv_adv_set": "0x0000792d", - "gap_rmv_dev_from_periodic_list": "0x00007939", - "gap_rx_test_v2": "0x00007949", - "gap_rx_test_v3": "0x00007959", - "gap_set_adv_set_random_addr": "0x000079a5", - "gap_set_callback_for_next_hci": "0x000079e1", - "gap_set_connection_cte_request_enable": "0x00007a01", - "gap_set_connection_cte_response_enable": "0x00007a1d", - "gap_set_connection_cte_rx_param": "0x00007a2d", - "gap_set_connection_cte_tx_param": "0x00007a81", - "gap_set_connection_parameter_range": "0x00007acd", - "gap_set_connectionless_cte_tx_enable": "0x00007ae5", - "gap_set_connectionless_cte_tx_param": "0x00007af5", - "gap_set_connectionless_iq_sampling_enable": "0x00007b51", - "gap_set_data_length": "0x00007bad", - "gap_set_def_phy": "0x00007bc5", - "gap_set_ext_adv_data": "0x00007bd5", - "gap_set_ext_adv_enable": "0x00007bed", - "gap_set_ext_adv_para": "0x00007c5d", - "gap_set_ext_scan_enable": "0x00007d35", - "gap_set_ext_scan_para": "0x00007d4d", - "gap_set_ext_scan_response_data": "0x00007ded", - "gap_set_host_channel_classification": "0x00007e05", - "gap_set_periodic_adv_data": "0x00007e15", - "gap_set_periodic_adv_enable": "0x00007e85", - "gap_set_periodic_adv_para": "0x00007e95", - "gap_set_periodic_adv_rx_enable": "0x00007ead", - "gap_set_phy": "0x00007ebd", - "gap_set_random_device_address": "0x00007ed9", - "gap_start_ccm": "0x00007f09", - "gap_test_end": "0x00007f51", - "gap_tx_test_v2": "0x00007f5d", - "gap_tx_test_v4": "0x00007f75", - "gap_update_connection_parameters": "0x00007f99", - "gap_vendor_tx_continuous_wave": "0x00007fdd", - "gatt_client_cancel_write": "0x00008505", - "gatt_client_discover_characteristic_descriptors": "0x0000852b", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x0000856b", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x000085bb", - "gatt_client_discover_characteristics_for_service": "0x0000860b", - "gatt_client_discover_primary_services": "0x00008641", - "gatt_client_discover_primary_services_by_uuid128": "0x00008673", - "gatt_client_discover_primary_services_by_uuid16": "0x000086b7", - "gatt_client_execute_write": "0x000086f3", - "gatt_client_find_included_services_for_service": "0x00008719", - "gatt_client_get_mtu": "0x00008747", - "gatt_client_is_ready": "0x000087e9", - "gatt_client_listen_for_characteristic_value_updates": "0x000087ff", - "gatt_client_prepare_write": "0x00008821", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x0000885d", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x00008887", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x0000888d", - "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x000088bb", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x000088c1", - "gatt_client_read_multiple_characteristic_values": "0x000088ef", - "gatt_client_read_value_of_characteristic_using_value_handle": "0x0000891f", - "gatt_client_read_value_of_characteristics_by_uuid128": "0x0000894d", - "gatt_client_read_value_of_characteristics_by_uuid16": "0x00008999", - "gatt_client_register_handler": "0x000089e5", - "gatt_client_reliable_write_long_value_of_characteristic": "0x000089f1", - "gatt_client_signed_write_without_response": "0x00008e21", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x00008ee5", - "gatt_client_write_client_characteristic_configuration": "0x00008f1f", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x00008f71", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008f81", - "gatt_client_write_long_value_of_characteristic": "0x00008fbd", - "gatt_client_write_long_value_of_characteristic_with_offset": "0x00008fcd", - "gatt_client_write_value_of_characteristic": "0x00009009", - "gatt_client_write_value_of_characteristic_without_response": "0x0000903f", - "hci_add_event_handler": "0x0000a581", - "hci_power_control": "0x0000ad1d", - "hci_register_acl_packet_handler": "0x0000aed1", - "kv_commit": "0x0000b645", - "kv_get": "0x0000b6a1", - "kv_init": "0x0000b6ad", - "kv_init_backend": "0x0000b72d", - "kv_put": "0x0000b741", - "kv_remove": "0x0000b74d", - "kv_remove_all": "0x0000b781", - "kv_value_modified": "0x0000b7b1", - "kv_value_modified_of_key": "0x0000b7cd", - "kv_visit": "0x0000b7d9", - "l2cap_add_event_handler": "0x0000b869", - "l2cap_can_send_packet_now": "0x0000b879", - "l2cap_create_le_credit_based_connection_request": "0x0000ba35", - "l2cap_credit_based_send": "0x0000bb79", - "l2cap_credit_based_send_continue": "0x0000bba5", - "l2cap_disconnect": "0x0000bc21", - "l2cap_get_le_credit_based_connection_credits": "0x0000be71", - "l2cap_get_peer_mtu_for_local_cid": "0x0000be8d", - "l2cap_init": "0x0000c261", - "l2cap_le_send_flow_control_credit": "0x0000c357", - "l2cap_max_le_mtu": "0x0000c661", - "l2cap_register_packet_handler": "0x0000c789", - "l2cap_register_service": "0x0000c795", - "l2cap_request_can_send_now_event": "0x0000c8a5", - "l2cap_request_connection_parameter_update": "0x0000c8bf", - "l2cap_send_echo_request": "0x0000cd99", - "l2cap_unregister_service": "0x0000ce59", - "le_device_db_add": "0x0000ceb1", - "le_device_db_find": "0x0000cf89", - "le_device_db_from_key": "0x0000cfb5", - "le_device_db_iter_cur": "0x0000cfbd", - "le_device_db_iter_cur_key": "0x0000cfc1", - "le_device_db_iter_init": "0x0000cfc5", - "le_device_db_iter_next": "0x0000cfcd", - "le_device_db_remove_key": "0x0000cff3", - "ll_aes_encrypt": "0x0000d021", - "ll_config": "0x0000d09d", - "ll_free": "0x0000d0d3", - "ll_get_heap_free_size": "0x0000d0dd", - "ll_hint_on_ce_len": "0x0000d0f1", - "ll_legacy_adv_set_interval": "0x0000d129", - "ll_malloc": "0x0000d139", - "ll_query_timing_info": "0x0000d271", - "ll_register_hci_acl_previewer": "0x0000d2bd", - "ll_scan_set_fixed_channel": "0x0000d321", - "ll_set_adv_access_address": "0x0000d539", - "ll_set_adv_coded_scheme": "0x0000d545", - "ll_set_conn_acl_report_latency": "0x0000d575", - "ll_set_conn_coded_scheme": "0x0000d5a5", - "ll_set_conn_latency": "0x0000d5d1", - "ll_set_conn_tx_power": "0x0000d601", - "ll_set_def_antenna": "0x0000d649", - "ll_set_initiating_coded_scheme": "0x0000d665", - "ll_set_max_conn_number": "0x0000d671", - "nibble_for_char": "0x0001e6f9", - "platform_32k_rc_auto_tune": "0x0001e7a5", - "platform_32k_rc_tune": "0x0001e821", - "platform_calibrate_32k": "0x0001e835", - "platform_config": "0x0001e839", - "platform_delete_timer": "0x0001e95d", - "platform_enable_irq": "0x0001e965", - "platform_get_current_task": "0x0001e99d", - "platform_get_gen_os_driver": "0x0001e9c1", - "platform_get_heap_status": "0x0001e9c9", - "platform_get_link_layer_interf": "0x0001e9e1", - "platform_get_task_handle": "0x0001e9e9", - "platform_get_timer_counter": "0x0001ea09", - "platform_get_us_time": "0x0001ea0d", - "platform_get_version": "0x0001ea11", - "platform_hrng": "0x0001ea19", - "platform_install_isr_stack": "0x0001ea21", - "platform_install_task_stack": "0x0001ea2d", - "platform_patch_rf_init_data": "0x0001ea65", - "platform_printf": "0x0001ea71", - "platform_raise_assertion": "0x0001ea85", - "platform_rand": "0x0001ea99", - "platform_read_info": "0x0001ea9d", - "platform_read_persistent_reg": "0x0001eacd", - "platform_reset": "0x0001eadd", - "platform_set_abs_timer": "0x0001eb01", - "platform_set_evt_callback": "0x0001eb05", - "platform_set_evt_callback_table": "0x0001eb19", - "platform_set_irq_callback": "0x0001eb25", - "platform_set_irq_callback_table": "0x0001eb41", - "platform_set_rf_clk_source": "0x0001eb4d", - "platform_set_rf_init_data": "0x0001eb59", - "platform_set_rf_power_mapping": "0x0001eb65", - "platform_set_timer": "0x0001eb71", - "platform_shutdown": "0x0001eb75", - "platform_switch_app": "0x0001eb79", - "platform_trace_raw": "0x0001eba5", - "platform_write_persistent_reg": "0x0001ebbd", - "printf_hexdump": "0x0001ed71", - "pvPortMalloc": "0x0001f865", - "pvTaskIncrementMutexHeldCount": "0x0001f94d", - "pvTimerGetTimerID": "0x0001f965", - "pxPortInitialiseStack": "0x0001f991", - "reverse_128": "0x0001fb71", - "reverse_24": "0x0001fb77", - "reverse_256": "0x0001fb7d", - "reverse_48": "0x0001fb83", - "reverse_56": "0x0001fb89", - "reverse_64": "0x0001fb8f", - "reverse_bd_addr": "0x0001fb95", - "reverse_bytes": "0x0001fb9b", - "sm_add_event_handler": "0x0001fe89", - "sm_address_resolution_lookup": "0x0001ffe1", - "sm_authenticated": "0x0002035d", - "sm_authorization_decline": "0x0002036b", - "sm_authorization_grant": "0x0002038b", - "sm_authorization_state": "0x000203ab", - "sm_bonding_decline": "0x000203c5", - "sm_config": "0x00020821", - "sm_config_conn": "0x00020839", - "sm_encryption_key_size": "0x000209ef", - "sm_just_works_confirm": "0x00020f75", - "sm_le_device_key": "0x000212c1", - "sm_passkey_input": "0x00021357", - "sm_private_random_address_generation_get": "0x00021711", - "sm_private_random_address_generation_get_mode": "0x00021719", - "sm_private_random_address_generation_set_mode": "0x00021725", - "sm_private_random_address_generation_set_update_period": "0x0002174d", - "sm_register_external_ltk_callback": "0x00021889", - "sm_register_oob_data_callback": "0x00021895", - "sm_request_pairing": "0x000218a1", - "sm_send_security_request": "0x00022377", - "sm_set_accepted_stk_generation_methods": "0x0002239d", - "sm_set_authentication_requirements": "0x000223a9", - "sm_set_encryption_key_size_range": "0x000223b5", - "sscanf_bd_addr": "0x00022711", - "sysSetPublicDeviceAddr": "0x00022ac5", - "uuid128_to_str": "0x00023265", - "uuid_add_bluetooth_prefix": "0x000232bd", - "uuid_has_bluetooth_prefix": "0x000232dd", - "uxListRemove": "0x000232f9", - "uxQueueMessagesWaiting": "0x00023321", - "uxQueueMessagesWaitingFromISR": "0x00023349", - "uxQueueSpacesAvailable": "0x00023365", - "uxTaskGetStackHighWaterMark": "0x00023391", - "uxTaskPriorityGet": "0x000233b1", - "uxTaskPriorityGetFromISR": "0x000233cd", - "vListInitialise": "0x00023487", - "vListInitialiseItem": "0x0002349d", - "vListInsert": "0x000234a3", - "vListInsertEnd": "0x000234d3", - "vPortEndScheduler": "0x000234ed", - "vPortEnterCritical": "0x00023519", - "vPortExitCritical": "0x0002355d", - "vPortFree": "0x00023591", - "vPortSuppressTicksAndSleep": "0x00023625", - "vPortValidateInterruptPriority": "0x0002374d", - "vQueueDelete": "0x000237a9", - "vQueueWaitForMessageRestricted": "0x000237d5", - "vTaskDelay": "0x0002381d", - "vTaskInternalSetTimeOutState": "0x00023869", - "vTaskMissedYield": "0x00023879", - "vTaskPlaceOnEventList": "0x00023885", - "vTaskPlaceOnEventListRestricted": "0x000238bd", - "vTaskPriorityDisinheritAfterTimeout": "0x000238fd", - "vTaskPrioritySet": "0x000239a9", - "vTaskResume": "0x00023a71", - "vTaskStartScheduler": "0x00023af5", - "vTaskStepTick": "0x00023b85", - "vTaskSuspend": "0x00023bb5", - "vTaskSuspendAll": "0x00023c71", - "vTaskSwitchContext": "0x00023c81", - "xPortStartScheduler": "0x00023d29", - "xQueueAddToSet": "0x00023df1", - "xQueueCreateCountingSemaphore": "0x00023e15", - "xQueueCreateCountingSemaphoreStatic": "0x00023e51", - "xQueueCreateMutex": "0x00023e95", - "xQueueCreateMutexStatic": "0x00023eab", - "xQueueCreateSet": "0x00023ec5", - "xQueueGenericCreate": "0x00023ecd", - "xQueueGenericCreateStatic": "0x00023f19", - "xQueueGenericReset": "0x00023f81", - "xQueueGenericSend": "0x0002400d", - "xQueueGenericSendFromISR": "0x00024179", - "xQueueGiveFromISR": "0x00024239", - "xQueueGiveMutexRecursive": "0x000242dd", - "xQueueIsQueueEmptyFromISR": "0x0002431d", - "xQueueIsQueueFullFromISR": "0x00024341", - "xQueuePeek": "0x00024369", - "xQueuePeekFromISR": "0x00024491", - "xQueueReceive": "0x000244fd", - "xQueueReceiveFromISR": "0x00024629", - "xQueueRemoveFromSet": "0x000246bd", - "xQueueSelectFromSet": "0x000246df", - "xQueueSelectFromSetFromISR": "0x000246f1", - "xQueueSemaphoreTake": "0x00024705", - "xQueueTakeMutexRecursive": "0x00024871", - "xTaskCheckForTimeOut": "0x000248b5", - "xTaskCreate": "0x00024925", - "xTaskCreateStatic": "0x00024981", - "xTaskGetCurrentTaskHandle": "0x000249f1", - "xTaskGetSchedulerState": "0x000249fd", - "xTaskGetTickCount": "0x00024a19", - "xTaskGetTickCountFromISR": "0x00024a25", - "xTaskIncrementTick": "0x00024a35", - "xTaskPriorityDisinherit": "0x00024b01", - "xTaskPriorityInherit": "0x00024b95", - "xTaskRemoveFromEventList": "0x00024c29", - "xTaskResumeAll": "0x00024ca9", - "xTaskResumeFromISR": "0x00024d71", - "xTimerCreate": "0x00024dfd", - "xTimerCreateStatic": "0x00024e31", - "xTimerCreateTimerTask": "0x00024e69", - "xTimerGenericCommand": "0x00024ed5", - "xTimerGetExpiryTime": "0x00024f45", - "xTimerGetTimerDaemonTaskHandle": "0x00024f65" + "att_dispatch_client_can_send_now": "0x000058bd", + "att_dispatch_client_request_can_send_now_event": "0x000058c3", + "att_dispatch_register_client": "0x000058c9", + "att_dispatch_register_server": "0x000058dd", + "att_dispatch_server_can_send_now": "0x000058f1", + "att_dispatch_server_request_can_send_now_event": "0x000058f7", + "att_emit_general_event": "0x000059a9", + "att_server_can_send_packet_now": "0x000060d9", + "att_server_deferred_read_response": "0x000060dd", + "att_server_get_mtu": "0x000060f5", + "att_server_indicate": "0x0000616d", + "att_server_init": "0x000061f1", + "att_server_notify": "0x0000622d", + "att_server_register_packet_handler": "0x00006345", + "att_server_request_can_send_now_event": "0x00006351", + "att_set_db": "0x0000636d", + "att_set_read_callback": "0x00006381", + "att_set_write_callback": "0x0000638d", + "bd_addr_cmp": "0x000064fd", + "bd_addr_copy": "0x00006503", + "bd_addr_to_str": "0x0000650d", + "big_endian_read_16": "0x00006545", + "big_endian_read_32": "0x0000654d", + "big_endian_store_16": "0x00006561", + "big_endian_store_32": "0x0000656d", + "btstack_config": "0x000066c1", + "btstack_memory_pool_create": "0x000067ff", + "btstack_memory_pool_free": "0x00006829", + "btstack_memory_pool_get": "0x00006889", + "btstack_push_user_msg": "0x000068f1", + "btstack_push_user_runnable": "0x000068fd", + "btstack_reset": "0x00006909", + "char_for_nibble": "0x00006be5", + "eTaskConfirmSleepModeStatus": "0x00006ec9", + "gap_add_dev_to_periodic_list": "0x00007535", + "gap_add_whitelist": "0x00007545", + "gap_aes_encrypt": "0x00007551", + "gap_clear_white_lists": "0x00007589", + "gap_clr_adv_set": "0x00007595", + "gap_clr_periodic_adv_list": "0x000075a1", + "gap_create_connection_cancel": "0x000075ad", + "gap_default_periodic_adv_sync_transfer_param": "0x000075b9", + "gap_disconnect": "0x000075d1", + "gap_disconnect_all": "0x000075fd", + "gap_ext_create_connection": "0x0000763d", + "gap_get_connection_parameter_range": "0x00007715", + "gap_le_read_channel_map": "0x00007751", + "gap_periodic_adv_create_sync": "0x000077bd", + "gap_periodic_adv_create_sync_cancel": "0x000077e1", + "gap_periodic_adv_set_info_transfer": "0x000077ed", + "gap_periodic_adv_sync_transfer": "0x000077fd", + "gap_periodic_adv_sync_transfer_param": "0x0000780d", + "gap_periodic_adv_term_sync": "0x00007829", + "gap_read_antenna_info": "0x000078b1", + "gap_read_periodic_adv_list_size": "0x000078bd", + "gap_read_phy": "0x000078c9", + "gap_read_remote_used_features": "0x000078d5", + "gap_read_remote_version": "0x000078e1", + "gap_read_rssi": "0x000078ed", + "gap_remove_whitelist": "0x000078f9", + "gap_rmv_adv_set": "0x00007975", + "gap_rmv_dev_from_periodic_list": "0x00007981", + "gap_rx_test_v2": "0x00007991", + "gap_rx_test_v3": "0x000079a1", + "gap_set_adv_set_random_addr": "0x000079ed", + "gap_set_callback_for_next_hci": "0x00007a29", + "gap_set_connection_cte_request_enable": "0x00007a49", + "gap_set_connection_cte_response_enable": "0x00007a65", + "gap_set_connection_cte_rx_param": "0x00007a75", + "gap_set_connection_cte_tx_param": "0x00007ac9", + "gap_set_connection_parameter_range": "0x00007b15", + "gap_set_connectionless_cte_tx_enable": "0x00007b2d", + "gap_set_connectionless_cte_tx_param": "0x00007b3d", + "gap_set_connectionless_iq_sampling_enable": "0x00007b99", + "gap_set_data_length": "0x00007bf5", + "gap_set_def_phy": "0x00007c0d", + "gap_set_ext_adv_data": "0x00007c1d", + "gap_set_ext_adv_enable": "0x00007c35", + "gap_set_ext_adv_para": "0x00007ca5", + "gap_set_ext_scan_enable": "0x00007d7d", + "gap_set_ext_scan_para": "0x00007d95", + "gap_set_ext_scan_response_data": "0x00007e35", + "gap_set_host_channel_classification": "0x00007e4d", + "gap_set_periodic_adv_data": "0x00007e5d", + "gap_set_periodic_adv_enable": "0x00007ecd", + "gap_set_periodic_adv_para": "0x00007edd", + "gap_set_periodic_adv_rx_enable": "0x00007ef5", + "gap_set_phy": "0x00007f05", + "gap_set_random_device_address": "0x00007f21", + "gap_start_ccm": "0x00007f51", + "gap_test_end": "0x00007f99", + "gap_tx_test_v2": "0x00007fa5", + "gap_tx_test_v4": "0x00007fbd", + "gap_update_connection_parameters": "0x00007fe1", + "gap_vendor_tx_continuous_wave": "0x00008025", + "gatt_client_cancel_write": "0x0000854d", + "gatt_client_discover_characteristic_descriptors": "0x00008573", + "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x000085b3", + "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x00008603", + "gatt_client_discover_characteristics_for_service": "0x00008653", + "gatt_client_discover_primary_services": "0x00008689", + "gatt_client_discover_primary_services_by_uuid128": "0x000086bb", + "gatt_client_discover_primary_services_by_uuid16": "0x000086ff", + "gatt_client_execute_write": "0x0000873b", + "gatt_client_find_included_services_for_service": "0x00008761", + "gatt_client_get_mtu": "0x0000878f", + "gatt_client_is_ready": "0x00008831", + "gatt_client_listen_for_characteristic_value_updates": "0x00008847", + "gatt_client_prepare_write": "0x00008869", + "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x000088a5", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x000088cf", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x000088d5", + "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x00008903", + "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x00008909", + "gatt_client_read_multiple_characteristic_values": "0x00008937", + "gatt_client_read_value_of_characteristic_using_value_handle": "0x00008967", + "gatt_client_read_value_of_characteristics_by_uuid128": "0x00008995", + "gatt_client_read_value_of_characteristics_by_uuid16": "0x000089e1", + "gatt_client_register_handler": "0x00008a2d", + "gatt_client_reliable_write_long_value_of_characteristic": "0x00008a39", + "gatt_client_signed_write_without_response": "0x00008e69", + "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x00008f2d", + "gatt_client_write_client_characteristic_configuration": "0x00008f67", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x00008fb9", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x00008fc9", + "gatt_client_write_long_value_of_characteristic": "0x00009005", + "gatt_client_write_long_value_of_characteristic_with_offset": "0x00009015", + "gatt_client_write_value_of_characteristic": "0x00009051", + "gatt_client_write_value_of_characteristic_without_response": "0x00009087", + "hci_add_event_handler": "0x0000a5c9", + "hci_power_control": "0x0000ad65", + "hci_register_acl_packet_handler": "0x0000af19", + "kv_commit": "0x0000b68d", + "kv_get": "0x0000b6e9", + "kv_init": "0x0000b6f5", + "kv_init_backend": "0x0000b775", + "kv_put": "0x0000b789", + "kv_remove": "0x0000b795", + "kv_remove_all": "0x0000b7c9", + "kv_value_modified": "0x0000b7f9", + "kv_value_modified_of_key": "0x0000b815", + "kv_visit": "0x0000b821", + "l2cap_add_event_handler": "0x0000b8b1", + "l2cap_can_send_packet_now": "0x0000b8c1", + "l2cap_create_le_credit_based_connection_request": "0x0000ba7d", + "l2cap_credit_based_send": "0x0000bbc1", + "l2cap_credit_based_send_continue": "0x0000bbed", + "l2cap_disconnect": "0x0000bc69", + "l2cap_get_le_credit_based_connection_credits": "0x0000beb9", + "l2cap_get_peer_mtu_for_local_cid": "0x0000bed5", + "l2cap_init": "0x0000c2a9", + "l2cap_le_send_flow_control_credit": "0x0000c39f", + "l2cap_max_le_mtu": "0x0000c6a9", + "l2cap_register_packet_handler": "0x0000c7d1", + "l2cap_register_service": "0x0000c7dd", + "l2cap_request_can_send_now_event": "0x0000c8ed", + "l2cap_request_connection_parameter_update": "0x0000c907", + "l2cap_send_echo_request": "0x0000cde1", + "l2cap_unregister_service": "0x0000cea1", + "le_device_db_add": "0x0000cef9", + "le_device_db_find": "0x0000cfd1", + "le_device_db_from_key": "0x0000cffd", + "le_device_db_iter_cur": "0x0000d005", + "le_device_db_iter_cur_key": "0x0000d009", + "le_device_db_iter_init": "0x0000d00d", + "le_device_db_iter_next": "0x0000d015", + "le_device_db_remove_key": "0x0000d03b", + "ll_aes_encrypt": "0x0000d069", + "ll_config": "0x0000d0e5", + "ll_free": "0x0000d11b", + "ll_get_heap_free_size": "0x0000d125", + "ll_hint_on_ce_len": "0x0000d139", + "ll_legacy_adv_set_interval": "0x0000d171", + "ll_malloc": "0x0000d181", + "ll_query_timing_info": "0x0000d2b9", + "ll_register_hci_acl_previewer": "0x0000d305", + "ll_scan_set_fixed_channel": "0x0000d369", + "ll_set_adv_access_address": "0x0000d581", + "ll_set_adv_coded_scheme": "0x0000d58d", + "ll_set_conn_acl_report_latency": "0x0000d5bd", + "ll_set_conn_coded_scheme": "0x0000d5ed", + "ll_set_conn_latency": "0x0000d619", + "ll_set_conn_tx_power": "0x0000d649", + "ll_set_def_antenna": "0x0000d691", + "ll_set_initiating_coded_scheme": "0x0000d6ad", + "ll_set_max_conn_number": "0x0000d6b9", + "nibble_for_char": "0x0001e741", + "platform_32k_rc_auto_tune": "0x0001e7ed", + "platform_32k_rc_tune": "0x0001e869", + "platform_calibrate_32k": "0x0001e87d", + "platform_call_on_stack": "0x00004183", + "platform_config": "0x0001e881", + "platform_delete_timer": "0x0001e9a5", + "platform_enable_irq": "0x0001e9ad", + "platform_get_current_task": "0x0001e9e5", + "platform_get_gen_os_driver": "0x0001ea09", + "platform_get_heap_status": "0x0001ea11", + "platform_get_link_layer_interf": "0x0001ea29", + "platform_get_task_handle": "0x0001ea31", + "platform_get_timer_counter": "0x0001ea51", + "platform_get_us_time": "0x0001ea55", + "platform_get_version": "0x0001ea59", + "platform_hrng": "0x0001ea61", + "platform_install_isr_stack": "0x0001ea69", + "platform_install_task_stack": "0x0001ea75", + "platform_patch_rf_init_data": "0x0001eaad", + "platform_printf": "0x0001eab9", + "platform_raise_assertion": "0x0001eacd", + "platform_rand": "0x0001eae1", + "platform_read_info": "0x0001eae5", + "platform_read_persistent_reg": "0x0001eb15", + "platform_reset": "0x0001eb25", + "platform_set_abs_timer": "0x0001eb49", + "platform_set_evt_callback": "0x0001eb4d", + "platform_set_evt_callback_table": "0x0001eb61", + "platform_set_irq_callback": "0x0001eb6d", + "platform_set_irq_callback_table": "0x0001eb89", + "platform_set_rf_clk_source": "0x0001eb95", + "platform_set_rf_init_data": "0x0001eba1", + "platform_set_rf_power_mapping": "0x0001ebad", + "platform_set_timer": "0x0001ebb9", + "platform_shutdown": "0x0001ebbd", + "platform_switch_app": "0x0001ebc1", + "platform_trace_raw": "0x0001ebed", + "platform_write_persistent_reg": "0x0001ec05", + "printf_hexdump": "0x0001edb9", + "pvPortMalloc": "0x0001f8ad", + "pvTaskIncrementMutexHeldCount": "0x0001f995", + "pvTimerGetTimerID": "0x0001f9ad", + "pxPortInitialiseStack": "0x0001f9d9", + "reverse_128": "0x0001fbb9", + "reverse_24": "0x0001fbbf", + "reverse_256": "0x0001fbc5", + "reverse_48": "0x0001fbcb", + "reverse_56": "0x0001fbd1", + "reverse_64": "0x0001fbd7", + "reverse_bd_addr": "0x0001fbdd", + "reverse_bytes": "0x0001fbe3", + "sm_add_event_handler": "0x0001fed1", + "sm_address_resolution_lookup": "0x00020029", + "sm_authenticated": "0x000203a5", + "sm_authorization_decline": "0x000203b3", + "sm_authorization_grant": "0x000203d3", + "sm_authorization_state": "0x000203f3", + "sm_bonding_decline": "0x0002040d", + "sm_config": "0x00020869", + "sm_config_conn": "0x00020881", + "sm_encryption_key_size": "0x00020a37", + "sm_just_works_confirm": "0x00020fbd", + "sm_le_device_key": "0x00021309", + "sm_passkey_input": "0x0002139f", + "sm_private_random_address_generation_get": "0x00021759", + "sm_private_random_address_generation_get_mode": "0x00021761", + "sm_private_random_address_generation_set_mode": "0x0002176d", + "sm_private_random_address_generation_set_update_period": "0x00021795", + "sm_register_external_ltk_callback": "0x000218d1", + "sm_register_oob_data_callback": "0x000218dd", + "sm_request_pairing": "0x000218e9", + "sm_send_security_request": "0x000223bf", + "sm_set_accepted_stk_generation_methods": "0x000223e5", + "sm_set_authentication_requirements": "0x000223f1", + "sm_set_encryption_key_size_range": "0x000223fd", + "sscanf_bd_addr": "0x00022759", + "sysSetPublicDeviceAddr": "0x00022b0d", + "uuid128_to_str": "0x000232ad", + "uuid_add_bluetooth_prefix": "0x00023305", + "uuid_has_bluetooth_prefix": "0x00023325", + "uxListRemove": "0x00023341", + "uxQueueMessagesWaiting": "0x00023369", + "uxQueueMessagesWaitingFromISR": "0x00023391", + "uxQueueSpacesAvailable": "0x000233ad", + "uxTaskGetStackHighWaterMark": "0x000233d9", + "uxTaskPriorityGet": "0x000233f9", + "uxTaskPriorityGetFromISR": "0x00023415", + "vListInitialise": "0x000234cf", + "vListInitialiseItem": "0x000234e5", + "vListInsert": "0x000234eb", + "vListInsertEnd": "0x0002351b", + "vPortEndScheduler": "0x00023535", + "vPortEnterCritical": "0x00023561", + "vPortExitCritical": "0x000235a5", + "vPortFree": "0x000235d9", + "vPortSuppressTicksAndSleep": "0x0002366d", + "vPortValidateInterruptPriority": "0x00023795", + "vQueueDelete": "0x000237f1", + "vQueueWaitForMessageRestricted": "0x0002381d", + "vTaskDelay": "0x00023865", + "vTaskInternalSetTimeOutState": "0x000238b1", + "vTaskMissedYield": "0x000238c1", + "vTaskPlaceOnEventList": "0x000238cd", + "vTaskPlaceOnEventListRestricted": "0x00023905", + "vTaskPriorityDisinheritAfterTimeout": "0x00023945", + "vTaskPrioritySet": "0x000239f1", + "vTaskResume": "0x00023ab9", + "vTaskStartScheduler": "0x00023b3d", + "vTaskStepTick": "0x00023bcd", + "vTaskSuspend": "0x00023bfd", + "vTaskSuspendAll": "0x00023cb9", + "vTaskSwitchContext": "0x00023cc9", + "xPortStartScheduler": "0x00023d71", + "xQueueAddToSet": "0x00023e39", + "xQueueCreateCountingSemaphore": "0x00023e5d", + "xQueueCreateCountingSemaphoreStatic": "0x00023e99", + "xQueueCreateMutex": "0x00023edd", + "xQueueCreateMutexStatic": "0x00023ef3", + "xQueueCreateSet": "0x00023f0d", + "xQueueGenericCreate": "0x00023f15", + "xQueueGenericCreateStatic": "0x00023f61", + "xQueueGenericReset": "0x00023fc9", + "xQueueGenericSend": "0x00024055", + "xQueueGenericSendFromISR": "0x000241c1", + "xQueueGiveFromISR": "0x00024281", + "xQueueGiveMutexRecursive": "0x00024325", + "xQueueIsQueueEmptyFromISR": "0x00024365", + "xQueueIsQueueFullFromISR": "0x00024389", + "xQueuePeek": "0x000243b1", + "xQueuePeekFromISR": "0x000244d9", + "xQueueReceive": "0x00024545", + "xQueueReceiveFromISR": "0x00024671", + "xQueueRemoveFromSet": "0x00024705", + "xQueueSelectFromSet": "0x00024727", + "xQueueSelectFromSetFromISR": "0x00024739", + "xQueueSemaphoreTake": "0x0002474d", + "xQueueTakeMutexRecursive": "0x000248b9", + "xTaskCheckForTimeOut": "0x000248fd", + "xTaskCreate": "0x0002496d", + "xTaskCreateStatic": "0x000249c9", + "xTaskGetCurrentTaskHandle": "0x00024a39", + "xTaskGetSchedulerState": "0x00024a45", + "xTaskGetTickCount": "0x00024a61", + "xTaskGetTickCountFromISR": "0x00024a6d", + "xTaskIncrementTick": "0x00024a7d", + "xTaskPriorityDisinherit": "0x00024b49", + "xTaskPriorityInherit": "0x00024bdd", + "xTaskRemoveFromEventList": "0x00024c71", + "xTaskResumeAll": "0x00024cf1", + "xTaskResumeFromISR": "0x00024db9", + "xTimerCreate": "0x00024e45", + "xTimerCreateStatic": "0x00024e79", + "xTimerCreateTimerTask": "0x00024eb1", + "xTimerGenericCommand": "0x00024f1d", + "xTimerGetExpiryTime": "0x00024f8d", + "xTimerGetTimerDaemonTaskHandle": "0x00024fad" } \ No newline at end of file diff --git a/bundles/typical/ING9188xx/meta.json b/bundles/typical/ING9188xx/meta.json index aafe4e04a..a3b333d0e 100644 --- a/bundles/typical/ING9188xx/meta.json +++ b/bundles/typical/ING9188xx/meta.json @@ -8,11 +8,11 @@ }, "rom": { "base": 16384, - "size": 141740 + "size": 141808 }, "version": [ 1, 9, - 38 + 39 ] } \ No newline at end of file diff --git a/bundles/typical/ING9188xx/platform.bin b/bundles/typical/ING9188xx/platform.bin index 176bb3d6b3137936191082821d33516bc31c13f5..8a72c518cf959997e364de023aedbfe95ba725bf 100644 GIT binary patch delta 7029 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 Nl7GcOV@;Au{vTVikw{A+W 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 diff --git a/bundles/typical/inc/gap.h b/bundles/typical/inc/gap.h index 68eee5323..595bde525 100644 --- a/bundles/typical/inc/gap.h +++ b/bundles/typical/inc/gap.h @@ -1287,7 +1287,7 @@ uint8_t gap_rx_test_v2(uint8_t rx_channel, uint8_t phy, uint8_t modulation_index uint8_t gap_rx_test_v3(uint8_t rx_channel, uint8_t phy, uint8_t modulation_index, uint8_t expected_cte_length, uint8_t expected_cte_type, uint8_t slot_durations, - uint8_t switching_pattern_length, uint8_t *antenna_ids); + uint8_t switching_pattern_length, const uint8_t *antenna_ids); /** * @brief Start a test where the DUT generates test reference packets at a fixed interval. @@ -1324,7 +1324,7 @@ uint8_t gap_tx_test_v2(uint8_t tx_channel, uint8_t test_data_length, uint8_t gap_tx_test_v4(uint8_t tx_channel, uint8_t test_data_length, uint8_t packet_payload, uint8_t phy, uint8_t cte_length, uint8_t cte_type, - uint8_t switching_pattern_length, uint8_t *antenna_ids, + uint8_t switching_pattern_length, const uint8_t *antenna_ids, int8_t tx_power_level); /** diff --git a/bundles/typical/inc/ll_api.h b/bundles/typical/inc/ll_api.h index 254e9e756..275c71b50 100644 --- a/bundles/typical/inc/ll_api.h +++ b/bundles/typical/inc/ll_api.h @@ -98,6 +98,59 @@ void ll_set_initiating_coded_scheme(const coded_scheme_t scheme); */ void ll_hint_on_ce_len(const uint16_t conn_handle, const uint16_t min_ce_len, const uint16_t max_ce_len); +/** + **************************************************************************************** + * @brief Create a connection directly (without advertising & initiating) + * + * @param[in] role connection role. master (0), slave (1) + * @param[in] addr_types address types for advertiser and initiator + * bit [0] for slave, bit [1] for master + * 0: public address; 1: random address + * @param[in] adv_addr address of advertiser + * @param[in] init_addr address of initiator + * @param[in] rx_phy Rx PHY (1: 1M, 2: 2M, 3: Coded) + * @param[in] tx_phy Tx PHY (1: 1M, 2: 2M, 3: Coded) + * @param[in] access_addr access address + * @param[in] crc_init CRC init + * @param[in] interval connection interval (unit: us) + * @param[in] sup_timeout supervision timeout (unit: 10ms) + * @param[in] channel_map channel map + * @param[in] ch_sel_algo channel selection algorithm (1 or 2) + * @param[in] hop_inc hop increment for CSA#1 ([5..16]) + * @param[in] min_ce_len information parameter about the minimum length of connection + * event needed for this LE connection. + * @param[in] max_ce_len information parameter about the maximum length of connection + * event needed for this LE connection. + * @param[in] start_time start time of the 1st connectin event + * @param[in] slave_latency slave latency + * @param[in] sleep_clk_acc sleep clock accuracy + * @param[in] sync_window slave's sync window for 1st connection event + * @return 0 if successful else error code + **************************************************************************************** + */ +// int ll_create_conn( +// uint8_t role, +// uint8_t addr_types, +// const uint8_t *adv_addr, +// const uint8_t *init_addr, +// uint8_t rx_phy, +// uint8_t tx_phy, +// uint32_t access_addr, +// uint32_t crc_init, +// uint32_t interval, +// uint16_t sup_timeout, +// const uint8_t *channel_map, +// uint8_t ch_sel_algo, +// uint8_t hop_inc, +// uint16_t min_ce_len, +// uint16_t max_ce_len, +// uint64_t start_time, +// uint16_t slave_latency, +// uint8_t sleep_clk_acc, +// uint32_t sync_window); +// WARNING: ^^^ this API is not available in this release + + /** **************************************************************************************** * @brief Set tx power of a connection diff --git a/example_host/rpc_client/inc/brpc_calls.inc b/example_host/rpc_client/inc/brpc_calls.inc index 2718057d8..1c44cf392 100644 --- a/example_host/rpc_client/inc/brpc_calls.inc +++ b/example_host/rpc_client/inc/brpc_calls.inc @@ -23,7 +23,7 @@ struct _param { #pragma pack (pop) struct node * _node = call_fun(1004,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} void platform_config(const platform_cfg_item_t item, - const uint32_t flag){LOG_D("platform_config...");; +const uint32_t flag){LOG_D("platform_config...");; #pragma pack (push, 1) struct _param { const platform_cfg_item_t item;const uint32_t flag;} _param = {.item = item, @@ -78,13 +78,12 @@ struct _param { platform_task_id_t id;} _param = {.id = id}; #pragma pack (pop) struct node * _node = call_fun(1013,&_param,sizeof(_param));uintptr_t _r= *(uintptr_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} -void gap_set_random_device_address(const uint8_t * address){LOG_D("gap_set_random_device_address...");remote_mem_map(address, BD_ADDR_LEN * sizeof(* address)); -; +uint8_t gap_set_random_device_address(const uint8_t * address){LOG_D("gap_set_random_device_address...");remote_mem_map(address, BD_ADDR_LEN * sizeof(* address)); #pragma pack (push, 1) struct _param { const uint8_t * address;} _param = {.address = address}; #pragma pack (pop) -call_void_fun(1014,&_param,sizeof(_param));} +struct node * _node = call_fun(1014,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_disconnect(hci_con_handle_t handle){LOG_D("gap_disconnect...");; #pragma pack (push, 1) struct _param { @@ -98,8 +97,7 @@ struct _param { #pragma pack (pop) call_void_fun(1016,&_param,sizeof(_param));} uint8_t gap_add_whitelist(const uint8_t * address, - bd_addr_type_t addtype){LOG_D("gap_add_whitelist...");remote_mem_map(address, BD_ADDR_LEN * sizeof(* address)); -; +bd_addr_type_t addtype){LOG_D("gap_add_whitelist...");remote_mem_map(address, BD_ADDR_LEN * sizeof(* address)); #pragma pack (push, 1) struct _param { const uint8_t * address;bd_addr_type_t addtype;} _param = {.address = address, @@ -107,8 +105,7 @@ const uint8_t * address;bd_addr_type_t addtype;} _param = {.address = address, #pragma pack (pop) struct node * _node = call_fun(1017,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_remove_whitelist(const uint8_t * address, - bd_addr_type_t addtype){LOG_D("gap_remove_whitelist...");remote_mem_map(address, BD_ADDR_LEN * sizeof(* address)); -; +bd_addr_type_t addtype){LOG_D("gap_remove_whitelist...");remote_mem_map(address, BD_ADDR_LEN * sizeof(* address)); #pragma pack (push, 1) struct _param { const uint8_t * address;bd_addr_type_t addtype;} _param = {.address = address, @@ -152,8 +149,8 @@ const uint16_t con_handle;} _param = {.con_handle = con_handle}; #pragma pack (pop) struct node * _node = call_fun(1024,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_set_def_phy(const uint8_t all_phys, - const phy_bittypes_t tx_phys, - const phy_bittypes_t rx_phys){LOG_D("gap_set_def_phy...");; +const phy_bittypes_t tx_phys, +const phy_bittypes_t rx_phys){LOG_D("gap_set_def_phy...");; #pragma pack (push, 1) struct _param { const uint8_t all_phys;const phy_bittypes_t tx_phys;const phy_bittypes_t rx_phys;} _param = {.all_phys = all_phys, @@ -162,10 +159,10 @@ const uint8_t all_phys;const phy_bittypes_t tx_phys;const phy_bittypes_t rx_phys #pragma pack (pop) struct node * _node = call_fun(1025,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gap_set_phy...");; +const uint8_t all_phys, +const phy_bittypes_t tx_phys, +const phy_bittypes_t rx_phys, +const phy_option_t phy_opt){LOG_D("gap_set_phy...");; #pragma pack (push, 1) struct _param { 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;} _param = {.con_handle = con_handle, @@ -176,8 +173,7 @@ const uint16_t con_handle;const uint8_t all_phys;const phy_bittypes_t tx_phys;co #pragma pack (pop) struct node * _node = call_fun(1026,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_set_adv_set_random_addr(const uint8_t adv_handle, - const uint8_t * random_addr){LOG_D("gap_set_adv_set_random_addr...");remote_mem_map(random_addr, BD_ADDR_LEN * sizeof(* random_addr)); -; +const uint8_t * random_addr){LOG_D("gap_set_adv_set_random_addr...");remote_mem_map(random_addr, BD_ADDR_LEN * sizeof(* random_addr)); #pragma pack (push, 1) struct _param { const uint8_t adv_handle;const uint8_t * random_addr;} _param = {.adv_handle = adv_handle, @@ -185,10 +181,9 @@ const uint8_t adv_handle;const uint8_t * random_addr;} _param = {.adv_handle = a #pragma pack (pop) struct node * _node = call_fun(1027,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_set_ext_scan_para(const bd_addr_type_t own_addr_type, - const scan_filter_policy_t filter, - const uint8_t config_num, - const scan_phy_config_t * configs){LOG_D("gap_set_ext_scan_para...");remote_mem_map(configs, config_num * sizeof(* configs)); -; +const scan_filter_policy_t filter, +const uint8_t config_num, +const scan_phy_config_t * configs){LOG_D("gap_set_ext_scan_para...");remote_mem_map(configs, config_num * sizeof(* configs)); #pragma pack (push, 1) struct _param { const bd_addr_type_t own_addr_type;const scan_filter_policy_t filter;const uint8_t config_num;const scan_phy_config_t * configs;} _param = {.own_addr_type = own_addr_type, @@ -198,9 +193,8 @@ const bd_addr_type_t own_addr_type;const scan_filter_policy_t filter;const uint8 #pragma pack (pop) struct node * _node = call_fun(1028,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_set_ext_scan_response_data(const uint8_t adv_handle, - const uint16_t length, - const uint8_t * data){LOG_D("gap_set_ext_scan_response_data...");remote_mem_map(data, length * sizeof(* data)); -; +const uint16_t length, +const uint8_t * data){LOG_D("gap_set_ext_scan_response_data...");remote_mem_map(data, length * sizeof(* data)); #pragma pack (push, 1) struct _param { const uint8_t adv_handle;const uint16_t length;const uint8_t * data;} _param = {.adv_handle = adv_handle, @@ -209,9 +203,9 @@ const uint8_t adv_handle;const uint16_t length;const uint8_t * data;} _param = { #pragma pack (pop) struct node * _node = call_fun(1029,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_set_ext_scan_enable(const uint8_t enable, - const uint8_t filter, - const uint16_t duration, - const uint16_t period){LOG_D("gap_set_ext_scan_enable...");; +const uint8_t filter, +const uint16_t duration, +const uint16_t period){LOG_D("gap_set_ext_scan_enable...");; #pragma pack (push, 1) struct _param { const uint8_t enable;const uint8_t filter;const uint16_t duration;const uint16_t period;} _param = {.enable = enable, @@ -221,9 +215,8 @@ const uint8_t enable;const uint8_t filter;const uint16_t duration;const uint16_t #pragma pack (pop) struct node * _node = call_fun(1030,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_set_ext_adv_enable(const uint8_t enable, - const uint8_t set_number, - const ext_adv_set_en_t * adv_sets){LOG_D("gap_set_ext_adv_enable...");remote_mem_map(adv_sets, set_number * sizeof(* adv_sets)); -; +const uint8_t set_number, +const ext_adv_set_en_t * adv_sets){LOG_D("gap_set_ext_adv_enable...");remote_mem_map(adv_sets, set_number * sizeof(* adv_sets)); #pragma pack (push, 1) struct _param { const uint8_t enable;const uint8_t set_number;const ext_adv_set_en_t * adv_sets;} _param = {.enable = enable, @@ -232,21 +225,20 @@ const uint8_t enable;const uint8_t set_number;const ext_adv_set_en_t * adv_sets; #pragma pack (pop) struct node * _node = call_fun(1031,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gap_set_ext_adv_para...");remote_mem_map(peer_addr, BD_ADDR_LEN * sizeof(* peer_addr)); -; +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){LOG_D("gap_set_ext_adv_para...");remote_mem_map(peer_addr, BD_ADDR_LEN * sizeof(* peer_addr)); #pragma pack (push, 1) struct _param { 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;} _param = {.adv_handle = adv_handle, @@ -267,9 +259,8 @@ const uint8_t adv_handle;const adv_event_properties_t properties;const uint32_t #pragma pack (pop) struct node * _node = call_fun(1032,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_set_ext_adv_data(const uint8_t adv_handle, - uint16_t length, - const uint8_t * data){LOG_D("gap_set_ext_adv_data...");remote_mem_map(data, length * sizeof(* data)); -; +uint16_t length, +const uint8_t * data){LOG_D("gap_set_ext_adv_data...");remote_mem_map(data, length * sizeof(* data)); #pragma pack (push, 1) struct _param { const uint8_t adv_handle;uint16_t length;const uint8_t * data;} _param = {.adv_handle = adv_handle, @@ -278,9 +269,8 @@ const uint8_t adv_handle;uint16_t length;const uint8_t * data;} _param = {.adv_h #pragma pack (pop) struct node * _node = call_fun(1033,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_set_periodic_adv_data(const uint8_t adv_handle, - uint16_t length, - const uint8_t * data){LOG_D("gap_set_periodic_adv_data...");remote_mem_map(data, length * sizeof(* data)); -; +uint16_t length, +const uint8_t * data){LOG_D("gap_set_periodic_adv_data...");remote_mem_map(data, length * sizeof(* data)); #pragma pack (push, 1) struct _param { const uint8_t adv_handle;uint16_t length;const uint8_t * data;} _param = {.adv_handle = adv_handle, @@ -289,7 +279,7 @@ const uint8_t adv_handle;uint16_t length;const uint8_t * data;} _param = {.adv_h #pragma pack (pop) struct node * _node = call_fun(1034,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_set_periodic_adv_enable(const uint8_t enable, - const uint8_t adv_handle){LOG_D("gap_set_periodic_adv_enable...");; +const uint8_t adv_handle){LOG_D("gap_set_periodic_adv_enable...");; #pragma pack (push, 1) struct _param { const uint8_t enable;const uint8_t adv_handle;} _param = {.enable = enable, @@ -297,9 +287,9 @@ const uint8_t enable;const uint8_t adv_handle;} _param = {.enable = enable, #pragma pack (pop) struct node * _node = call_fun(1035,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gap_set_periodic_adv_para...");; +const uint16_t interval_min, +const uint16_t interval_max, +const periodic_adv_properties_t properties){LOG_D("gap_set_periodic_adv_para...");; #pragma pack (push, 1) struct _param { const uint8_t adv_handle;const uint16_t interval_min;const uint16_t interval_max;const periodic_adv_properties_t properties;} _param = {.adv_handle = adv_handle, @@ -321,13 +311,12 @@ const uint8_t adv_handle;} _param = {.adv_handle = adv_handle}; #pragma pack (pop) struct node * _node = call_fun(1038,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gap_periodic_adv_create_sync...");remote_mem_map(addr, BD_ADDR_LEN * sizeof(* addr)); -; +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){LOG_D("gap_periodic_adv_create_sync...");remote_mem_map(addr, BD_ADDR_LEN * sizeof(* addr)); #pragma pack (push, 1) struct _param { 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;} _param = {.filter_policy = filter_policy, @@ -352,9 +341,8 @@ const uint16_t sync_handle;} _param = {.sync_handle = sync_handle}; #pragma pack (pop) struct node * _node = call_fun(1041,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_add_dev_to_periodic_list(const uint8_t addr_type, - const uint8_t * addr, - const uint8_t sid){LOG_D("gap_add_dev_to_periodic_list...");remote_mem_map(addr, BD_ADDR_LEN * sizeof(* addr)); -; +const uint8_t * addr, +const uint8_t sid){LOG_D("gap_add_dev_to_periodic_list...");remote_mem_map(addr, BD_ADDR_LEN * sizeof(* addr)); #pragma pack (push, 1) struct _param { const uint8_t addr_type;const uint8_t * addr;const uint8_t sid;} _param = {.addr_type = addr_type, @@ -363,9 +351,8 @@ const uint8_t addr_type;const uint8_t * addr;const uint8_t sid;} _param = {.addr #pragma pack (pop) struct node * _node = call_fun(1042,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_rmv_dev_from_periodic_list(const uint8_t addr_type, - const uint8_t * addr, - const uint8_t sid){LOG_D("gap_rmv_dev_from_periodic_list...");remote_mem_map(addr, BD_ADDR_LEN * sizeof(* addr)); -; +const uint8_t * addr, +const uint8_t sid){LOG_D("gap_rmv_dev_from_periodic_list...");remote_mem_map(addr, BD_ADDR_LEN * sizeof(* addr)); #pragma pack (push, 1) struct _param { const uint8_t addr_type;const uint8_t * addr;const uint8_t sid;} _param = {.addr_type = addr_type, @@ -386,13 +373,11 @@ struct _param { #pragma pack (pop) struct node * _node = call_fun(1045,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gap_ext_create_connection...");remote_mem_map(peer_addr, BD_ADDR_LEN * sizeof(* peer_addr)); -remote_mem_map(phy_configs, initiating_phy_num * sizeof(* phy_configs)); -; +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){LOG_D("gap_ext_create_connection...");remote_mem_map(peer_addr, BD_ADDR_LEN * sizeof(* peer_addr));remote_mem_map(phy_configs, initiating_phy_num * sizeof(*phy_configs)); #pragma pack (push, 1) struct _param { 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;} _param = {.filter_policy = filter_policy, @@ -410,8 +395,8 @@ struct _param { #pragma pack (pop) struct node * _node = call_fun(1047,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_set_data_length(uint16_t connection_handle, - uint16_t tx_octets, - uint16_t tx_time){LOG_D("gap_set_data_length...");; +uint16_t tx_octets, +uint16_t tx_time){LOG_D("gap_set_data_length...");; #pragma pack (push, 1) struct _param { uint16_t connection_handle;uint16_t tx_octets;uint16_t tx_time;} _param = {.connection_handle = connection_handle, @@ -420,12 +405,11 @@ uint16_t connection_handle;uint16_t tx_octets;uint16_t tx_time;} _param = {.conn #pragma pack (pop) struct node * _node = call_fun(1048,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gap_set_connectionless_cte_tx_param...");remote_mem_map(antenna_ids, switching_pattern_len * sizeof(* antenna_ids)); -; +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){LOG_D("gap_set_connectionless_cte_tx_param...");remote_mem_map(antenna_ids, switching_pattern_len * sizeof(* antenna_ids)); #pragma pack (push, 1) struct _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;} _param = {.adv_handle = adv_handle, @@ -437,7 +421,7 @@ const uint8_t adv_handle;const uint8_t cte_len;const cte_type_t cte_type;const u #pragma pack (pop) struct node * _node = call_fun(1049,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_set_connectionless_cte_tx_enable(const uint8_t adv_handle, - const uint8_t cte_enable){LOG_D("gap_set_connectionless_cte_tx_enable...");; +const uint8_t cte_enable){LOG_D("gap_set_connectionless_cte_tx_enable...");; #pragma pack (push, 1) struct _param { const uint8_t adv_handle;const uint8_t cte_enable;} _param = {.adv_handle = adv_handle, @@ -445,12 +429,11 @@ const uint8_t adv_handle;const uint8_t cte_enable;} _param = {.adv_handle = adv_ #pragma pack (pop) struct node * _node = call_fun(1050,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_set_connectionless_iq_sampling_enable(const uint16_t sync_handle, - const uint8_t sampling_enable, - const cte_slot_duration_type_t slot_durations, - const uint8_t max_sampled_ctes, - const uint8_t switching_pattern_len, - const uint8_t * antenna_ids){LOG_D("gap_set_connectionless_iq_sampling_enable...");remote_mem_map(antenna_ids, switching_pattern_len * sizeof(* antenna_ids)); -; +const uint8_t sampling_enable, +const cte_slot_duration_type_t slot_durations, +const uint8_t max_sampled_ctes, +const uint8_t switching_pattern_len, +const uint8_t * antenna_ids){LOG_D("gap_set_connectionless_iq_sampling_enable...");remote_mem_map(antenna_ids, switching_pattern_len * sizeof(* antenna_ids)); #pragma pack (push, 1) struct _param { const uint16_t sync_handle;const uint8_t sampling_enable;const cte_slot_duration_type_t slot_durations;const uint8_t max_sampled_ctes;const uint8_t switching_pattern_len;const uint8_t * antenna_ids;} _param = {.sync_handle = sync_handle, @@ -462,11 +445,10 @@ const uint16_t sync_handle;const uint8_t sampling_enable;const cte_slot_duration #pragma pack (pop) struct node * _node = call_fun(1051,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_set_connection_cte_rx_param(const hci_con_handle_t conn_handle, - const uint8_t sampling_enable, - const cte_slot_duration_type_t slot_durations, - const uint8_t switching_pattern_len, - const uint8_t * antenna_ids){LOG_D("gap_set_connection_cte_rx_param...");remote_mem_map(antenna_ids, switching_pattern_len * sizeof(* antenna_ids)); -; +const uint8_t sampling_enable, +const cte_slot_duration_type_t slot_durations, +const uint8_t switching_pattern_len, +const uint8_t * antenna_ids){LOG_D("gap_set_connection_cte_rx_param...");remote_mem_map(antenna_ids, switching_pattern_len * sizeof(* antenna_ids)); #pragma pack (push, 1) struct _param { const hci_con_handle_t conn_handle;const uint8_t sampling_enable;const cte_slot_duration_type_t slot_durations;const uint8_t switching_pattern_len;const uint8_t * antenna_ids;} _param = {.conn_handle = conn_handle, @@ -477,10 +459,9 @@ const hci_con_handle_t conn_handle;const uint8_t sampling_enable;const cte_slot_ #pragma pack (pop) struct node * _node = call_fun(1052,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gap_set_connection_cte_tx_param...");remote_mem_map(antenna_ids, switching_pattern_len * sizeof(* antenna_ids)); -; +const uint8_t cte_types, +const uint8_t switching_pattern_len, +const uint8_t * antenna_ids){LOG_D("gap_set_connection_cte_tx_param...");remote_mem_map(antenna_ids, switching_pattern_len * sizeof(* antenna_ids)); #pragma pack (push, 1) struct _param { const hci_con_handle_t conn_handle;const uint8_t cte_types;const uint8_t switching_pattern_len;const uint8_t * antenna_ids;} _param = {.conn_handle = conn_handle, @@ -490,10 +471,10 @@ const hci_con_handle_t conn_handle;const uint8_t cte_types;const uint8_t switchi #pragma pack (pop) struct node * _node = call_fun(1053,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gap_set_connection_cte_request_enable...");; +const uint8_t enable, +const uint16_t requested_cte_interval, +const uint8_t requested_cte_length, +const cte_type_t requested_cte_type){LOG_D("gap_set_connection_cte_request_enable...");; #pragma pack (push, 1) struct _param { 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;} _param = {.conn_handle = conn_handle, @@ -504,7 +485,7 @@ const hci_con_handle_t conn_handle;const uint8_t enable;const uint16_t requested #pragma pack (pop) struct node * _node = call_fun(1054,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_set_connection_cte_response_enable(const hci_con_handle_t conn_handle, - const uint8_t enable){LOG_D("gap_set_connection_cte_response_enable...");; +const uint8_t enable){LOG_D("gap_set_connection_cte_response_enable...");; #pragma pack (push, 1) struct _param { const hci_con_handle_t conn_handle;const uint8_t enable;} _param = {.conn_handle = conn_handle, @@ -518,7 +499,7 @@ struct _param { #pragma pack (pop) struct node * _node = call_fun(1056,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_set_periodic_adv_rx_enable(const uint16_t sync_handle, - const uint8_t enable){LOG_D("gap_set_periodic_adv_rx_enable...");; +const uint8_t enable){LOG_D("gap_set_periodic_adv_rx_enable...");; #pragma pack (push, 1) struct _param { const uint16_t sync_handle;const uint8_t enable;} _param = {.sync_handle = sync_handle, @@ -526,8 +507,8 @@ const uint16_t sync_handle;const uint8_t enable;} _param = {.sync_handle = sync_ #pragma pack (pop) struct node * _node = call_fun(1057,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_periodic_adv_sync_transfer(const hci_con_handle_t conn_handle, - const uint16_t service_data, - const uint16_t sync_handle){LOG_D("gap_periodic_adv_sync_transfer...");; +const uint16_t service_data, +const uint16_t sync_handle){LOG_D("gap_periodic_adv_sync_transfer...");; #pragma pack (push, 1) struct _param { const hci_con_handle_t conn_handle;const uint16_t service_data;const uint16_t sync_handle;} _param = {.conn_handle = conn_handle, @@ -536,8 +517,8 @@ const hci_con_handle_t conn_handle;const uint16_t service_data;const uint16_t sy #pragma pack (pop) struct node * _node = call_fun(1058,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gap_periodic_adv_set_info_transfer...");; +const uint16_t service_data, +const uint8_t adv_handle){LOG_D("gap_periodic_adv_set_info_transfer...");; #pragma pack (push, 1) struct _param { const hci_con_handle_t conn_handle;const uint16_t service_data;const uint8_t adv_handle;} _param = {.conn_handle = conn_handle, @@ -546,10 +527,10 @@ const hci_con_handle_t conn_handle;const uint16_t service_data;const uint8_t adv #pragma pack (pop) struct node * _node = call_fun(1059,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gap_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){LOG_D("gap_periodic_adv_sync_transfer_param...");; #pragma pack (push, 1) struct _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;} _param = {.conn_handle = conn_handle, @@ -560,9 +541,9 @@ const hci_con_handle_t conn_handle;const periodic_adv_sync_transfer_mode_t mode; #pragma pack (pop) struct node * _node = call_fun(1060,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gap_default_periodic_adv_sync_transfer_param...");; +const uint16_t skip, +const uint16_t sync_timeout, +const uint8_t cte_excl_types){LOG_D("gap_default_periodic_adv_sync_transfer_param...");; #pragma pack (push, 1) struct _param { const periodic_adv_sync_transfer_mode_t mode;const uint16_t skip;const uint16_t sync_timeout;const uint8_t cte_excl_types;} _param = {.mode = mode, @@ -572,7 +553,7 @@ const periodic_adv_sync_transfer_mode_t mode;const uint16_t skip;const uint16_t #pragma pack (pop) struct node * _node = call_fun(1061,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_set_host_channel_classification(const uint32_t channel_low, - const uint8_t channel_high){LOG_D("gap_set_host_channel_classification...");; +const uint8_t channel_high){LOG_D("gap_set_host_channel_classification...");; #pragma pack (push, 1) struct _param { const uint32_t channel_low;const uint8_t channel_high;} _param = {.channel_low = channel_low, @@ -580,12 +561,12 @@ const uint32_t channel_low;const uint8_t channel_high;} _param = {.channel_low = #pragma pack (pop) struct node * _node = call_fun(1062,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gap_update_connection_parameters...");; +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){LOG_D("gap_update_connection_parameters...");; #pragma pack (push, 1) struct _param { 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;} _param = {.con_handle = con_handle, @@ -598,21 +579,19 @@ hci_con_handle_t con_handle;uint16_t conn_interval_min;uint16_t conn_interval_ma #pragma pack (pop) struct node * _node = call_fun(1063,&_param,sizeof(_param));int _r= *(int *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} void gap_get_connection_parameter_range(le_connection_parameter_range_t * range){LOG_D("gap_get_connection_parameter_range...");remote_mem_map(range, 1 * sizeof(* range)); -; #pragma pack (push, 1) struct _param { le_connection_parameter_range_t * range;} _param = {.range = range}; #pragma pack (pop) call_void_fun(1064,&_param,sizeof(_param));} void gap_set_connection_parameter_range(le_connection_parameter_range_t * range){LOG_D("gap_set_connection_parameter_range...");remote_mem_map(range, 1 * sizeof(* range)); -; #pragma pack (push, 1) struct _param { le_connection_parameter_range_t * range;} _param = {.range = range}; #pragma pack (pop) call_void_fun(1065,&_param,sizeof(_param));} uint8_t gap_read_local_tx_power_level(hci_con_handle_t con_handle, - unified_phy_type_t phy){LOG_D("gap_read_local_tx_power_level...");; +unified_phy_type_t phy){LOG_D("gap_read_local_tx_power_level...");; #pragma pack (push, 1) struct _param { hci_con_handle_t con_handle;unified_phy_type_t phy;} _param = {.con_handle = con_handle, @@ -620,7 +599,7 @@ hci_con_handle_t con_handle;unified_phy_type_t phy;} _param = {.con_handle = con #pragma pack (pop) struct node * _node = call_fun(1066,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_read_remote_tx_power_level(hci_con_handle_t con_handle, - unified_phy_type_t phy){LOG_D("gap_read_remote_tx_power_level...");; +unified_phy_type_t phy){LOG_D("gap_read_remote_tx_power_level...");; #pragma pack (push, 1) struct _param { hci_con_handle_t con_handle;unified_phy_type_t phy;} _param = {.con_handle = con_handle, @@ -628,11 +607,11 @@ hci_con_handle_t con_handle;unified_phy_type_t phy;} _param = {.con_handle = con #pragma pack (pop) struct node * _node = call_fun(1067,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_set_path_loss_reporting_param(hci_con_handle_t con_handle, - uint8_t high_threshold, - uint8_t high_hysteresis, - uint8_t low_threshold, - uint8_t low_hysteresis, - uint8_t min_time_spent){LOG_D("gap_set_path_loss_reporting_param...");; +uint8_t high_threshold, +uint8_t high_hysteresis, +uint8_t low_threshold, +uint8_t low_hysteresis, +uint8_t min_time_spent){LOG_D("gap_set_path_loss_reporting_param...");; #pragma pack (push, 1) struct _param { hci_con_handle_t con_handle;uint8_t high_threshold;uint8_t high_hysteresis;uint8_t low_threshold;uint8_t low_hysteresis;uint8_t min_time_spent;} _param = {.con_handle = con_handle, @@ -644,7 +623,7 @@ hci_con_handle_t con_handle;uint8_t high_threshold;uint8_t high_hysteresis;uint8 #pragma pack (pop) struct node * _node = call_fun(1068,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_set_path_loss_reporting_enable(hci_con_handle_t con_handle, - uint8_t enable){LOG_D("gap_set_path_loss_reporting_enable...");; +uint8_t enable){LOG_D("gap_set_path_loss_reporting_enable...");; #pragma pack (push, 1) struct _param { hci_con_handle_t con_handle;uint8_t enable;} _param = {.con_handle = con_handle, @@ -652,8 +631,8 @@ hci_con_handle_t con_handle;uint8_t enable;} _param = {.con_handle = con_handle, #pragma pack (pop) struct node * _node = call_fun(1069,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_set_tx_power_reporting_enable(hci_con_handle_t con_handle, - uint8_t local_enable, - uint8_t remote_enable){LOG_D("gap_set_tx_power_reporting_enable...");; +uint8_t local_enable, +uint8_t remote_enable){LOG_D("gap_set_tx_power_reporting_enable...");; #pragma pack (push, 1) struct _param { hci_con_handle_t con_handle;uint8_t local_enable;uint8_t remote_enable;} _param = {.con_handle = con_handle, @@ -662,10 +641,10 @@ hci_con_handle_t con_handle;uint8_t local_enable;uint8_t remote_enable;} _param #pragma pack (pop) struct node * _node = call_fun(1070,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_set_default_subrate(uint16_t subrate_min, - uint16_t subrate_max, - uint16_t max_latency, - uint16_t continuation_number, - uint16_t supervision_timeout){LOG_D("gap_set_default_subrate...");; +uint16_t subrate_max, +uint16_t max_latency, +uint16_t continuation_number, +uint16_t supervision_timeout){LOG_D("gap_set_default_subrate...");; #pragma pack (push, 1) struct _param { uint16_t subrate_min;uint16_t subrate_max;uint16_t max_latency;uint16_t continuation_number;uint16_t supervision_timeout;} _param = {.subrate_min = subrate_min, @@ -676,11 +655,11 @@ uint16_t subrate_min;uint16_t subrate_max;uint16_t max_latency;uint16_t continua #pragma pack (pop) struct node * _node = call_fun(1071,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_subrate_request(hci_con_handle_t con_handle, - uint16_t subrate_min, - uint16_t subrate_max, - uint16_t max_latency, - uint16_t continuation_number, - uint16_t supervision_timeout){LOG_D("gap_subrate_request...");; +uint16_t subrate_min, +uint16_t subrate_max, +uint16_t max_latency, +uint16_t continuation_number, +uint16_t supervision_timeout){LOG_D("gap_subrate_request...");; #pragma pack (push, 1) struct _param { hci_con_handle_t con_handle;uint16_t subrate_min;uint16_t subrate_max;uint16_t max_latency;uint16_t continuation_number;uint16_t supervision_timeout;} _param = {.con_handle = con_handle, @@ -692,11 +671,9 @@ hci_con_handle_t con_handle;uint16_t subrate_min;uint16_t subrate_max;uint16_t m #pragma pack (pop) struct node * _node = call_fun(1072,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_aes_encrypt(const uint8_t * key, - const uint8_t * plaintext, - gap_hci_cmd_complete_cb_t cb, - void * user_data){LOG_D("gap_aes_encrypt...");remote_mem_map(key, 16 * sizeof(* key)); -remote_mem_map(plaintext, 16 * sizeof(* plaintext)); -; +const uint8_t * plaintext, +gap_hci_cmd_complete_cb_t cb, +void * user_data){LOG_D("gap_aes_encrypt...");remote_mem_map(key, 16 * sizeof(* key));remote_mem_map(plaintext, 16 * sizeof(* plaintext)); #pragma pack (push, 1) struct _param { const uint8_t * key;const uint8_t * plaintext;gap_hci_cmd_complete_cb_t cb;void * user_data;} _param = {.key = key, @@ -706,8 +683,8 @@ const uint8_t * key;const uint8_t * plaintext;gap_hci_cmd_complete_cb_t cb;void #pragma pack (pop) struct node * _node = call_fun(1073,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_rx_test_v2(uint8_t rx_channel, - uint8_t phy, - uint8_t modulation_index){LOG_D("gap_rx_test_v2...");; +uint8_t phy, +uint8_t modulation_index){LOG_D("gap_rx_test_v2...");; #pragma pack (push, 1) struct _param { uint8_t rx_channel;uint8_t phy;uint8_t modulation_index;} _param = {.rx_channel = rx_channel, @@ -716,16 +693,16 @@ uint8_t rx_channel;uint8_t phy;uint8_t modulation_index;} _param = {.rx_channel #pragma pack (pop) struct node * _node = call_fun(1074,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_rx_test_v3(uint8_t rx_channel, - uint8_t phy, - uint8_t modulation_index, - uint8_t expected_cte_length, - uint8_t expected_cte_type, - uint8_t slot_durations, - uint8_t switching_pattern_length, - uint8_t * antenna_ids){LOG_D("gap_rx_test_v3...");; +uint8_t phy, +uint8_t modulation_index, +uint8_t expected_cte_length, +uint8_t expected_cte_type, +uint8_t slot_durations, +uint8_t switching_pattern_length, +const uint8_t * antenna_ids){LOG_D("gap_rx_test_v3...");remote_mem_map(antenna_ids, switching_pattern_length * sizeof(* antenna_ids)); #pragma pack (push, 1) struct _param { -uint8_t rx_channel;uint8_t phy;uint8_t modulation_index;uint8_t expected_cte_length;uint8_t expected_cte_type;uint8_t slot_durations;uint8_t switching_pattern_length;uint8_t * antenna_ids;} _param = {.rx_channel = rx_channel, +uint8_t rx_channel;uint8_t phy;uint8_t modulation_index;uint8_t expected_cte_length;uint8_t expected_cte_type;uint8_t slot_durations;uint8_t switching_pattern_length;const uint8_t * antenna_ids;} _param = {.rx_channel = rx_channel, .phy = phy, .modulation_index = modulation_index, .expected_cte_length = expected_cte_length, @@ -736,9 +713,9 @@ uint8_t rx_channel;uint8_t phy;uint8_t modulation_index;uint8_t expected_cte_len #pragma pack (pop) struct node * _node = call_fun(1075,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_tx_test_v2(uint8_t tx_channel, - uint8_t test_data_length, - uint8_t packet_payload, - uint8_t phy){LOG_D("gap_tx_test_v2...");; +uint8_t test_data_length, +uint8_t packet_payload, +uint8_t phy){LOG_D("gap_tx_test_v2...");; #pragma pack (push, 1) struct _param { uint8_t tx_channel;uint8_t test_data_length;uint8_t packet_payload;uint8_t phy;} _param = {.tx_channel = tx_channel, @@ -748,17 +725,17 @@ uint8_t tx_channel;uint8_t test_data_length;uint8_t packet_payload;uint8_t phy;} #pragma pack (pop) struct node * _node = call_fun(1076,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_tx_test_v4(uint8_t tx_channel, - uint8_t test_data_length, - uint8_t packet_payload, - uint8_t phy, - uint8_t cte_length, - uint8_t cte_type, - uint8_t switching_pattern_length, - uint8_t * antenna_ids, - int8_t tx_power_level){LOG_D("gap_tx_test_v4...");; +uint8_t test_data_length, +uint8_t packet_payload, +uint8_t phy, +uint8_t cte_length, +uint8_t cte_type, +uint8_t switching_pattern_length, +const uint8_t * antenna_ids, +int8_t tx_power_level){LOG_D("gap_tx_test_v4...");remote_mem_map(antenna_ids, switching_pattern_length * sizeof(* antenna_ids)); #pragma pack (push, 1) struct _param { -uint8_t tx_channel;uint8_t test_data_length;uint8_t packet_payload;uint8_t phy;uint8_t cte_length;uint8_t cte_type;uint8_t switching_pattern_length;uint8_t * antenna_ids;int8_t tx_power_level;} _param = {.tx_channel = tx_channel, +uint8_t tx_channel;uint8_t test_data_length;uint8_t packet_payload;uint8_t phy;uint8_t cte_length;uint8_t cte_type;uint8_t switching_pattern_length;const uint8_t * antenna_ids;int8_t tx_power_level;} _param = {.tx_channel = tx_channel, .test_data_length = test_data_length, .packet_payload = packet_payload, .phy = phy, @@ -776,8 +753,8 @@ struct _param { #pragma pack (pop) struct node * _node = call_fun(1078,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gap_vendor_tx_continuous_wave(uint8_t enable, - uint8_t power_level_index, - uint16_t freq){LOG_D("gap_vendor_tx_continuous_wave...");; +uint8_t power_level_index, +uint16_t freq){LOG_D("gap_vendor_tx_continuous_wave...");; #pragma pack (push, 1) struct _param { uint8_t enable;uint8_t power_level_index;uint16_t freq;} _param = {.enable = enable, @@ -786,10 +763,9 @@ uint8_t enable;uint8_t power_level_index;uint16_t freq;} _param = {.enable = ena #pragma pack (pop) struct node * _node = call_fun(1079,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} int att_server_deferred_read_response(hci_con_handle_t con_handle, - uint16_t attribute_handle, - const uint8_t * value, - uint16_t value_len){LOG_D("att_server_deferred_read_response...");remote_mem_map(value, value_len * sizeof(* value)); -; +uint16_t attribute_handle, +const uint8_t * value, +uint16_t value_len){LOG_D("att_server_deferred_read_response...");remote_mem_map(value, value_len * sizeof(* value)); #pragma pack (push, 1) struct _param { hci_con_handle_t con_handle;uint16_t attribute_handle;const uint8_t * value;uint16_t value_len;} _param = {.con_handle = con_handle, @@ -799,26 +775,24 @@ hci_con_handle_t con_handle;uint16_t attribute_handle;const uint8_t * value;uint #pragma pack (pop) struct node * _node = call_fun(1080,&_param,sizeof(_param));int _r= *(int *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} int att_server_notify(hci_con_handle_t con_handle, - uint16_t attribute_handle, - uint8_t * value, - uint16_t value_len){LOG_D("att_server_notify...");remote_mem_map(value, value_len * sizeof(* value)); -; +uint16_t attribute_handle, +const uint8_t * value, +uint16_t value_len){LOG_D("att_server_notify...");remote_mem_map(value, value_len * sizeof(* value)); #pragma pack (push, 1) struct _param { -hci_con_handle_t con_handle;uint16_t attribute_handle;uint8_t * value;uint16_t value_len;} _param = {.con_handle = con_handle, +hci_con_handle_t con_handle;uint16_t attribute_handle;const uint8_t * value;uint16_t value_len;} _param = {.con_handle = con_handle, .attribute_handle = attribute_handle, .value = value, .value_len = value_len}; #pragma pack (pop) struct node * _node = call_fun(1081,&_param,sizeof(_param));int _r= *(int *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} int att_server_indicate(hci_con_handle_t con_handle, - uint16_t attribute_handle, - uint8_t * value, - uint16_t value_len){LOG_D("att_server_indicate...");remote_mem_map(value, value_len * sizeof(* value)); -; +uint16_t attribute_handle, +const uint8_t * value, +uint16_t value_len){LOG_D("att_server_indicate...");remote_mem_map(value, value_len * sizeof(* value)); #pragma pack (push, 1) struct _param { -hci_con_handle_t con_handle;uint16_t attribute_handle;uint8_t * value;uint16_t value_len;} _param = {.con_handle = con_handle, +hci_con_handle_t con_handle;uint16_t attribute_handle;const uint8_t * value;uint16_t value_len;} _param = {.con_handle = con_handle, .attribute_handle = attribute_handle, .value = value, .value_len = value_len}; @@ -831,7 +805,7 @@ hci_con_handle_t con_handle;} _param = {.con_handle = con_handle}; #pragma pack (pop) struct node * _node = call_fun(1083,&_param,sizeof(_param));uint16_t _r= *(uint16_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gatt_client_discover_primary_services(user_packet_handler_t callback, - hci_con_handle_t con_handle){LOG_D("gatt_client_discover_primary_services...");; +hci_con_handle_t con_handle){LOG_D("gatt_client_discover_primary_services...");; #pragma pack (push, 1) struct _param { user_packet_handler_t callback;hci_con_handle_t con_handle;} _param = {.callback = callback, @@ -839,8 +813,8 @@ user_packet_handler_t callback;hci_con_handle_t con_handle;} _param = {.callback #pragma pack (pop) struct node * _node = call_fun(1084,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gatt_client_discover_primary_services_by_uuid16(user_packet_handler_t callback, - hci_con_handle_t con_handle, - uint16_t uuid16){LOG_D("gatt_client_discover_primary_services_by_uuid16...");; +hci_con_handle_t con_handle, +uint16_t uuid16){LOG_D("gatt_client_discover_primary_services_by_uuid16...");; #pragma pack (push, 1) struct _param { user_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t uuid16;} _param = {.callback = callback, @@ -849,9 +823,8 @@ user_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t uuid16;} _pa #pragma pack (pop) struct node * _node = call_fun(1085,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gatt_client_discover_primary_services_by_uuid128(user_packet_handler_t callback, - hci_con_handle_t con_handle, - const uint8_t * uuid128){LOG_D("gatt_client_discover_primary_services_by_uuid128...");remote_mem_map(uuid128, 16 * sizeof(* uuid128)); -; +hci_con_handle_t con_handle, +const uint8_t * uuid128){LOG_D("gatt_client_discover_primary_services_by_uuid128...");remote_mem_map(uuid128, 16 * sizeof(* uuid128)); #pragma pack (push, 1) struct _param { user_packet_handler_t callback;hci_con_handle_t con_handle;const uint8_t * uuid128;} _param = {.callback = callback, @@ -860,9 +833,9 @@ user_packet_handler_t callback;hci_con_handle_t con_handle;const uint8_t * uuid1 #pragma pack (pop) struct node * _node = call_fun(1086,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gatt_client_find_included_services_for_service...");; +hci_con_handle_t con_handle, +const uint16_t start_group_handle, +const uint16_t end_group_handle){LOG_D("gatt_client_find_included_services_for_service...");; #pragma pack (push, 1) struct _param { user_packet_handler_t callback;hci_con_handle_t con_handle;const uint16_t start_group_handle;const uint16_t end_group_handle;} _param = {.callback = callback, @@ -872,9 +845,9 @@ user_packet_handler_t callback;hci_con_handle_t con_handle;const uint16_t start_ #pragma pack (pop) struct node * _node = call_fun(1087,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gatt_client_discover_characteristics_for_service...");; +hci_con_handle_t con_handle, +const uint16_t start_group_handle, +const uint16_t end_group_handle){LOG_D("gatt_client_discover_characteristics_for_service...");; #pragma pack (push, 1) struct _param { user_packet_handler_t callback;hci_con_handle_t con_handle;const uint16_t start_group_handle;const uint16_t end_group_handle;} _param = {.callback = callback, @@ -884,10 +857,10 @@ user_packet_handler_t callback;hci_con_handle_t con_handle;const uint16_t start_ #pragma pack (pop) struct node * _node = call_fun(1088,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gatt_client_discover_characteristics_for_handle_range_by_uuid16...");; +const hci_con_handle_t con_handle, +const uint16_t start_handle, +const uint16_t end_handle, +const uint16_t uuid16){LOG_D("gatt_client_discover_characteristics_for_handle_range_by_uuid16...");; #pragma pack (push, 1) struct _param { 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;} _param = {.callback = callback, @@ -898,11 +871,10 @@ btstack_packet_handler_t callback;const hci_con_handle_t con_handle;const uint16 #pragma pack (pop) struct node * _node = call_fun(1089,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gatt_client_discover_characteristics_for_handle_range_by_uuid128...");remote_mem_map(uuid128, 16 * sizeof(* uuid128)); -; +const hci_con_handle_t con_handle, +const uint16_t start_handle, +const uint16_t end_handle, +const uint8_t * uuid128){LOG_D("gatt_client_discover_characteristics_for_handle_range_by_uuid128...");remote_mem_map(uuid128, 16 * sizeof(* uuid128)); #pragma pack (push, 1) struct _param { 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;} _param = {.callback = callback, @@ -913,9 +885,8 @@ btstack_packet_handler_t callback;const hci_con_handle_t con_handle;const uint16 #pragma pack (pop) struct node * _node = call_fun(1090,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gatt_client_discover_characteristic_descriptors(btstack_packet_handler_t callback, - hci_con_handle_t con_handle, - gatt_client_characteristic_t * characteristic){LOG_D("gatt_client_discover_characteristic_descriptors...");remote_mem_map(characteristic, 1 * sizeof(* characteristic)); -; +hci_con_handle_t con_handle, +gatt_client_characteristic_t * characteristic){LOG_D("gatt_client_discover_characteristic_descriptors...");remote_mem_map(characteristic, 1 * sizeof(* characteristic)); #pragma pack (push, 1) struct _param { btstack_packet_handler_t callback;hci_con_handle_t con_handle;gatt_client_characteristic_t * characteristic;} _param = {.callback = callback, @@ -924,8 +895,8 @@ btstack_packet_handler_t callback;hci_con_handle_t con_handle;gatt_client_charac #pragma pack (pop) struct node * _node = call_fun(1091,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gatt_client_read_value_of_characteristic_using_value_handle...");; +hci_con_handle_t con_handle, +uint16_t characteristic_value_handle){LOG_D("gatt_client_read_value_of_characteristic_using_value_handle...");; #pragma pack (push, 1) struct _param { btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t characteristic_value_handle;} _param = {.callback = callback, @@ -934,10 +905,10 @@ btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t character #pragma pack (pop) struct node * _node = call_fun(1092,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gatt_client_read_value_of_characteristics_by_uuid16...");; +hci_con_handle_t con_handle, +uint16_t start_handle, +uint16_t end_handle, +uint16_t uuid16){LOG_D("gatt_client_read_value_of_characteristics_by_uuid16...");; #pragma pack (push, 1) struct _param { btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t start_handle;uint16_t end_handle;uint16_t uuid16;} _param = {.callback = callback, @@ -948,11 +919,10 @@ btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t start_han #pragma pack (pop) struct node * _node = call_fun(1093,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gatt_client_read_value_of_characteristics_by_uuid128...");remote_mem_map(uuid128, 16 * sizeof(* uuid128)); -; +hci_con_handle_t con_handle, +uint16_t start_handle, +uint16_t end_handle, +uint8_t * uuid128){LOG_D("gatt_client_read_value_of_characteristics_by_uuid128...");remote_mem_map(uuid128, 16 * sizeof(* uuid128)); #pragma pack (push, 1) struct _param { btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t start_handle;uint16_t end_handle;uint8_t * uuid128;} _param = {.callback = callback, @@ -963,8 +933,8 @@ btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t start_han #pragma pack (pop) struct node * _node = call_fun(1094,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gatt_client_read_long_value_of_characteristic_using_value_handle...");; +hci_con_handle_t con_handle, +uint16_t characteristic_value_handle){LOG_D("gatt_client_read_long_value_of_characteristic_using_value_handle...");; #pragma pack (push, 1) struct _param { btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t characteristic_value_handle;} _param = {.callback = callback, @@ -973,9 +943,9 @@ btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t character #pragma pack (pop) struct node * _node = call_fun(1095,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset...");; +hci_con_handle_t con_handle, +uint16_t characteristic_value_handle, +uint16_t offset){LOG_D("gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset...");; #pragma pack (push, 1) struct _param { btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t characteristic_value_handle;uint16_t offset;} _param = {.callback = callback, @@ -985,10 +955,9 @@ btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t character #pragma pack (pop) struct node * _node = call_fun(1096,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gatt_client_read_multiple_characteristic_values...");remote_mem_map(value_handles, num_value_handles * sizeof(* value_handles)); -; +hci_con_handle_t con_handle, +int num_value_handles, +uint16_t * value_handles){LOG_D("gatt_client_read_multiple_characteristic_values...");remote_mem_map(value_handles, num_value_handles * sizeof(*value_handles)); #pragma pack (push, 1) struct _param { btstack_packet_handler_t callback;hci_con_handle_t con_handle;int num_value_handles;uint16_t * value_handles;} _param = {.callback = callback, @@ -998,10 +967,9 @@ btstack_packet_handler_t callback;hci_con_handle_t con_handle;int num_value_hand #pragma pack (pop) struct node * _node = call_fun(1097,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gatt_client_write_value_of_characteristic_without_response(hci_con_handle_t con_handle, - uint16_t characteristic_value_handle, - uint16_t length, - const uint8_t * data){LOG_D("gatt_client_write_value_of_characteristic_without_response...");remote_mem_map(data, length * sizeof(* data)); -; +uint16_t characteristic_value_handle, +uint16_t length, +const uint8_t * data){LOG_D("gatt_client_write_value_of_characteristic_without_response...");remote_mem_map(data, length * sizeof(* data)); #pragma pack (push, 1) struct _param { hci_con_handle_t con_handle;uint16_t characteristic_value_handle;uint16_t length;const uint8_t * data;} _param = {.con_handle = con_handle, @@ -1011,11 +979,10 @@ hci_con_handle_t con_handle;uint16_t characteristic_value_handle;uint16_t length #pragma pack (pop) struct node * _node = call_fun(1098,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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, - const uint8_t * message){LOG_D("gatt_client_signed_write_without_response...");remote_mem_map(message, message_len * sizeof(* message)); -; +hci_con_handle_t con_handle, +uint16_t handle, +uint16_t message_len, +const uint8_t * message){LOG_D("gatt_client_signed_write_without_response...");remote_mem_map(message, message_len * sizeof(* message)); #pragma pack (push, 1) struct _param { btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t handle;uint16_t message_len;const uint8_t * message;} _param = {.callback = callback, @@ -1026,11 +993,10 @@ btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t handle;ui #pragma pack (pop) struct node * _node = call_fun(1099,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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, - const uint8_t * data){LOG_D("gatt_client_write_value_of_characteristic...");remote_mem_map(data, length * sizeof(* data)); -; +hci_con_handle_t con_handle, +uint16_t characteristic_value_handle, +uint16_t length, +const uint8_t * data){LOG_D("gatt_client_write_value_of_characteristic...");remote_mem_map(data, length * sizeof(* data)); #pragma pack (push, 1) struct _param { btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t characteristic_value_handle;uint16_t length;const uint8_t * data;} _param = {.callback = callback, @@ -1041,11 +1007,10 @@ btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t character #pragma pack (pop) struct node * _node = call_fun(1100,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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, - const uint8_t * data){LOG_D("gatt_client_write_long_value_of_characteristic...");remote_mem_map(data, length * sizeof(* data)); -; +hci_con_handle_t con_handle, +uint16_t characteristic_value_handle, +uint16_t length, +const uint8_t * data){LOG_D("gatt_client_write_long_value_of_characteristic...");remote_mem_map(data, length * sizeof(* data)); #pragma pack (push, 1) struct _param { btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t characteristic_value_handle;uint16_t length;const uint8_t * data;} _param = {.callback = callback, @@ -1056,12 +1021,11 @@ btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t character #pragma pack (pop) struct node * _node = call_fun(1101,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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, - const uint8_t * data){LOG_D("gatt_client_write_long_value_of_characteristic_with_offset...");remote_mem_map(data, length * sizeof(* data)); -; +hci_con_handle_t con_handle, +uint16_t characteristic_value_handle, +uint16_t offset, +uint16_t length, +const uint8_t * data){LOG_D("gatt_client_write_long_value_of_characteristic_with_offset...");remote_mem_map(data, length * sizeof(* data)); #pragma pack (push, 1) struct _param { btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t characteristic_value_handle;uint16_t offset;uint16_t length;const uint8_t * data;} _param = {.callback = callback, @@ -1073,11 +1037,10 @@ btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t character #pragma pack (pop) struct node * _node = call_fun(1102,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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, - const uint8_t * data){LOG_D("gatt_client_reliable_write_long_value_of_characteristic...");remote_mem_map(data, length * sizeof(* data)); -; +hci_con_handle_t con_handle, +uint16_t characteristic_value_handle, +uint16_t length, +const uint8_t * data){LOG_D("gatt_client_reliable_write_long_value_of_characteristic...");remote_mem_map(data, length * sizeof(* data)); #pragma pack (push, 1) struct _param { btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t characteristic_value_handle;uint16_t length;const uint8_t * data;} _param = {.callback = callback, @@ -1088,8 +1051,8 @@ btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t character #pragma pack (pop) struct node * _node = call_fun(1103,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gatt_client_read_characteristic_descriptor_using_descriptor_handle...");; +hci_con_handle_t con_handle, +uint16_t descriptor_handle){LOG_D("gatt_client_read_characteristic_descriptor_using_descriptor_handle...");; #pragma pack (push, 1) struct _param { btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t descriptor_handle;} _param = {.callback = callback, @@ -1098,8 +1061,8 @@ btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t descripto #pragma pack (pop) struct node * _node = call_fun(1104,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gatt_client_read_long_characteristic_descriptor_using_descriptor_handle...");; +hci_con_handle_t con_handle, +uint16_t descriptor_handle){LOG_D("gatt_client_read_long_characteristic_descriptor_using_descriptor_handle...");; #pragma pack (push, 1) struct _param { btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t descriptor_handle;} _param = {.callback = callback, @@ -1108,9 +1071,9 @@ btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t descripto #pragma pack (pop) struct node * _node = call_fun(1105,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset...");; +hci_con_handle_t con_handle, +uint16_t descriptor_handle, +uint16_t offset){LOG_D("gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset...");; #pragma pack (push, 1) struct _param { btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t descriptor_handle;uint16_t offset;} _param = {.callback = callback, @@ -1120,11 +1083,10 @@ btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t descripto #pragma pack (pop) struct node * _node = call_fun(1106,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gatt_client_write_characteristic_descriptor_using_descriptor_handle...");remote_mem_map(data, length * sizeof(* data)); -; +hci_con_handle_t con_handle, +uint16_t descriptor_handle, +uint16_t length, +uint8_t * data){LOG_D("gatt_client_write_characteristic_descriptor_using_descriptor_handle...");remote_mem_map(data, length * sizeof(* data)); #pragma pack (push, 1) struct _param { btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t descriptor_handle;uint16_t length;uint8_t * data;} _param = {.callback = callback, @@ -1135,11 +1097,10 @@ btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t descripto #pragma pack (pop) struct node * _node = call_fun(1107,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gatt_client_write_long_characteristic_descriptor_using_descriptor_handle...");remote_mem_map(data, length * sizeof(* data)); -; +hci_con_handle_t con_handle, +uint16_t descriptor_handle, +uint16_t length, +uint8_t * data){LOG_D("gatt_client_write_long_characteristic_descriptor_using_descriptor_handle...");remote_mem_map(data, length * sizeof(* data)); #pragma pack (push, 1) struct _param { btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t descriptor_handle;uint16_t length;uint8_t * data;} _param = {.callback = callback, @@ -1150,12 +1111,11 @@ btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t descripto #pragma pack (pop) struct node * _node = call_fun(1108,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset...");remote_mem_map(data, length * sizeof(* data)); -; +hci_con_handle_t con_handle, +uint16_t descriptor_handle, +uint16_t offset, +uint16_t length, +uint8_t * data){LOG_D("gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset...");remote_mem_map(data, length * sizeof(* data)); #pragma pack (push, 1) struct _param { btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t descriptor_handle;uint16_t offset;uint16_t length;uint8_t * data;} _param = {.callback = callback, @@ -1167,10 +1127,9 @@ btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t descripto #pragma pack (pop) struct node * _node = call_fun(1109,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gatt_client_write_client_characteristic_configuration...");remote_mem_map(characteristic, 1 * sizeof(* characteristic)); -; +hci_con_handle_t con_handle, +gatt_client_characteristic_t * characteristic, +uint16_t configuration){LOG_D("gatt_client_write_client_characteristic_configuration...");remote_mem_map(characteristic, 1 * sizeof(* characteristic)); #pragma pack (push, 1) struct _param { btstack_packet_handler_t callback;hci_con_handle_t con_handle;gatt_client_characteristic_t * characteristic;uint16_t configuration;} _param = {.callback = callback, @@ -1180,12 +1139,11 @@ btstack_packet_handler_t callback;hci_con_handle_t con_handle;gatt_client_charac #pragma pack (pop) struct node * _node = call_fun(1110,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gatt_client_prepare_write...");remote_mem_map(data, length * sizeof(* data)); -; +hci_con_handle_t con_handle, +uint16_t attribute_handle, +uint16_t offset, +uint16_t length, +uint8_t * data){LOG_D("gatt_client_prepare_write...");remote_mem_map(data, length * sizeof(* data)); #pragma pack (push, 1) struct _param { btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t attribute_handle;uint16_t offset;uint16_t length;uint8_t * data;} _param = {.callback = callback, @@ -1197,7 +1155,7 @@ btstack_packet_handler_t callback;hci_con_handle_t con_handle;uint16_t attribute #pragma pack (pop) struct node * _node = call_fun(1111,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gatt_client_execute_write(btstack_packet_handler_t callback, - hci_con_handle_t con_handle){LOG_D("gatt_client_execute_write...");; +hci_con_handle_t con_handle){LOG_D("gatt_client_execute_write...");; #pragma pack (push, 1) struct _param { btstack_packet_handler_t callback;hci_con_handle_t con_handle;} _param = {.callback = callback, @@ -1205,7 +1163,7 @@ btstack_packet_handler_t callback;hci_con_handle_t con_handle;} _param = {.callb #pragma pack (pop) struct node * _node = call_fun(1112,&_param,sizeof(_param));uint8_t _r= *(uint8_t *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} uint8_t gatt_client_cancel_write(btstack_packet_handler_t callback, - hci_con_handle_t con_handle){LOG_D("gatt_client_cancel_write...");; +hci_con_handle_t con_handle){LOG_D("gatt_client_cancel_write...");; #pragma pack (push, 1) struct _param { btstack_packet_handler_t callback;hci_con_handle_t con_handle;} _param = {.callback = callback, @@ -1219,10 +1177,9 @@ hci_con_handle_t con_handle;} _param = {.con_handle = con_handle}; #pragma pack (pop) struct node * _node = call_fun(1114,&_param,sizeof(_param));int _r= *(int *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} 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){LOG_D("gatt_client_listen_for_characteristic_value_updates...");alloc_heap_for_conn(notification,sizeof(* notification),con_handle); -; +btstack_packet_handler_t packet_handler, +hci_con_handle_t con_handle, +uint16_t value_handle){LOG_D("gatt_client_listen_for_characteristic_value_updates...");alloc_heap_for_conn(notification,sizeof(* notification),con_handle); #pragma pack (push, 1) struct _param { gatt_client_notification_t * notification;btstack_packet_handler_t packet_handler;hci_con_handle_t con_handle;uint16_t value_handle;} _param = {.notification = notification, @@ -1232,9 +1189,9 @@ gatt_client_notification_t * notification;btstack_packet_handler_t packet_handle #pragma pack (pop) call_void_fun(1115,&_param,sizeof(_param));} void sm_config(uint8_t enable, - io_capability_t io_capability, - int request_security, - const sm_persistent_t * persistent){LOG_D("sm_config...");; +io_capability_t io_capability, +int request_security, +const sm_persistent_t * persistent){LOG_D("sm_config...");; #pragma pack (push, 1) struct _param { uint8_t enable;io_capability_t io_capability;int request_security;const sm_persistent_t * persistent;} _param = {.enable = enable, @@ -1268,7 +1225,7 @@ uint8_t accepted_stk_generation_methods;} _param = {.accepted_stk_generation_met #pragma pack (pop) call_void_fun(1120,&_param,sizeof(_param));} void sm_set_encryption_key_size_range(uint8_t min_size, - uint8_t max_size){LOG_D("sm_set_encryption_key_size_range...");; +uint8_t max_size){LOG_D("sm_set_encryption_key_size_range...");; #pragma pack (push, 1) struct _param { uint8_t min_size;uint8_t max_size;} _param = {.min_size = min_size, @@ -1282,8 +1239,7 @@ uint8_t auth_req;} _param = {.auth_req = auth_req}; #pragma pack (pop) call_void_fun(1122,&_param,sizeof(_param));} int sm_address_resolution_lookup(uint8_t addr_type, - bd_addr_t addr){LOG_D("sm_address_resolution_lookup...");remote_mem_map(addr, BD_ADDR_LEN * sizeof(* addr)); -; +bd_addr_t addr){LOG_D("sm_address_resolution_lookup...");remote_mem_map(addr, BD_ADDR_LEN * sizeof(* addr)); #pragma pack (push, 1) struct _param { uint8_t addr_type;const uint8_t * addr;} _param = {.addr_type = addr_type, @@ -1291,8 +1247,8 @@ uint8_t addr_type;const uint8_t * addr;} _param = {.addr_type = addr_type, #pragma pack (pop) struct node * _node = call_fun(1123,&_param,sizeof(_param));int _r= *(int *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} void sm_config_conn(hci_con_handle_t con_handle, - io_capability_t io_capability, - uint8_t auth_req){LOG_D("sm_config_conn...");; +io_capability_t io_capability, +uint8_t auth_req){LOG_D("sm_config_conn...");; #pragma pack (push, 1) struct _param { hci_con_handle_t con_handle;io_capability_t io_capability;uint8_t auth_req;} _param = {.con_handle = con_handle, @@ -1313,7 +1269,7 @@ hci_con_handle_t con_handle;} _param = {.con_handle = con_handle}; #pragma pack (pop) call_void_fun(1126,&_param,sizeof(_param));} void sm_passkey_input(hci_con_handle_t con_handle, - uint32_t passkey){LOG_D("sm_passkey_input...");; +uint32_t passkey){LOG_D("sm_passkey_input...");; #pragma pack (push, 1) struct _param { hci_con_handle_t con_handle;uint32_t passkey;} _param = {.con_handle = con_handle, @@ -1368,3 +1324,43 @@ struct _param { hci_con_handle_t con_handle;} _param = {.con_handle = con_handle}; #pragma pack (pop) struct node * _node = call_fun(1135,&_param,sizeof(_param));int _r= *(int *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} +void kv_remove_all(void){LOG_D("kv_remove_all...");; +#pragma pack (push, 1) +struct _param { +} _param = {}; +#pragma pack (pop) +call_void_fun(1136,&_param,sizeof(_param));} +void kv_remove(const kvkey_t key){LOG_D("kv_remove...");; +#pragma pack (push, 1) +struct _param { +const kvkey_t key;} _param = {.key = key}; +#pragma pack (pop) +call_void_fun(1137,&_param,sizeof(_param));} +int kv_put(const kvkey_t key, +const uint8_t * data, +int16_t length){LOG_D("kv_put...");remote_mem_map(data, length * sizeof(* data)); +#pragma pack (push, 1) +struct _param { +const kvkey_t key;const uint8_t * data;int16_t length;} _param = {.key = key, +.data = data, +.length = length}; +#pragma pack (pop) +struct node * _node = call_fun(1138,&_param,sizeof(_param));int _r= *(int *)extract_ret_param(_node, NULL);GEN_OS()->free(_node);return _r;} +void kv_value_modified(void){LOG_D("kv_value_modified...");; +#pragma pack (push, 1) +struct _param { +} _param = {}; +#pragma pack (pop) +call_void_fun(1139,&_param,sizeof(_param));} +void kv_commit(int flag_always_write){LOG_D("kv_commit...");; +#pragma pack (push, 1) +struct _param { +int flag_always_write;} _param = {.flag_always_write = flag_always_write}; +#pragma pack (pop) +call_void_fun(1140,&_param,sizeof(_param));} +void le_device_db_remove_key(int index){LOG_D("le_device_db_remove_key...");; +#pragma pack (push, 1) +struct _param { +int index;} _param = {.index = index}; +#pragma pack (pop) +call_void_fun(1141,&_param,sizeof(_param));} diff --git a/example_host/rpc_client/inc/brpc_fun_names.inc b/example_host/rpc_client/inc/brpc_fun_names.inc index 19a7ece8c..235069986 100644 --- a/example_host/rpc_client/inc/brpc_fun_names.inc +++ b/example_host/rpc_client/inc/brpc_fun_names.inc @@ -133,3 +133,9 @@ case 1132: return "sm_request_pairing"; case 1133: return "sm_authorization_decline"; case 1134: return "sm_authorization_grant"; case 1135: return "sm_le_device_key"; +case 1136: return "kv_remove_all"; +case 1137: return "kv_remove"; +case 1138: return "kv_put"; +case 1139: return "kv_value_modified"; +case 1140: return "kv_commit"; +case 1141: return "le_device_db_remove_key"; diff --git a/example_host/rpc_client/lib/brpc.c b/example_host/rpc_client/lib/brpc.c index 99eb2b8d3..c56ec0ab7 100644 --- a/example_host/rpc_client/lib/brpc.c +++ b/example_host/rpc_client/lib/brpc.c @@ -10,6 +10,7 @@ #include "btstack_defines.h" #include "gatt_client.h" #include "sm.h" +#include "kv_storage.h" #include "profile.h" #include "port_gen_os_driver.h" @@ -303,7 +304,14 @@ static void handle_evt(struct rpc_event_frame *evt, int len) break; case PLATFORM_CB_EVT_ASSERTION: { - const assertion_info_t *info = (assertion_info_t *)callback->packet; + #pragma pack (push, 1) + struct ret + { + int line_no; + char file_name[1]; + } *_r; + #pragma pack (pop) + const struct ret *info = (struct ret *)callback->packet; LOG_E("[ASSERTION] @ %s:%d", info->file_name, info->line_no); @@ -830,11 +838,9 @@ void sys_aligned_write_mem(uint32_t addr, void *p, int len) { uint32_t addr; uint32_t data[len]; - } _param = - { - .addr = addr, - } + } _param; #pragma pack (pop) + _param.addr = addr; memcpy(_param.data, p, len); call_void_fun(ID_sys_aligned_write_mem, &_param, sizeof(_param)); } diff --git a/examples-gcc/central_fota/central_fota.ingw b/examples-gcc/central_fota/central_fota.ingw index bf3bc8328..45d96cedc 100644 --- a/examples-gcc/central_fota/central_fota.ingw +++ b/examples-gcc/central_fota/central_fota.ingw @@ -2,7 +2,7 @@ "watchdog": true, "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Programs\\gcc-arm-none-eabi-10.3-2021.10\\bin", "eflash_addr": "0x42000", diff --git a/examples-gcc/get_started/get_started.ingw b/examples-gcc/get_started/get_started.ingw index 7a3e48fec..59ead60f7 100644 --- a/examples-gcc/get_started/get_started.ingw +++ b/examples-gcc/get_started/get_started.ingw @@ -2,7 +2,7 @@ "watchdog": true, "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Programs\\gcc-arm-none-eabi-10.3-2021.10\\bin", "eflash_addr": "0x42000", diff --git a/examples-gcc/peripheral_console_liteos/peripheral_console_liteos.ingw b/examples-gcc/peripheral_console_liteos/peripheral_console_liteos.ingw index bcd2d538b..60d1049bf 100644 --- a/examples-gcc/peripheral_console_liteos/peripheral_console_liteos.ingw +++ b/examples-gcc/peripheral_console_liteos/peripheral_console_liteos.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 124912, + "size": 124984, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 147456 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Programs\\gcc-arm-none-eabi-10.3-2021.10\\bin", "eflash_addr": "0x42000", diff --git a/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw index b08eba234..98c449db3 100644 --- a/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -12,7 +12,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Programs\\gcc-arm-none-eabi-10.3-2021.10\\bin", "ide_ver": "", diff --git a/examples-gcc/smart_home_hub/smart_home_hub.ingw b/examples-gcc/smart_home_hub/smart_home_hub.ingw index 6b67c406e..cc1fe6a5e 100644 --- a/examples-gcc/smart_home_hub/smart_home_hub.ingw +++ b/examples-gcc/smart_home_hub/smart_home_hub.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Programs\\gcc-arm-none-eabi-10.3-2021.10\\bin", "eflash_addr": "0x42000", diff --git a/examples-iar/peripheral_ibeacon/generic_cortex.icf b/examples-iar/peripheral_ibeacon/generic_cortex.icf index 8007fef74..a070b79a7 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__ = 536900792; +define symbol __ICFEDIT_region_IRAM1_start__ = 536900792; 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 206323ded..5fd78c468 100644 --- a/examples-iar/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples-iar/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -12,7 +12,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "", "ide_ver": "", diff --git a/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.ingw index e96631281..d7e17b712 100644 --- a/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -12,7 +12,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "", "ide_ver": "", diff --git a/examples-segger/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples-segger/peripheral_ibeacon/peripheral_ibeacon.ingw index fea94fc11..664238a1c 100644 --- a/examples-segger/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples-segger/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -12,7 +12,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "", "ide_ver": "", diff --git a/examples/.gitignore b/examples/.gitignore index 8b3838a0d..37634914d 100644 --- a/examples/.gitignore +++ b/examples/.gitignore @@ -13,5 +13,4 @@ ble_rpc_delete/ dual_i2c/ music_player/ mesh_prov/ -direct_conn/ ble_dongle/ diff --git a/examples/anti_lost_mas/anti_lost_mas.ingw b/examples/anti_lost_mas/anti_lost_mas.ingw index 951365686..24bd8505e 100644 --- a/examples/anti_lost_mas/anti_lost_mas.ingw +++ b/examples/anti_lost_mas/anti_lost_mas.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/anti_lost_sla/anti_lost_sla.ingw b/examples/anti_lost_sla/anti_lost_sla.ingw index 9bbba824e..b61dcbd37 100644 --- a/examples/anti_lost_sla/anti_lost_sla.ingw +++ b/examples/anti_lost_sla/anti_lost_sla.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/ble_rpc/ble_rpc.ingw b/examples/ble_rpc/ble_rpc.ingw index 20b1af5ca..63725739d 100644 --- a/examples/ble_rpc/ble_rpc.ingw +++ b/examples/ble_rpc/ble_rpc.ingw @@ -2,7 +2,7 @@ "watchdog": true, "bundle_meta": { "rom": { - "size": 146392, + "size": 146464, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 163840 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/ble_rpc/flash_download.ini b/examples/ble_rpc/flash_download.ini index 2ec811641..244ff006a 100644 --- a/examples/ble_rpc/flash_download.ini +++ b/examples/ble_rpc/flash_download.ini @@ -19,6 +19,7 @@ Port=COM3 Parity= DataBits=8 StopBits=1 +Timeout=10000 [bin-0] Name=Burn Bin #1 diff --git a/examples/ble_rpc/src/brpc.c b/examples/ble_rpc/src/brpc.c index fadadbad8..a362628db 100644 --- a/examples/ble_rpc/src/brpc.c +++ b/examples/ble_rpc/src/brpc.c @@ -2,6 +2,7 @@ #include #include #include +#include #include "platform_api.h" #include "ll_api.h" #include "uart_driver.h" @@ -12,6 +13,7 @@ #include "gatt_client.h" #include "sm.h" + #include "port_gen_os_driver.h" #include "str_util.h" @@ -983,8 +985,19 @@ uint32_t cb_hard_fault(hard_fault_info_t *info, void *_) } uint32_t cb_assertion(assertion_info_t *info, void *_) -{ - send_platform_event(PLATFORM_CB_EVT_ASSERTION, info, sizeof(*info)); +{ + #pragma pack (push, 1) + struct ret + { + int line_no; + char fn[1]; + } *_r; + #pragma pack (pop) + + int len = sizeof(struct ret) + strlen(info->file_name); + _r = (struct ret *)alloca(sizeof(struct ret) + len); + strcpy(_r->fn, info->file_name); + send_platform_event(PLATFORM_CB_EVT_ASSERTION, _r, len); driver_flush_tx(); platform_printf("[ASSERTION] @ %s:%d\n", info->file_name, diff --git a/examples/ble_rpc/src/brpc_defs.h b/examples/ble_rpc/src/brpc_defs.h index 2955335ac..efe3fefd8 100644 --- a/examples/ble_rpc/src/brpc_defs.h +++ b/examples/ble_rpc/src/brpc_defs.h @@ -2,7 +2,7 @@ #include -#define BRPC_VERSION 0x1 +#define BRPC_VERSION 0x2 #define STATUS_OK 0 #define STATUS_ERR 1 diff --git a/examples/bqb_rf/bqb_rf.ingw b/examples/bqb_rf/bqb_rf.ingw index d5150c23c..1f1064098 100644 --- a/examples/bqb_rf/bqb_rf.ingw +++ b/examples/bqb_rf/bqb_rf.ingw @@ -13,7 +13,7 @@ "base": 33726464 }, "version": [ - 2,2,52] + 2,2,53] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/central_cte/central_cte.ingw b/examples/central_cte/central_cte.ingw index 531ae19ab..a33ba989a 100644 --- a/examples/central_cte/central_cte.ingw +++ b/examples/central_cte/central_cte.ingw @@ -2,7 +2,7 @@ "watchdog": true, "bundle_meta": { "rom": { - "size": 146392, + "size": 146464, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 163840 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/central_fota/central_fota.ingw b/examples/central_fota/central_fota.ingw index d8869d46e..33cfdacce 100644 --- a/examples/central_fota/central_fota.ingw +++ b/examples/central_fota/central_fota.ingw @@ -2,7 +2,7 @@ "watchdog": true, "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/central_mass_conn/central_mass_conn.ingw b/examples/central_mass_conn/central_mass_conn.ingw index 9347b47d5..5a320a384 100644 --- a/examples/central_mass_conn/central_mass_conn.ingw +++ b/examples/central_mass_conn/central_mass_conn.ingw @@ -2,7 +2,7 @@ "watchdog": true, "bundle_meta": { "rom": { - "size": 135768, + "size": 135844, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/central_throughput/central_throughput.ingw b/examples/central_throughput/central_throughput.ingw index 83b50e4db..3a35b2a1f 100644 --- a/examples/central_throughput/central_throughput.ingw +++ b/examples/central_throughput/central_throughput.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/coremark/coremark.ingw b/examples/coremark/coremark.ingw index f3ef3758d..6693772d6 100644 --- a/examples/coremark/coremark.ingw +++ b/examples/coremark/coremark.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 141740, + "size": 141808, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 163840 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/data_logger/data_logger.ingw b/examples/data_logger/data_logger.ingw index 841235525..b1b80f844 100644 --- a/examples/data_logger/data_logger.ingw +++ b/examples/data_logger/data_logger.ingw @@ -2,7 +2,7 @@ "watchdog": true, "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/direct_conn/README.md b/examples/direct_conn/README.md new file mode 100644 index 000000000..e67b578a2 --- /dev/null +++ b/examples/direct_conn/README.md @@ -0,0 +1,5 @@ +# Direct Connection + +This example demonstrates how to: + +* Directly create a connection using `ll_create_conn`. diff --git a/examples/direct_conn/data/advertising.adv b/examples/direct_conn/data/advertising.adv new file mode 100644 index 000000000..77ac542d4 --- /dev/null +++ b/examples/direct_conn/data/advertising.adv @@ -0,0 +1,2 @@ +0 + diff --git a/examples/direct_conn/data/advertising.const b/examples/direct_conn/data/advertising.const new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/examples/direct_conn/data/advertising.const @@ -0,0 +1 @@ + diff --git a/examples/direct_conn/data/advertising.const.tmpl b/examples/direct_conn/data/advertising.const.tmpl new file mode 100644 index 000000000..de1b56375 --- /dev/null +++ b/examples/direct_conn/data/advertising.const.tmpl @@ -0,0 +1,2 @@ +{{loop adv_data_item}}#define {{adv_data_item.key:70}} {{adv_data_item.value}} +{{endloop}} diff --git a/examples/direct_conn/data/cube.dat b/examples/direct_conn/data/cube.dat new file mode 100644 index 000000000..ea1903e4f --- /dev/null +++ b/examples/direct_conn/data/cube.dat @@ -0,0 +1,45 @@ +[Window][Main] +Pos=0,0 +Size=2560,1459 +Collapsed=0 + +[Window][Debug##Default] +Pos=60,60 +Size=400,400 +Collapsed=0 + +[Window][Confirm?##menu_reset] +Pos=965,631 +Size=630,196 +Collapsed=0 + +[Window][Properties - SPI0] +Pos=60,60 +Size=960,960 +Collapsed=0 + +[Window][Confirm?##menu_change_part] +Pos=829,631 +Size=902,196 +Collapsed=0 + +[ingCube][ING91870C] +UART0=configIsr=0,isrName=uart0_isr,isrParam=NULL,enableClk=1,pinRx=14,pinTx=15,pinCts=-1,pinRts=-1,baud=115200,wlen=3,parity=0,fifoEn=1,rxEn=1,txEn=1,stopBits=0,useCts=0,useRts=0,enableRxIRQ=0,enableTxIRQ=0,txFifoLevel=1,rxFifoLevel=1, +UART1=configIsr=0,isrName=uart1_isr,isrParam=NULL,enableClk=0,pinRx=-1,pinTx=-1,pinCts=-1,pinRts=-1,baud=115200,wlen=3,parity=0,fifoEn=1,rxEn=1,txEn=1,stopBits=0,useCts=0,useRts=0,enableRxIRQ=0,enableTxIRQ=0,txFifoLevel=1,rxFifoLevel=1, +SPI0=configIsr=0,isrName=spi0_isr,isrParam=NULL,enableClk=1,mode=0,freq=12000000,polarity=0,phase=0,dataWidth=16,pinClk=-1,pinMISO=-1,pinMOSI=-1,pinCSn=-1, +SPI1=configIsr=0,isrName=spi1_isr,isrParam=NULL,enableClk=0,mode=0,freq=12000000,polarity=0,phase=0,dataWidth=16,pinClk=-1,pinMISO=-1,pinMOSI=-1,pinCSn=-1, +I2C0=configIsr=0,isrName=i2c0_isr,isrParam=NULL,enableClk=0,pinSCL=-1,pinSDA=-1, +I2C1=configIsr=0,isrName=i2c1_isr,isrParam=NULL,enableClk=0,pinSCL=-1,pinSDA=-1, +GPIO=configIsr=0,isrName=gpio_isr,isrParam=NULL,enableClk=0,0=0|0|0|0,1=0|0|0|0,2=0|0|0|0,3=0|0|0|0,4=0|0|0|0,5=0|0|0|0,6=0|0|0|0,7=0|0|0|0,8=0|0|0|0,9=0|0|0|0,10=0|0|0|0,11=0|0|0|0,12=0|0|0|0, +PWM=configIsr=0,isrName=pwm_isr,isrParam=NULL,enableClk=0,0=-1|-1|0|0|0|0|0|0|0|0|0|0|0|0|0|1148846080,1=-1|-1|0|0|0|0|0|0|0|0|0|0|0|0|0|1148846080,2=-1|-1|0|0|0|0|0|0|0|0|0|0|0|0|0|1148846080,3=-1|-1|0|0|0|0|0|0|0|0|0|0|0|0|0|1148846080,4=-1|-1|0|0|0|0|0|0|0|0|0|0|0|0|0|1148846080,5=-1|-1|0|0|0|0|0|0|0|0|0|0|0|0|0|1148846080, +TIMER0=configIsr=0,isrName=timer0_isr,isrParam=NULL,enableClk=0,asWdt=0,wdtTimeout=10.000000,enable=0,workMode=0,freq=1.000000,compValue=0,enableIrq=0, +TIMER1=configIsr=0,isrName=timer1_isr,isrParam=NULL,enableClk=0,enable=0,workMode=0,freq=1.000000,compValue=0,enableIrq=0, +TIMER2=configIsr=0,isrName=timer2_isr,isrParam=NULL,enableClk=0,enable=0,workMode=0,freq=1.000000,compValue=0,enableIrq=0, +RTC=configIsr=0,isrName=rtc_isr,isrParam=NULL,enableClk=0,enable=1 +ADC=configIsr=0,isrName=adc_isr,isrParam=NULL,enableClk=0, +Misc=sca=500,0=0|1|2,1=0|1|2,2=0|1|2,3=0|1|2,4=0|1|2,5=0|1|2,6=0|1|2,7=0|1|2,8=0|1|2,9=0|1|2,10=0|1|2,11=0|1|2,12=0|1|2, +Mux=index=0, + +[ingCube state][ING91870C] +Scale=340.000000 +OriginOnWindow=200.000000,200.000000 diff --git a/examples/direct_conn/data/gatt.const b/examples/direct_conn/data/gatt.const new file mode 100644 index 000000000..139597f9c --- /dev/null +++ b/examples/direct_conn/data/gatt.const @@ -0,0 +1,2 @@ + + diff --git a/examples/direct_conn/data/gatt.const.tmpl b/examples/direct_conn/data/gatt.const.tmpl new file mode 100644 index 000000000..15f5fbd6a --- /dev/null +++ b/examples/direct_conn/data/gatt.const.tmpl @@ -0,0 +1,4 @@ +{{loop gatt_handle}}#define {{gatt_handle.key:50}} {{gatt_handle.value}} +{{endloop}} +{{loop gatt_value_offset}}#define {{gatt_value_offset.key:50}} {{gatt_value_offset.value}} +{{endloop}} diff --git a/examples/direct_conn/data/gatt.profile b/examples/direct_conn/data/gatt.profile new file mode 100644 index 000000000..2a1d4206c --- /dev/null +++ b/examples/direct_conn/data/gatt.profile @@ -0,0 +1,2 @@ +0, 0 + diff --git a/examples/direct_conn/data/scan_response.adv b/examples/direct_conn/data/scan_response.adv new file mode 100644 index 000000000..77ac542d4 --- /dev/null +++ b/examples/direct_conn/data/scan_response.adv @@ -0,0 +1,2 @@ +0 + diff --git a/examples/direct_conn/data/scan_response.const b/examples/direct_conn/data/scan_response.const new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/examples/direct_conn/data/scan_response.const @@ -0,0 +1 @@ + diff --git a/examples/direct_conn/data/scan_response.const.tmpl b/examples/direct_conn/data/scan_response.const.tmpl new file mode 100644 index 000000000..de1b56375 --- /dev/null +++ b/examples/direct_conn/data/scan_response.const.tmpl @@ -0,0 +1,2 @@ +{{loop adv_data_item}}#define {{adv_data_item.key:70}} {{adv_data_item.value}} +{{endloop}} diff --git a/examples/direct_conn/data/setup_soc.cgen b/examples/direct_conn/data/setup_soc.cgen new file mode 100644 index 000000000..22dbecea4 --- /dev/null +++ b/examples/direct_conn/data/setup_soc.cgen @@ -0,0 +1,35 @@ +void cube_soc_init(void) +{ +platform_config(PLATFORM_CFG_OSC32K_EN, PLATFORM_CFG_DISABLE); +platform_config(PLATFORM_CFG_32K_CLK_ACC, 500); +} + +void cube_setup_peripherals(void) +{ +SYSCTRL_ClearClkGateMulti((1 << SYSCTRL_ClkGate_APB_PinCtrl) | (1 << SYSCTRL_ClkGate_APB_UART0) | (1 << SYSCTRL_ClkGate_AHB_SPI0)); + +// UART0 +PINCTRL_SetPadMux(2, IO_SOURCE_UART0_TX); +PINCTRL_SetPadMux(3, IO_SOURCE_GENERAL); +PINCTRL_SelUartRxdIn(UART_PORT_0, 3); +{ + UART_sStateStruct config; + + config.word_length = (UART_eWLEN)3; + config.parity = UART_PARITY_NOT_CHECK; + config.fifo_enable = 1; + config.two_stop_bits = 0; + config.receive_en = 1; + config.transmit_en = 1; + config.UART_en = 1; + config.cts_en = 0; + config.rts_en = 0; + config.rxfifo_waterlevel = 1; + config.txfifo_waterlevel = 1; + config.ClockFrequency = OSC_CLK_FREQ; + config.BaudRate = 115200; + + apUART_Initialize(APB_UART0, &config, 0); +} + +} diff --git a/examples/direct_conn/direct_conn.ingw b/examples/direct_conn/direct_conn.ingw new file mode 100644 index 000000000..28124f9cb --- /dev/null +++ b/examples/direct_conn/direct_conn.ingw @@ -0,0 +1,81 @@ +{ + "watchdog": true, + "bundle_meta": { + "rom": { + "size": 147176, + "base": 16384 + }, + "ram": { + "size": 29980, + "base": 536870912 + }, + "app": { + "base": 163840 + }, + "version": [ + 1,9,39] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "eflash_addr": "0x42000", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "use_uart_trace": false, + "ota": false, + "ide": "keil", + "git": false, + "use_segger_rtt": true, + "trace_port": "seggerrtt", + "trace_mask": "", + "scan_data": "0\r\n", + "priv_addr": "GAP_RANDOM_ADDRESS_OFF", + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingchips\\ingWizard\\templates\\typical\\peripheral", + "coding_adv": false, + "key_incode": true, + "series": "ING9187xx", + "proj_name": "direct_conn", + "sdk_release_path": "..\/..", + "printf_port": "uart0", + "security": false, + "legacy_adv": true, + "adv_data": "0\r\n", + "use_eflash": false, + "wizard_dir": "C:\/projects\/ingchips\/ingWizard", + "key_addr": "0x44000", + "trace_enable": true, + "pb_adv": true, + "is_sdk_path_rel": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/ingchips\/SDK_Release\/examples\\direct_conn", + "heap_size": 0, + "power_saving": false, + "secondary": false, + "bundle": "exp", + "app_rom_size": "376832", + "app_rom_addr": "163840", + "family": "ing918", + "vcode": false, + "heap_override": false, + "trace_mask_nim": "", + "io_cap": "IO_CAPABILITY_NO_INPUT_NO_OUTPUT", + "role": "peripheral", + "noos": false, + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "app_ram_size": 35552, + "app_ram_addr": 536900896, + "k5_cc_ver": "6", + "printf_enable": true, + "ota_ver_patch": "0", + "profile_data": "0, 0\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples/direct_conn/direct_conn.uvopt b/examples/direct_conn/direct_conn.uvopt new file mode 100644 index 000000000..e0370c36a --- /dev/null +++ b/examples/direct_conn/direct_conn.uvopt @@ -0,0 +1,368 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + Target 1 + 0x4 + ARM-ADS + + 32000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\listing\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 0 + + SARMCM3.DLL + + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 7 + + + + + ..\map.ini + + + + + .\init.ini + Segger\JL2CM3.dll + + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + DLGUARM + + + + 0 + JL2CM3 + -O78 -S0 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO6 -FD20000000 -FC8800 -FN1 -FF0ING91800 -FS04000 -FL080000 + + + 0 + UL2CM3 + -U -O14 -S0 -C-1 -P00 -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO2 -FD20000000 -FC8000 -FN1 -FF0ING91800 -FS04000 -FL080000 + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + APP + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\src\main.c + main.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 19 + 0 + 1 + 13 + 0 + .\src\profile.c + profile.c + 0 + 0 + + + + + StartUP + 0 + 0 + 0 + 0 + + 2 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\src\startup_ing91800.s + startup_ing91800.s + 0 + 0 + + + 2 + 4 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ../..\bundles\exp\ING9187xx\symdefs.m + symdefs.m + 0 + 0 + + + + + BSP + 0 + 0 + 0 + 0 + + + + FWlib + 0 + 0 + 0 + 0 + + 4 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ../..\src\FWlib\peripheral_uart.c + peripheral_uart.c + 0 + 0 + + + 4 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ../..\src\FWlib\peripheral_pinctrl.c + peripheral_pinctrl.c + 0 + 0 + + + 4 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ../..\src\FWlib\peripheral_sysctrl.c + peripheral_sysctrl.c + 0 + 0 + + + 4 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ../..\src\FWlib\peripheral_timer.c + peripheral_timer.c + 0 + 0 + + + + + Tools + 0 + 0 + 0 + 0 + + 5 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ../..\src\Tools\trace.c + trace.c + 0 + 0 + + + +
diff --git a/examples/direct_conn/direct_conn.uvoptx b/examples/direct_conn/direct_conn.uvoptx new file mode 100644 index 000000000..195168765 --- /dev/null +++ b/examples/direct_conn/direct_conn.uvoptx @@ -0,0 +1,353 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + Target 1 + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\listing\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 4 + + + + + .\init.ini + + + + + .\init.ini + Segger\JL2CM3.dll + + + + 0 + DLGUARM + d + + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + JL2CM3 + -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC8000 -FN1 -FF0ING91800.flm -FS04000 -FL080000 -FP0($$Device:ING91800$Flash\ING91800.flm) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + + + + APP + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + .\src\main.c + main.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + .\src\profile.c + profile.c + 0 + 0 + + + + + StartUP + 0 + 0 + 0 + 0 + + 2 + 3 + 2 + 0 + 0 + 0 + .\src\startup_ing91800.s + startup_ing91800.s + 0 + 0 + + + 2 + 4 + 3 + 0 + 0 + 0 + ../..\bundles\exp\ING9187xx\symdefs.m + symdefs.m + 0 + 0 + + + + + BSP + 0 + 0 + 0 + 0 + + + + FWlib + 0 + 0 + 0 + 0 + + 4 + 5 + 1 + 0 + 0 + 0 + ../..\src\FWlib\peripheral_uart.c + peripheral_uart.c + 0 + 0 + + + 4 + 6 + 1 + 0 + 0 + 0 + ../..\src\FWlib\peripheral_pinctrl.c + peripheral_pinctrl.c + 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_timer.c + peripheral_timer.c + 0 + 0 + + + + + Tools + 0 + 0 + 0 + 0 + + 5 + 9 + 1 + 0 + 0 + 0 + ../..\src\Tools\trace.c + trace.c + 0 + 0 + + + + + ::CMSIS + 0 + 0 + 0 + 1 + + +
diff --git a/examples/direct_conn/direct_conn.uvproj b/examples/direct_conn/direct_conn.uvproj new file mode 100644 index 000000000..e2608d3da --- /dev/null +++ b/examples/direct_conn/direct_conn.uvproj @@ -0,0 +1,464 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + Target 1 + 0x4 + ARM-ADS + + + ING91800 + INGCHIPS + CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) + + + + 0 + + + + + + + + + + + + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\output\ + direct_conn + 1 + 0 + 1 + 1 + 1 + .\listing\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf.exe --bin -o direct_conn.bin ./output/direct_conn.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 1 + + 0 + 7 + + + + + + ..\map.ini + + + + + + + .\init.ini + Segger\JL2CM3.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 5 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x10000 + + + 1 + 0x4000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x28000 + 0x5c000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20007520 + 0x8ae0 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + + --gnu + USE_STDPERIPH_DRIVER,CONN_ROLE=0 + + ../../bundles/exp/inc;../../bundles/exp/inc/os;../../src/BSP;../../src/FWlib;../../src/StartUP/ing918;../../src/Tools;../../src + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x00000000 + + + + + + + + + + + + APP + + + main.c + 1 + .\src\main.c + + + profile.c + 1 + .\src\profile.c + + + + + StartUP + + + startup_ing91800.s + 2 + .\src\startup_ing91800.s + + + symdefs.m + 3 + ../..\bundles\exp\ING9187xx\symdefs.m + + + + + BSP + + + FWlib + + + peripheral_uart.c + 1 + ../..\src\FWlib\peripheral_uart.c + + + peripheral_pinctrl.c + 1 + ../..\src\FWlib\peripheral_pinctrl.c + + + peripheral_sysctrl.c + 1 + ../..\src\FWlib\peripheral_sysctrl.c + + + peripheral_timer.c + 1 + ../..\src\FWlib\peripheral_timer.c + + + + + Tools + + + trace.c + 1 + ../..\src\Tools\trace.c + + + + + + + +
diff --git a/examples/direct_conn/direct_conn.uvprojx b/examples/direct_conn/direct_conn.uvprojx new file mode 100644 index 000000000..66669e873 --- /dev/null +++ b/examples/direct_conn/direct_conn.uvprojx @@ -0,0 +1,466 @@ + + + 2.1 +
### uVision Project, (C) Keil Software
+ + + Target 1 + 0x4 + ARM-ADS + 6160000::V6.16::ARMCLANG + 1 + + + ING91800 + INGChips + 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 + 0 + 0 + 1 + + .\output\ + direct_conn + 1 + 0 + 1 + 1 + 1 + .\listing\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf.exe --bin -o direct_conn.bin ./output/direct_conn.axf + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM3 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 8 + 1 + 0 + 0 + 0 + 3 + 5 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x10000 + + + 1 + 0x4000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 163840 + 376832 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 536900896 + 35552 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 3 + 0 + 0 + 0 + 0 + 0 + 3 + 3 + 1 + 1 + 0 + 0 + 0 + + + USE_STDPERIPH_DRIVER,CONN_ROLE=0 + + ../../bundles/exp/inc;../../bundles/exp/inc/os;../../src/BSP;../../src/FWlib;../../src/StartUP/ing918;../../src/Tools;../../src + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x00000000 + + + + + + + + + + + + + APP + + + main.c + 1 + .\src\main.c + + + profile.c + 1 + .\src\profile.c + + + + + StartUP + + + startup_ing91800.s + 2 + .\src\startup_ing91800.s + + + symdefs.m + 3 + ../..\bundles\exp\ING9187xx\symdefs.m + + + + + BSP + + + FWlib + + + peripheral_uart.c + 1 + ../..\src\FWlib\peripheral_uart.c + + + peripheral_pinctrl.c + 1 + ../..\src\FWlib\peripheral_pinctrl.c + + + peripheral_sysctrl.c + 1 + ../..\src\FWlib\peripheral_sysctrl.c + + + peripheral_timer.c + 1 + ../..\src\FWlib\peripheral_timer.c + + + + + Tools + + + trace.c + 1 + ../..\src\Tools\trace.c + + + + + ::CMSIS + + + + + + + + + + + + + + + + +
diff --git a/examples/direct_conn/doc/index.md b/examples/direct_conn/doc/index.md new file mode 100644 index 000000000..c157ff04e --- /dev/null +++ b/examples/direct_conn/doc/index.md @@ -0,0 +1,19 @@ +# Direct Connection + +This example demonstrates how to directly create a connection between +two devices using `ll_create_conn` without advertising. + +Before calling `ll_create_conn`, all connection parameters (PHY, interval, +access address, CRC init value, master clock accuracy, etc) need to be exchanged using +other methods which is designed by developers. In this example, raw packet API is used +to pass these parameters to the Peripheral device in packet (named `paging_packet` here); +when Peripheral device receives such paging, it will respond with a another raw packet +(named `access_packet` here) carrying its address. When Central receives `access_packet`, +the connection is created by `ll_create_conn`. + +## Test + +Build this project twice with compiling switch `CONN_ROLE` set to `0` & `1` respectively, +and download it two Dev-Boards. + +Check `printf` log to see if the connection can be established or not. diff --git a/examples/direct_conn/flash_download.ini b/examples/direct_conn/flash_download.ini new file mode 100644 index 000000000..d84a2c9f6 --- /dev/null +++ b/examples/direct_conn/flash_download.ini @@ -0,0 +1,63 @@ +[main] +family=ing918 +timeout=10000 +MIN_ADDR=16384 +MAX_ADDR=540671 + +[options] +download=1 +verify=0 +redownload=1 +entry=0x4000 +set-entry=1 +launch=1 +batch=1 +script= +protection.enabled=0 +protection.unlock=0 +UseScript=0 +batch.current=0 +batch.limit=-1 + +[uart] +Baud=921600 +Port=COM3 +Parity= +DataBits=8 +StopBits=1 + +[bin-0] +Name=Burn Bin #1 +Checked=1 +FileName=../../bundles/exp/ING9187xx/platform.bin +Address=16384 + +[bin-1] +Name=Burn Bin #2 +Checked=1 +Address=163840 +FileName=direct_conn.bin + +[bin-2] +Name=Burn Bin #3 +Checked=0 +FileName= +Address=16384 + +[bin-3] +Name=Burn Bin #4 +Checked=0 +FileName= +Address=16384 + +[bin-4] +Name=Burn Bin #5 +Checked=0 +FileName= +Address=16384 + +[bin-5] +Name=Burn Bin #6 +Checked=0 +FileName= +Address=16384 diff --git a/examples/direct_conn/init.ini b/examples/direct_conn/init.ini new file mode 100644 index 000000000..72989a2f2 --- /dev/null +++ b/examples/direct_conn/init.ini @@ -0,0 +1,3 @@ +msp = *(unsigned int *)( 0x00004000 ) +pc = *(unsigned int *)( 0x00004000 + 4 ) + diff --git a/examples/direct_conn/src/main.c b/examples/direct_conn/src/main.c new file mode 100644 index 000000000..e90b7943e --- /dev/null +++ b/examples/direct_conn/src/main.c @@ -0,0 +1,137 @@ +#include +#include +#include "profile.h" +#include "ingsoc.h" +#include "platform_api.h" +#include "FreeRTOS.h" +#include "task.h" +#include "trace.h" + +static uint32_t cb_hard_fault(hard_fault_info_t *info, void *_) +{ + platform_printf("HARDFAULT:\nPC : 0x%08X\nLR : 0x%08X\nPSR: 0x%08X\n" + "R0 : 0x%08X\nR1 : 0x%08X\nR2 : 0x%08X\nP3 : 0x%08X\n" + "R12: 0x%08X\n", + info->pc, info->lr, info->psr, + info->r0, info->r1, info->r2, info->r3, info->r12); + for (;;); +} + +static uint32_t cb_assertion(assertion_info_t *info, void *_) +{ + platform_printf("[ASSERTION] @ %s:%d\n", + info->file_name, + info->line_no); + for (;;); +} + +static uint32_t cb_heap_out_of_mem(uint32_t tag, void *_) +{ + platform_printf("[OOM] @ %d\n", tag); + for (;;); +} + +#define PRINT_PORT APB_UART0 + +uint32_t cb_putc(char *c, void *dummy) +{ + while (apUART_Check_TXFIFO_FULL(PRINT_PORT) == 1); + UART_SendData(PRINT_PORT, (uint8_t)*c); + return 0; +} + +int fputc(int ch, FILE *f) +{ + cb_putc((char *)&ch, NULL); + return ch; +} + +void config_uart(uint32_t freq, uint32_t baud) +{ + UART_sStateStruct config; + + config.word_length = UART_WLEN_8_BITS; + config.parity = UART_PARITY_NOT_CHECK; + config.fifo_enable = 1; + config.two_stop_bits = 0; + config.receive_en = 1; + config.transmit_en = 1; + config.UART_en = 1; + config.cts_en = 0; + config.rts_en = 0; + config.rxfifo_waterlevel = 1; + config.txfifo_waterlevel = 1; + config.ClockFrequency = freq; + config.BaudRate = baud; + + apUART_Initialize(PRINT_PORT, &config, 0); +} + +void setup_peripherals(void) +{ + SYSCTRL_ClearClkGateMulti(0 + | (1 << SYSCTRL_ClkGate_APB_TMR0)); + config_uart(OSC_CLK_FREQ, 115200); + + if (!IS_DEBUGGER_ATTACHED()) + { + // Watchdog will timeout after ~20sec + TMR_WatchDogEnable(TMR_CLK_FREQ * 10); + } +} + +uint32_t on_deep_sleep_wakeup(void *dummy, void *user_data) +{ + (void)(dummy); + (void)(user_data); + setup_peripherals(); + return 0; +} + +uint32_t query_deep_sleep_allowed(void *dummy, void *user_data) +{ + (void)(dummy); + (void)(user_data); + // TODO: return 0 if deep sleep is not allowed now; else deep sleep is allowed + return 0; +} + +static void watchdog_task(void *pdata) +{ + for (;;) + { + vTaskDelay(pdMS_TO_TICKS(9000)); + TMR_WatchDogRestart(); + } +} + +trace_rtt_t trace_ctx = {0}; + + +int app_main() +{ + platform_set_evt_callback(PLATFORM_CB_EVT_PROFILE_INIT, setup_profile, NULL); + + // setup handlers + platform_set_evt_callback(PLATFORM_CB_EVT_HARD_FAULT, (f_platform_evt_cb)cb_hard_fault, NULL); + platform_set_evt_callback(PLATFORM_CB_EVT_ASSERTION, (f_platform_evt_cb)cb_assertion, NULL); + platform_set_evt_callback(PLATFORM_CB_EVT_HEAP_OOM, (f_platform_evt_cb)cb_heap_out_of_mem, NULL); + 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); + + setup_peripherals(); + xTaskCreate(watchdog_task, + "w", + configMINIMAL_STACK_SIZE, + NULL, + (configMAX_PRIORITIES - 1), + NULL); + + trace_rtt_init(&trace_ctx); + platform_set_evt_callback(PLATFORM_CB_EVT_TRACE, (f_platform_evt_cb)cb_trace_rtt, &trace_ctx); + // TODO: config trace mask + platform_config(PLATFORM_CFG_TRACE_MASK, 0xff); + return 0; +} + diff --git a/examples/direct_conn/src/profile.c b/examples/direct_conn/src/profile.c new file mode 100644 index 000000000..f92b2d371 --- /dev/null +++ b/examples/direct_conn/src/profile.c @@ -0,0 +1,298 @@ +#include +#include +#include "platform_api.h" +#include "att_db.h" +#include "gap.h" +#include "btstack_event.h" +#include "btstack_defines.h" + +// GATT characteristic handles +#include "../data/gatt.const" + +#if (CONN_ROLE != HCI_ROLE_SLAVE) +const static uint8_t profile_data[] = { + #include "../data/gatt.profile" +}; +#endif + +struct ll_raw_packet *paging_packet; +struct ll_raw_packet *access_packet; + +static uint8_t pkt_data[300]; + +#define PAGING_CH 8 +#define PAGING_PHY 1 +#define PAGING_ACC 0xabcdef +#define PAGING_CRC_INIT 0x1234 +#define ACCESS_CH 9 +#define ACCESS_PHY 1 +#define ACCESS_ACC 0xfedc98 +#define ACCESS_CRC_INIT 0x1234 + +struct paging_pkt +{ + uint32_t acc_offset; + uint32_t start_time_offset; // offset of 1st connection event + uint8_t rx_phy; // see `ll_create_conn` + uint8_t tx_phy; + uint32_t access_addr; + uint32_t crc_init; + uint32_t interval; + uint16_t sup_timeout; + uint8_t channel_map[5]; + uint8_t ch_sel_algo; + uint8_t hop_inc; + uint16_t min_ce_len; + uint16_t max_ce_len; + uint16_t slave_latency; + uint8_t sleep_clk_acc; +}; + +#if (CONN_ROLE == HCI_ROLE_MASTER) +#define ACC_OFFSET 2000 + +static struct paging_pkt paging_pkt = +{ + .acc_offset = ACC_OFFSET, + .start_time_offset = ACC_OFFSET + ACC_OFFSET, + .rx_phy = 1, + .tx_phy = 1, + .access_addr = 0x91809160, + .crc_init = 0x912, + .interval = 1250 * 20, + .sup_timeout = 200, + .channel_map = {0xff, 0xff, 0xff, 0xff, 0x1f}, + .ch_sel_algo = 1, + .hop_inc = 8, + .min_ce_len = 20, + .max_ce_len = 20, + .slave_latency = 0, + .sleep_clk_acc = 0 +}; +#else +static struct paging_pkt paging_pkt = {0}; + +// clock jitter should be caculated from sleep clock accuracy +// this is demo only +#define JITTER (100) +#endif + +static const bd_addr_t adv_addr = { 0xEC, 0xA5, 0x1B, 0x06, 0xBB, 0x33 }; +static const bd_addr_t init_addr = { 0xEC, 0xA5, 0x1B, 0x06, 0xBB, 0x55 }; + +static uint64_t paging_time = 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) + { + + default: + 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) +{ + switch (att_handle) + { + + default: + return 0; + } +} + +#define USER_TRIGGER_PAGING 1 +#define USER_CREATE_CONN 2 + +static void user_msg_handler(uint32_t msg_id, void *data, uint16_t size) +{ + switch (msg_id) + { + case USER_TRIGGER_PAGING: +#if (CONN_ROLE == HCI_ROLE_MASTER) + paging_time = platform_get_us_time() + 500000; + ll_raw_packet_send(paging_packet, paging_time); + ll_raw_packet_recv(access_packet, paging_time + ACC_OFFSET - 50, 80000); +#else + ll_raw_packet_recv(paging_packet, platform_get_us_time() + 800, 1000000); +#endif + break; + case USER_CREATE_CONN: + ll_create_conn( + CONN_ROLE, + (BD_ADDR_TYPE_LE_RANDOM << 1) | BD_ADDR_TYPE_LE_RANDOM, + adv_addr, + init_addr, + paging_pkt.rx_phy, + paging_pkt.tx_phy, + paging_pkt.access_addr, + paging_pkt.crc_init, + paging_pkt.interval, + paging_pkt.sup_timeout, + paging_pkt.channel_map, + paging_pkt.ch_sel_algo, + paging_pkt.hop_inc, + paging_pkt.min_ce_len, + paging_pkt.max_ce_len, +#if (CONN_ROLE == HCI_ROLE_MASTER) + paging_time + paging_pkt.start_time_offset, + paging_pkt.slave_latency, + paging_pkt.sleep_clk_acc, + 0 +#else + paging_time + paging_pkt.start_time_offset - JITTER, + paging_pkt.slave_latency, + paging_pkt.sleep_clk_acc, + JITTER * 2 +#endif + ); + break; + default: + ; + } +} + +void dummy_callback(struct ll_raw_packet *packet, void *user_data) +{ +} + +void on_access_rx(struct ll_raw_packet *packet, void *user_data) +{ + uint64_t air_time; + uint8_t header; + int len = 0; + int rssi; + + if ((ll_raw_packet_get_rx_data(packet, &air_time, &header, pkt_data, &len, &rssi) != 0) + || (len != sizeof(adv_addr)) + || memcmp(pkt_data, adv_addr, sizeof(adv_addr))) + { + platform_printf("no access: %d\n", len); + btstack_push_user_msg(USER_TRIGGER_PAGING, NULL, 0); + return; + } + + btstack_push_user_msg(USER_CREATE_CONN, NULL, 0); +} + +void on_paging_rx(struct ll_raw_packet *packet, void *user_data) +{ + uint8_t header; + int len = 0; + int rssi; + + if ((ll_raw_packet_get_rx_data(packet, &paging_time, &header, pkt_data, &len, &rssi) != 0) + || (len != sizeof(struct paging_pkt))) + { + platform_printf("no paging\n"); + btstack_push_user_msg(USER_TRIGGER_PAGING, NULL, 0); + return; + } + + memcpy(&paging_pkt, pkt_data, sizeof(struct paging_pkt)); + ll_raw_packet_send(access_packet, paging_time + paging_pkt.acc_offset); + btstack_push_user_msg(USER_CREATE_CONN, 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); + 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; +#if (CONN_ROLE == HCI_ROLE_MASTER) + paging_packet = ll_raw_packet_alloc(1, dummy_callback, NULL); + access_packet = ll_raw_packet_alloc(0, on_access_rx, NULL); +#else + paging_packet = ll_raw_packet_alloc(0, on_paging_rx, NULL); + access_packet = ll_raw_packet_alloc(1, dummy_callback, NULL); +#endif + ll_raw_packet_set_param(paging_packet, + 3, + PAGING_CH, + PAGING_PHY, + PAGING_ACC, + PAGING_CRC_INIT); + ll_raw_packet_set_param(access_packet, + 3, + ACCESS_CH, + ACCESS_PHY, + ACCESS_ACC, + ACCESS_CRC_INIT); +#if (CONN_ROLE == HCI_ROLE_MASTER) + ll_raw_packet_set_tx_data(paging_packet, 0, &paging_pkt, sizeof(paging_pkt)); +#else + ll_raw_packet_set_tx_data(access_packet, 0, adv_addr, sizeof(adv_addr)); +#endif + btstack_push_user_msg(USER_TRIGGER_PAGING, NULL, 0); + break; + + case HCI_EVENT_COMMAND_COMPLETE: + switch (hci_event_command_complete_get_command_opcode(packet)) + { + // add your code to check command complete response + // case : + // break; + default: + break; + } + break; + + case HCI_EVENT_LE_META: + switch (hci_event_le_meta_get_subevent_code(packet)) + { + case HCI_SUBEVENT_LE_ENHANCED_CONNECTION_COMPLETE: + platform_printf("connected\n"); +#if (CONN_ROLE == HCI_ROLE_MASTER) +#else + att_set_db(decode_hci_le_meta_event(packet, le_meta_event_enh_create_conn_complete_t)->handle, + profile_data); +#endif + + break; + default: + break; + } + + break; + + case HCI_EVENT_DISCONNECTION_COMPLETE: + platform_printf("disconnected\n"); + btstack_push_user_msg(USER_TRIGGER_PAGING, NULL, 0); + break; + + case ATT_EVENT_CAN_SEND_NOW: + // add your code + 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; + } +} + +static btstack_packet_callback_registration_t hci_event_callback_registration; + +uint32_t setup_profile(void *data, void *user_data) +{ + platform_printf("setup profile\n"); + // Note: security has not been enabled. + 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/direct_conn/src/profile.h b/examples/direct_conn/src/profile.h new file mode 100644 index 000000000..ba2799741 --- /dev/null +++ b/examples/direct_conn/src/profile.h @@ -0,0 +1,10 @@ +#ifndef _PROFILESTASK_H_ +#define _PROFILESTASK_H_ + +#include + +uint32_t setup_profile(void *data, void *user_data); + +#endif + + diff --git a/examples/direct_conn/src/startup_ing91800.s b/examples/direct_conn/src/startup_ing91800.s new file mode 100644 index 000000000..3b4c6d677 --- /dev/null +++ b/examples/direct_conn/src/startup_ing91800.s @@ -0,0 +1,102 @@ +;/**************************************************************************//** +; * @file startup_ARMCM3.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM3 Device Series +; * @version V1.08 +; * @date 03. February 2012 +; * +; * @note +; * Copyright (C) 2012 ARM Limited. All rights reserved. +; * +; * @par +; * ARM Limited (ARM) is supplying this software for use with Cortex-M +; * processor based microcontrollers. This file can be freely distributed +; * within development tools that are supporting such ARM based processors. +; * +; * @par +; * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +; * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +; * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +; * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +; * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +; * +; ******************************************************************************/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + +Stack_Size EQU 0x00000004 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + EXPORT __initial_sp + + + EXPORT __heap_base + EXPORT __heap_limit + +Heap_Size EQU 0 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + +__Vectors DCD 0 ; Top of Stack + DCD Reset_Handler ; Reset Handler + +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler + IMPORT __scatterload + + ; this push is consumed by main + PUSH {R1, LR} + + ; save msp + MRS R1, MSP + MSR PSP, R1 + + LDR R0, =__scatterload + BX R0 + + ENDP + + ALIGN + +main PROC + EXPORT main + IMPORT app_main + + LDR R0, =app_main + BLX R0 + + ; restore msp + MRS R1, PSP + MSR MSP, R1 + + POP {R1, PC} + + ENDP + + ALIGN + + END diff --git a/examples/ext_ackable_packet/ext_ackable_packet.ingw b/examples/ext_ackable_packet/ext_ackable_packet.ingw index e7e7d53de..381be711b 100644 --- a/examples/ext_ackable_packet/ext_ackable_packet.ingw +++ b/examples/ext_ackable_packet/ext_ackable_packet.ingw @@ -2,7 +2,7 @@ "watchdog": true, "bundle_meta": { "rom": { - "size": 146392, + "size": 146464, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 163840 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/ext_raw_packet/ext_raw_packet.ingw b/examples/ext_raw_packet/ext_raw_packet.ingw index 1dc1d78bf..68b413db6 100644 --- a/examples/ext_raw_packet/ext_raw_packet.ingw +++ b/examples/ext_raw_packet/ext_raw_packet.ingw @@ -2,7 +2,7 @@ "watchdog": true, "bundle_meta": { "rom": { - "size": 146392, + "size": 146464, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 163840 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/ext_raw_packet_noos/ext_raw_packet_noos.ingw b/examples/ext_raw_packet_noos/ext_raw_packet_noos.ingw index 31abd3131..b7791e398 100644 --- a/examples/ext_raw_packet_noos/ext_raw_packet_noos.ingw +++ b/examples/ext_raw_packet_noos/ext_raw_packet_noos.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 135612, + "size": 135684, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/gatt_relay/gatt_relay.ingw b/examples/gatt_relay/gatt_relay.ingw index e6f96a75c..7ae7bebe9 100644 --- a/examples/gatt_relay/gatt_relay.ingw +++ b/examples/gatt_relay/gatt_relay.ingw @@ -2,7 +2,7 @@ "watchdog": true, "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/get_started/get_started.ingw b/examples/get_started/get_started.ingw index 95c76bceb..19406e5e6 100644 --- a/examples/get_started/get_started.ingw +++ b/examples/get_started/get_started.ingw @@ -2,7 +2,7 @@ "watchdog": true, "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/hid_keyboard/hid_keyboard.ingw b/examples/hid_keyboard/hid_keyboard.ingw index 81dc3165b..a837442af 100644 --- a/examples/hid_keyboard/hid_keyboard.ingw +++ b/examples/hid_keyboard/hid_keyboard.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/hid_mouse/hid_mouse.ingw b/examples/hid_mouse/hid_mouse.ingw index 1751d812c..5dd2db883 100644 --- a/examples/hid_mouse/hid_mouse.ingw +++ b/examples/hid_mouse/hid_mouse.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/ibeacon_scanner/ibeacon_scanner.ingw b/examples/ibeacon_scanner/ibeacon_scanner.ingw index 81c9400b2..c28fd8dff 100644 --- a/examples/ibeacon_scanner/ibeacon_scanner.ingw +++ b/examples/ibeacon_scanner/ibeacon_scanner.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -12,7 +12,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/io_over_ble_mas/io_over_ble_mas.ingw b/examples/io_over_ble_mas/io_over_ble_mas.ingw index 064602ed1..f17b44034 100644 --- a/examples/io_over_ble_mas/io_over_ble_mas.ingw +++ b/examples/io_over_ble_mas/io_over_ble_mas.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/io_over_ble_sla/io_over_ble_sla.ingw b/examples/io_over_ble_sla/io_over_ble_sla.ingw index a4508ffdb..e5d6071cd 100644 --- a/examples/io_over_ble_sla/io_over_ble_sla.ingw +++ b/examples/io_over_ble_sla/io_over_ble_sla.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/l2cap_psm/l2cap_psm.ingw b/examples/l2cap_psm/l2cap_psm.ingw index 847554cc6..901cb2110 100644 --- a/examples/l2cap_psm/l2cap_psm.ingw +++ b/examples/l2cap_psm/l2cap_psm.ingw @@ -2,7 +2,7 @@ "watchdog": true, "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/littleVGL/littleVGL.ingw b/examples/littleVGL/littleVGL.ingw index 029da8429..6fe33c810 100644 --- a/examples/littleVGL/littleVGL.ingw +++ b/examples/littleVGL/littleVGL.ingw @@ -2,7 +2,7 @@ "watchdog": true, "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/llsync_light/llsync_light.ingw b/examples/llsync_light/llsync_light.ingw index 00233f8ee..01408015c 100644 --- a/examples/llsync_light/llsync_light.ingw +++ b/examples/llsync_light/llsync_light.ingw @@ -2,7 +2,7 @@ "watchdog": true, "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/mesh-light/mesh-light.ingw b/examples/mesh-light/mesh-light.ingw index d58d5f8b5..471e3eb4e 100644 --- a/examples/mesh-light/mesh-light.ingw +++ b/examples/mesh-light/mesh-light.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 136316, + "size": 136384, "base": 16384 }, "ram": { @@ -12,7 +12,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/periodic_advertiser/periodic_advertiser.ingw b/examples/periodic_advertiser/periodic_advertiser.ingw index 8f3da1c29..b41f0436a 100644 --- a/examples/periodic_advertiser/periodic_advertiser.ingw +++ b/examples/periodic_advertiser/periodic_advertiser.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 141740, + "size": 141808, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 163840 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/periodic_scanner/periodic_scanner.ingw b/examples/periodic_scanner/periodic_scanner.ingw index f0c5a2c64..de611aed1 100644 --- a/examples/periodic_scanner/periodic_scanner.ingw +++ b/examples/periodic_scanner/periodic_scanner.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 141740, + "size": 141808, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 163840 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/peripheral_ancs/peripheral_ancs.ingw b/examples/peripheral_ancs/peripheral_ancs.ingw index 05d6a22df..09ef423f1 100644 --- a/examples/peripheral_ancs/peripheral_ancs.ingw +++ b/examples/peripheral_ancs/peripheral_ancs.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/peripheral_band/peripheral_band.ingw b/examples/peripheral_band/peripheral_band.ingw index 8459fc0d1..698039d07 100644 --- a/examples/peripheral_band/peripheral_band.ingw +++ b/examples/peripheral_band/peripheral_band.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -12,7 +12,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/peripheral_battery/peripheral_battery.ingw b/examples/peripheral_battery/peripheral_battery.ingw index 7ff6a9ceb..f987aaa93 100644 --- a/examples/peripheral_battery/peripheral_battery.ingw +++ b/examples/peripheral_battery/peripheral_battery.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -12,7 +12,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/peripheral_console/peripheral_console.ingw b/examples/peripheral_console/peripheral_console.ingw index d696a934c..7c972a995 100644 --- a/examples/peripheral_console/peripheral_console.ingw +++ b/examples/peripheral_console/peripheral_console.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 135212, + "size": 135284, "base": 16384 }, "ram": { @@ -12,7 +12,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/peripheral_console_freertos/peripheral_console_freertos.ingw b/examples/peripheral_console_freertos/peripheral_console_freertos.ingw index 606b2f0d6..24835b9e3 100644 --- a/examples/peripheral_console_freertos/peripheral_console_freertos.ingw +++ b/examples/peripheral_console_freertos/peripheral_console_freertos.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 124912, + "size": 124984, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 147456 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/peripheral_console_realtime/peripheral_console_realtime.ingw b/examples/peripheral_console_realtime/peripheral_console_realtime.ingw index df66fe7f7..037b1435f 100644 --- a/examples/peripheral_console_realtime/peripheral_console_realtime.ingw +++ b/examples/peripheral_console_realtime/peripheral_console_realtime.ingw @@ -13,7 +13,7 @@ "base": 33710080 }, "version": [ - 2,2,52] + 2,2,53] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/peripheral_console_rt-thread/peripheral_console_rt-thread.ingw b/examples/peripheral_console_rt-thread/peripheral_console_rt-thread.ingw index 26c894b55..619346939 100644 --- a/examples/peripheral_console_rt-thread/peripheral_console_rt-thread.ingw +++ b/examples/peripheral_console_rt-thread/peripheral_console_rt-thread.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 124912, + "size": 124984, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 147456 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/peripheral_etag/peripheral_etag.ingw b/examples/peripheral_etag/peripheral_etag.ingw index ccab519ad..9aaa2a3fa 100644 --- a/examples/peripheral_etag/peripheral_etag.ingw +++ b/examples/peripheral_etag/peripheral_etag.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -12,7 +12,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples/peripheral_ibeacon/peripheral_ibeacon.ingw index 87f9cf583..e73d2508e 100644 --- a/examples/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -12,7 +12,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/peripheral_irc/peripheral_irc.ingw b/examples/peripheral_irc/peripheral_irc.ingw index e9f88554d..ad88e9e9b 100644 --- a/examples/peripheral_irc/peripheral_irc.ingw +++ b/examples/peripheral_irc/peripheral_irc.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/peripheral_led/peripheral_led.ingw b/examples/peripheral_led/peripheral_led.ingw index 2bb41d54b..bc93e1b7e 100644 --- a/examples/peripheral_led/peripheral_led.ingw +++ b/examples/peripheral_led/peripheral_led.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 146392, + "size": 146464, "base": 16384 }, "ram": { @@ -12,7 +12,7 @@ "base": 163840 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/peripheral_mass_conn/peripheral_mass_conn.ingw b/examples/peripheral_mass_conn/peripheral_mass_conn.ingw index 149613ec3..187d9c6ee 100644 --- a/examples/peripheral_mass_conn/peripheral_mass_conn.ingw +++ b/examples/peripheral_mass_conn/peripheral_mass_conn.ingw @@ -2,7 +2,7 @@ "watchdog": true, "bundle_meta": { "rom": { - "size": 135768, + "size": 135844, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/peripheral_pedometer/peripheral_pedometer.ingw b/examples/peripheral_pedometer/peripheral_pedometer.ingw index 944dd3167..3f1cfc0ab 100644 --- a/examples/peripheral_pedometer/peripheral_pedometer.ingw +++ b/examples/peripheral_pedometer/peripheral_pedometer.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -12,7 +12,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/peripheral_piano/peripheral_piano.ingw b/examples/peripheral_piano/peripheral_piano.ingw index db76ad940..61e81dc83 100644 --- a/examples/peripheral_piano/peripheral_piano.ingw +++ b/examples/peripheral_piano/peripheral_piano.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -12,7 +12,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/peripheral_throughput/peripheral_throughput.ingw b/examples/peripheral_throughput/peripheral_throughput.ingw index c52aad94d..7259d08c1 100644 --- a/examples/peripheral_throughput/peripheral_throughput.ingw +++ b/examples/peripheral_throughput/peripheral_throughput.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -12,7 +12,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/reset_handler/reset_handler.ingw b/examples/reset_handler/reset_handler.ingw index 3fcb4d840..5c71dc080 100644 --- a/examples/reset_handler/reset_handler.ingw +++ b/examples/reset_handler/reset_handler.ingw @@ -2,7 +2,7 @@ "watchdog": true, "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/secondary_fota/secondary_fota.ingw b/examples/secondary_fota/secondary_fota.ingw index 27dcd483b..0f3615f5f 100644 --- a/examples/secondary_fota/secondary_fota.ingw +++ b/examples/secondary_fota/secondary_fota.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/smart_meter/smart_meter.ingw b/examples/smart_meter/smart_meter.ingw index bbeb34ea2..a715b8203 100644 --- a/examples/smart_meter/smart_meter.ingw +++ b/examples/smart_meter/smart_meter.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -13,7 +13,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/thermo_ota/thermo_ota.ingw b/examples/thermo_ota/thermo_ota.ingw index a2c6a6e7c..612561d01 100644 --- a/examples/thermo_ota/thermo_ota.ingw +++ b/examples/thermo_ota/thermo_ota.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 135692, + "size": 135764, "base": 16384 }, "ram": { @@ -12,7 +12,7 @@ "base": 155648 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/uart_console/uart_console.ingw b/examples/uart_console/uart_console.ingw index a12c416ce..82a5432e4 100644 --- a/examples/uart_console/uart_console.ingw +++ b/examples/uart_console/uart_console.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 147100, + "size": 147176, "base": 16384 }, "ram": { @@ -12,7 +12,7 @@ "base": 163840 }, "version": [ - 1,9,38] + 1,9,39] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/voice_remote_ctrl/voice_remote_ctrl.ingw b/examples/voice_remote_ctrl/voice_remote_ctrl.ingw index 68cd606e0..776d4317a 100644 --- a/examples/voice_remote_ctrl/voice_remote_ctrl.ingw +++ b/examples/voice_remote_ctrl/voice_remote_ctrl.ingw @@ -12,7 +12,7 @@ "base": 33718272 }, "version": [ - 2,2,52] + 2,2,53] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/src/Tools/btstack_mt.h b/src/Tools/btstack_mt.h index c97c5a638..97cdf86c7 100644 --- a/src/Tools/btstack_mt.h +++ b/src/Tools/btstack_mt.h @@ -380,7 +380,7 @@ uint8_t mt_gap_rx_test_v3( uint8_t expected_cte_type, uint8_t slot_durations, uint8_t switching_pattern_length, - uint8_t * antenna_ids); + const uint8_t * antenna_ids); uint8_t mt_gap_tx_test_v2( uint8_t tx_channel, @@ -396,7 +396,7 @@ uint8_t mt_gap_tx_test_v4( uint8_t cte_length, uint8_t cte_type, uint8_t switching_pattern_length, - uint8_t * antenna_ids, + const uint8_t * antenna_ids, int8_t tx_power_level); uint8_t mt_gap_test_end( diff --git a/src/Tools/btstack_mt.inc b/src/Tools/btstack_mt.inc index 2f8b6dd14..6abc3b2b7 100644 --- a/src/Tools/btstack_mt.inc +++ b/src/Tools/btstack_mt.inc @@ -242,18 +242,18 @@ __attribute((weak)) uint8_t gap_rx_test_v2(uint8_t rx_channel,uint8_t phy,uint8_ struct gap_rx_test_v2_ctx {struct btstack_mt_event*_event;uint8_t _ret;uint8_t rx_channel;uint8_t phy;uint8_t modulation_index;}; static void gap_rx_test_v2_0(struct gap_rx_test_v2_ctx*ctx,uint16_t _){ctx->_ret =gap_rx_test_v2(ctx->rx_channel,ctx->phy,ctx->modulation_index);btstack_mt_event_set(ctx->_event);} uint8_t mt_gap_rx_test_v2(uint8_t rx_channel,uint8_t phy,uint8_t modulation_index){if(IS_IN_HOST()){return gap_rx_test_v2(rx_channel,phy,modulation_index);}else{struct gap_rx_test_v2_ctx ctx = {._event = btstack_mt_event_alloc(),.rx_channel = rx_channel,.phy = phy,.modulation_index = modulation_index};CALL_USER_RET(gap_rx_test_v2);}} -__attribute((weak)) uint8_t gap_rx_test_v3(uint8_t rx_channel,uint8_t phy,uint8_t modulation_index,uint8_t expected_cte_length,uint8_t expected_cte_type,uint8_t slot_durations,uint8_t switching_pattern_length,uint8_t * antenna_ids) { return (uint8_t)0; } -struct gap_rx_test_v3_ctx {struct btstack_mt_event*_event;uint8_t _ret;uint8_t rx_channel;uint8_t phy;uint8_t modulation_index;uint8_t expected_cte_length;uint8_t expected_cte_type;uint8_t slot_durations;uint8_t switching_pattern_length;uint8_t * antenna_ids;}; +__attribute((weak)) uint8_t gap_rx_test_v3(uint8_t rx_channel,uint8_t phy,uint8_t modulation_index,uint8_t expected_cte_length,uint8_t expected_cte_type,uint8_t slot_durations,uint8_t switching_pattern_length,const uint8_t * antenna_ids) { return (uint8_t)0; } +struct gap_rx_test_v3_ctx {struct btstack_mt_event*_event;uint8_t _ret;uint8_t rx_channel;uint8_t phy;uint8_t modulation_index;uint8_t expected_cte_length;uint8_t expected_cte_type;uint8_t slot_durations;uint8_t switching_pattern_length;const uint8_t * antenna_ids;}; static void gap_rx_test_v3_0(struct gap_rx_test_v3_ctx*ctx,uint16_t _){ctx->_ret =gap_rx_test_v3(ctx->rx_channel,ctx->phy,ctx->modulation_index,ctx->expected_cte_length,ctx->expected_cte_type,ctx->slot_durations,ctx->switching_pattern_length,ctx->antenna_ids);btstack_mt_event_set(ctx->_event);} -uint8_t mt_gap_rx_test_v3(uint8_t rx_channel,uint8_t phy,uint8_t modulation_index,uint8_t expected_cte_length,uint8_t expected_cte_type,uint8_t slot_durations,uint8_t switching_pattern_length,uint8_t * antenna_ids){if(IS_IN_HOST()){return gap_rx_test_v3(rx_channel,phy,modulation_index,expected_cte_length,expected_cte_type,slot_durations,switching_pattern_length,antenna_ids);}else{struct gap_rx_test_v3_ctx ctx = {._event = btstack_mt_event_alloc(),.rx_channel = rx_channel,.phy = phy,.modulation_index = modulation_index,.expected_cte_length = expected_cte_length,.expected_cte_type = expected_cte_type,.slot_durations = slot_durations,.switching_pattern_length = switching_pattern_length,.antenna_ids = antenna_ids};CALL_USER_RET(gap_rx_test_v3);}} +uint8_t mt_gap_rx_test_v3(uint8_t rx_channel,uint8_t phy,uint8_t modulation_index,uint8_t expected_cte_length,uint8_t expected_cte_type,uint8_t slot_durations,uint8_t switching_pattern_length, const uint8_t * antenna_ids){if(IS_IN_HOST()){return gap_rx_test_v3(rx_channel,phy,modulation_index,expected_cte_length,expected_cte_type,slot_durations,switching_pattern_length,antenna_ids);}else{struct gap_rx_test_v3_ctx ctx = {._event = btstack_mt_event_alloc(),.rx_channel = rx_channel,.phy = phy,.modulation_index = modulation_index,.expected_cte_length = expected_cte_length,.expected_cte_type = expected_cte_type,.slot_durations = slot_durations,.switching_pattern_length = switching_pattern_length,.antenna_ids = antenna_ids};CALL_USER_RET(gap_rx_test_v3);}} __attribute((weak)) uint8_t gap_tx_test_v2(uint8_t tx_channel,uint8_t test_data_length,uint8_t packet_payload,uint8_t phy) { return (uint8_t)0; } struct gap_tx_test_v2_ctx {struct btstack_mt_event*_event;uint8_t _ret;uint8_t tx_channel;uint8_t test_data_length;uint8_t packet_payload;uint8_t phy;}; static void gap_tx_test_v2_0(struct gap_tx_test_v2_ctx*ctx,uint16_t _){ctx->_ret =gap_tx_test_v2(ctx->tx_channel,ctx->test_data_length,ctx->packet_payload,ctx->phy);btstack_mt_event_set(ctx->_event);} uint8_t mt_gap_tx_test_v2(uint8_t tx_channel,uint8_t test_data_length,uint8_t packet_payload,uint8_t phy){if(IS_IN_HOST()){return gap_tx_test_v2(tx_channel,test_data_length,packet_payload,phy);}else{struct gap_tx_test_v2_ctx ctx = {._event = btstack_mt_event_alloc(),.tx_channel = tx_channel,.test_data_length = test_data_length,.packet_payload = packet_payload,.phy = phy};CALL_USER_RET(gap_tx_test_v2);}} -__attribute((weak)) uint8_t gap_tx_test_v4(uint8_t tx_channel,uint8_t test_data_length,uint8_t packet_payload,uint8_t phy,uint8_t cte_length,uint8_t cte_type,uint8_t switching_pattern_length,uint8_t * antenna_ids,int8_t tx_power_level) { return (uint8_t)0; } -struct gap_tx_test_v4_ctx {struct btstack_mt_event*_event;uint8_t _ret;uint8_t tx_channel;uint8_t test_data_length;uint8_t packet_payload;uint8_t phy;uint8_t cte_length;uint8_t cte_type;uint8_t switching_pattern_length;uint8_t * antenna_ids;int8_t tx_power_level;}; +__attribute((weak)) uint8_t gap_tx_test_v4(uint8_t tx_channel,uint8_t test_data_length,uint8_t packet_payload,uint8_t phy,uint8_t cte_length,uint8_t cte_type,uint8_t switching_pattern_length,const uint8_t * antenna_ids,int8_t tx_power_level) { return (uint8_t)0; } +struct gap_tx_test_v4_ctx {struct btstack_mt_event*_event;uint8_t _ret;uint8_t tx_channel;uint8_t test_data_length;uint8_t packet_payload;uint8_t phy;uint8_t cte_length;uint8_t cte_type;uint8_t switching_pattern_length;const uint8_t * antenna_ids;int8_t tx_power_level;}; static void gap_tx_test_v4_0(struct gap_tx_test_v4_ctx*ctx,uint16_t _){ctx->_ret =gap_tx_test_v4(ctx->tx_channel,ctx->test_data_length,ctx->packet_payload,ctx->phy,ctx->cte_length,ctx->cte_type,ctx->switching_pattern_length,ctx->antenna_ids,ctx->tx_power_level);btstack_mt_event_set(ctx->_event);} -uint8_t mt_gap_tx_test_v4(uint8_t tx_channel,uint8_t test_data_length,uint8_t packet_payload,uint8_t phy,uint8_t cte_length,uint8_t cte_type,uint8_t switching_pattern_length,uint8_t * antenna_ids,int8_t tx_power_level){if(IS_IN_HOST()){return gap_tx_test_v4(tx_channel,test_data_length,packet_payload,phy,cte_length,cte_type,switching_pattern_length,antenna_ids,tx_power_level);}else{struct gap_tx_test_v4_ctx ctx = {._event = btstack_mt_event_alloc(),.tx_channel = tx_channel,.test_data_length = test_data_length,.packet_payload = packet_payload,.phy = phy,.cte_length = cte_length,.cte_type = cte_type,.switching_pattern_length = switching_pattern_length,.antenna_ids = antenna_ids,.tx_power_level = tx_power_level};CALL_USER_RET(gap_tx_test_v4);}} +uint8_t mt_gap_tx_test_v4(uint8_t tx_channel,uint8_t test_data_length,uint8_t packet_payload,uint8_t phy,uint8_t cte_length,uint8_t cte_type,uint8_t switching_pattern_length,const uint8_t * antenna_ids,int8_t tx_power_level){if(IS_IN_HOST()){return gap_tx_test_v4(tx_channel,test_data_length,packet_payload,phy,cte_length,cte_type,switching_pattern_length,antenna_ids,tx_power_level);}else{struct gap_tx_test_v4_ctx ctx = {._event = btstack_mt_event_alloc(),.tx_channel = tx_channel,.test_data_length = test_data_length,.packet_payload = packet_payload,.phy = phy,.cte_length = cte_length,.cte_type = cte_type,.switching_pattern_length = switching_pattern_length,.antenna_ids = antenna_ids,.tx_power_level = tx_power_level};CALL_USER_RET(gap_tx_test_v4);}} __attribute((weak)) uint8_t gap_test_end() { return (uint8_t)0; } struct gap_test_end_ctx {struct btstack_mt_event*_event;uint8_t _ret;}; static void gap_test_end_0(struct gap_test_end_ctx*ctx,uint16_t _){ctx->_ret =gap_test_end();btstack_mt_event_set(ctx->_event);} From d97a9425a7d37eeaba95a6db0c430e31a0185839 Mon Sep 17 00:00:00 2001 From: zjli2019 Date: Thu, 2 Nov 2023 12:11:36 +0800 Subject: [PATCH 07/10] prepare v8.4.5rc --- bundles/exp/ING9168xx/apis.json | 394 ++++++++++++++++++++++++ bundles/exp/ING9168xx/meta.json | 18 ++ bundles/exp/ING9168xx/platform.bin | Bin 0 -> 168848 bytes bundles/exp/inc/btstack_event.h | 212 +++++++++++-- bundles/exp/inc/gap.h | 151 +++++++++ bundles/exp/inc/ll_api.h | 42 +-- bundles/noos_exp/ING9168xx/apis.json | 315 +++++++++++++++++++ bundles/noos_exp/ING9168xx/meta.json | 18 ++ bundles/noos_exp/ING9168xx/platform.bin | Bin 0 -> 157972 bytes bundles/noos_exp/inc/btstack_event.h | 212 +++++++++++-- bundles/noos_exp/inc/gap.h | 151 +++++++++ bundles/noos_exp/inc/ll_api.h | 42 +-- 12 files changed, 1449 insertions(+), 106 deletions(-) create mode 100644 bundles/exp/ING9168xx/apis.json create mode 100644 bundles/exp/ING9168xx/meta.json create mode 100644 bundles/exp/ING9168xx/platform.bin create mode 100644 bundles/noos_exp/ING9168xx/apis.json create mode 100644 bundles/noos_exp/ING9168xx/meta.json create mode 100644 bundles/noos_exp/ING9168xx/platform.bin diff --git a/bundles/exp/ING9168xx/apis.json b/bundles/exp/ING9168xx/apis.json new file mode 100644 index 000000000..8915d8330 --- /dev/null +++ b/bundles/exp/ING9168xx/apis.json @@ -0,0 +1,394 @@ +{ + "att_dispatch_client_can_send_now": "0x020044bd", + "att_dispatch_client_request_can_send_now_event": "0x020044c3", + "att_dispatch_register_client": "0x020044c9", + "att_dispatch_register_server": "0x020044dd", + "att_dispatch_server_can_send_now": "0x020044f1", + "att_dispatch_server_request_can_send_now_event": "0x020044f7", + "att_emit_general_event": "0x020045a9", + "att_server_can_send_packet_now": "0x02004ce1", + "att_server_deferred_read_response": "0x02004ce5", + "att_server_get_mtu": "0x02004cfd", + "att_server_indicate": "0x02004d75", + "att_server_init": "0x02004df9", + "att_server_notify": "0x02004e35", + "att_server_register_packet_handler": "0x02004f4d", + "att_server_request_can_send_now_event": "0x02004f59", + "att_set_db": "0x02004f75", + "att_set_read_callback": "0x02004f89", + "att_set_write_callback": "0x02004f95", + "bd_addr_cmp": "0x02005169", + "bd_addr_copy": "0x0200516f", + "bd_addr_to_str": "0x02005179", + "big_endian_read_16": "0x020051b1", + "big_endian_read_32": "0x020051b9", + "big_endian_store_16": "0x020051cd", + "big_endian_store_32": "0x020051d9", + "btstack_config": "0x02005339", + "btstack_memory_pool_create": "0x02005477", + "btstack_memory_pool_free": "0x020054a1", + "btstack_memory_pool_get": "0x02005501", + "btstack_push_user_msg": "0x02005569", + "btstack_push_user_runnable": "0x02005575", + "btstack_reset": "0x02005581", + "char_for_nibble": "0x020058b7", + "eTaskConfirmSleepModeStatus": "0x02005c69", + "gap_add_dev_to_periodic_list": "0x020062d9", + "gap_add_whitelist": "0x020062e9", + "gap_aes_encrypt": "0x020062f5", + "gap_clear_white_lists": "0x0200632d", + "gap_clr_adv_set": "0x02006339", + "gap_clr_periodic_adv_list": "0x02006345", + "gap_create_connection_cancel": "0x02006351", + "gap_default_periodic_adv_sync_transfer_param": "0x0200635d", + "gap_disconnect": "0x02006375", + "gap_disconnect_all": "0x020063a1", + "gap_ext_create_connection": "0x020063e1", + "gap_ext_create_connection_v2": "0x0200648d", + "gap_get_connection_parameter_range": "0x0200658d", + "gap_le_read_channel_map": "0x020065c9", + "gap_periodic_adv_create_sync": "0x02006635", + "gap_periodic_adv_create_sync_cancel": "0x02006659", + "gap_periodic_adv_set_info_transfer": "0x02006665", + "gap_periodic_adv_sync_transfer": "0x02006675", + "gap_periodic_adv_sync_transfer_param": "0x02006685", + "gap_periodic_adv_term_sync": "0x020066a1", + "gap_read_antenna_info": "0x02006729", + "gap_read_local_tx_power_level": "0x02006741", + "gap_read_periodic_adv_list_size": "0x02006751", + "gap_read_phy": "0x0200675d", + "gap_read_remote_tx_power_level": "0x02006769", + "gap_read_remote_used_features": "0x02006779", + "gap_read_remote_version": "0x02006785", + "gap_read_rssi": "0x02006791", + "gap_remove_whitelist": "0x0200679d", + "gap_rmv_adv_set": "0x02006819", + "gap_rmv_dev_from_periodic_list": "0x02006825", + "gap_rx_test_v2": "0x02006835", + "gap_rx_test_v3": "0x02006845", + "gap_set_adv_set_random_addr": "0x02006891", + "gap_set_callback_for_next_hci": "0x020068cd", + "gap_set_connection_cte_request_enable": "0x020068ed", + "gap_set_connection_cte_response_enable": "0x02006909", + "gap_set_connection_cte_rx_param": "0x02006919", + "gap_set_connection_cte_tx_param": "0x0200696d", + "gap_set_connection_parameter_range": "0x020069b9", + "gap_set_connectionless_cte_tx_enable": "0x020069d1", + "gap_set_connectionless_cte_tx_param": "0x020069e1", + "gap_set_connectionless_iq_sampling_enable": "0x02006a3d", + "gap_set_data_length": "0x02006a99", + "gap_set_def_phy": "0x02006ab1", + "gap_set_default_subrate": "0x02006ac1", + "gap_set_ext_adv_data": "0x02006add", + "gap_set_ext_adv_enable": "0x02006af5", + "gap_set_ext_adv_para": "0x02006b65", + "gap_set_ext_scan_enable": "0x02006c35", + "gap_set_ext_scan_para": "0x02006c4d", + "gap_set_ext_scan_response_data": "0x02006ced", + "gap_set_host_channel_classification": "0x02006d05", + "gap_set_path_loss_reporting_enable": "0x02006d15", + "gap_set_path_loss_reporting_param": "0x02006d25", + "gap_set_periodic_adv_data": "0x02006d41", + "gap_set_periodic_adv_enable": "0x02006db1", + "gap_set_periodic_adv_para": "0x02006dc1", + "gap_set_periodic_adv_para_v2": "0x02006dd9", + "gap_set_periodic_adv_rsp_data": "0x02006dfd", + "gap_set_periodic_adv_rx_enable": "0x02006e21", + "gap_set_periodic_adv_subevent_data": "0x02006e31", + "gap_set_periodic_sync_subevent": "0x02006ec9", + "gap_set_phy": "0x02006ee1", + "gap_set_random_device_address": "0x02006efd", + "gap_set_tx_power_reporting_enable": "0x02006f1d", + "gap_start_ccm": "0x02006f3d", + "gap_subrate_request": "0x02006f85", + "gap_test_end": "0x02006fa1", + "gap_tx_test_v2": "0x02006fad", + "gap_tx_test_v4": "0x02006fc5", + "gap_update_connection_parameters": "0x02006fe9", + "gap_vendor_tx_continuous_wave": "0x0200702d", + "gatt_client_cancel_write": "0x02007555", + "gatt_client_discover_characteristic_descriptors": "0x0200757b", + "gatt_client_discover_characteristics_for_handle_range_by_uuid128": "0x020075bb", + "gatt_client_discover_characteristics_for_handle_range_by_uuid16": "0x0200760b", + "gatt_client_discover_characteristics_for_service": "0x0200765b", + "gatt_client_discover_primary_services": "0x02007691", + "gatt_client_discover_primary_services_by_uuid128": "0x020076c3", + "gatt_client_discover_primary_services_by_uuid16": "0x02007707", + "gatt_client_execute_write": "0x02007745", + "gatt_client_find_included_services_for_service": "0x0200776b", + "gatt_client_get_mtu": "0x02007799", + "gatt_client_is_ready": "0x0200785d", + "gatt_client_listen_for_characteristic_value_updates": "0x02007873", + "gatt_client_prepare_write": "0x02007895", + "gatt_client_read_characteristic_descriptor_using_descriptor_handle": "0x020078d1", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle": "0x020078fb", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x02007901", + "gatt_client_read_long_value_of_characteristic_using_value_handle": "0x0200792f", + "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset": "0x02007935", + "gatt_client_read_multiple_characteristic_values": "0x02007963", + "gatt_client_read_value_of_characteristic_using_value_handle": "0x02007993", + "gatt_client_read_value_of_characteristics_by_uuid128": "0x020079c1", + "gatt_client_read_value_of_characteristics_by_uuid16": "0x02007a0d", + "gatt_client_register_handler": "0x02007a59", + "gatt_client_reliable_write_long_value_of_characteristic": "0x02007a65", + "gatt_client_signed_write_without_response": "0x02007e99", + "gatt_client_write_characteristic_descriptor_using_descriptor_handle": "0x02007f5d", + "gatt_client_write_client_characteristic_configuration": "0x02007f97", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle": "0x02007fe9", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset": "0x02007ff9", + "gatt_client_write_long_value_of_characteristic": "0x02008035", + "gatt_client_write_long_value_of_characteristic_with_offset": "0x02008045", + "gatt_client_write_value_of_characteristic": "0x02008081", + "gatt_client_write_value_of_characteristic_without_response": "0x020080b7", + "hci_add_event_handler": "0x0200975d", + "hci_power_control": "0x02009f05", + "hci_register_acl_packet_handler": "0x0200a0b9", + "kv_commit": "0x0200a7f1", + "kv_get": "0x0200a84d", + "kv_init": "0x0200a859", + "kv_init_backend": "0x0200a8d9", + "kv_put": "0x0200a8ed", + "kv_remove": "0x0200a8f9", + "kv_remove_all": "0x0200a92d", + "kv_value_modified": "0x0200a95d", + "kv_value_modified_of_key": "0x0200a979", + "kv_visit": "0x0200a985", + "l2cap_add_event_handler": "0x0200aa15", + "l2cap_can_send_packet_now": "0x0200aa25", + "l2cap_create_le_credit_based_connection_request": "0x0200abe9", + "l2cap_credit_based_send": "0x0200ad31", + "l2cap_credit_based_send_continue": "0x0200ad5d", + "l2cap_disconnect": "0x0200add9", + "l2cap_get_le_credit_based_connection_credits": "0x0200afc5", + "l2cap_get_peer_mtu_for_local_cid": "0x0200afe1", + "l2cap_init": "0x0200b421", + "l2cap_le_send_flow_control_credit": "0x0200b517", + "l2cap_max_le_mtu": "0x0200b825", + "l2cap_register_packet_handler": "0x0200b94d", + "l2cap_register_service": "0x0200b959", + "l2cap_request_can_send_now_event": "0x0200ba69", + "l2cap_request_connection_parameter_update": "0x0200ba83", + "l2cap_send_echo_request": "0x0200bf65", + "l2cap_unregister_service": "0x0200c045", + "le_device_db_add": "0x0200c09d", + "le_device_db_find": "0x0200c175", + "le_device_db_from_key": "0x0200c1a1", + "le_device_db_iter_cur": "0x0200c1a9", + "le_device_db_iter_cur_key": "0x0200c1ad", + "le_device_db_iter_init": "0x0200c1b1", + "le_device_db_iter_next": "0x0200c1b9", + "le_device_db_remove_key": "0x0200c1df", + "ll_ackable_packet_alloc": "0x0200c20b", + "ll_ackable_packet_get_status": "0x0200c347", + "ll_ackable_packet_run": "0x0200c3b5", + "ll_ackable_packet_set_tx_data": "0x0200c46d", + "ll_adjust_conn_peer_tx_power": "0x0200c489", + "ll_aes_encrypt": "0x0200c4b5", + "ll_allow_nonstandard_adv_type": "0x0200c529", + "ll_attach_cte_to_adv_set": "0x0200c541", + "ll_channel_monitor_alloc": "0x0200c6d9", + "ll_channel_monitor_check_each_pdu": "0x0200c75b", + "ll_channel_monitor_run": "0x0200c7bd", + "ll_config": "0x0200c88d", + "ll_create_conn": "0x0200c8a9", + "ll_dhkey_generated": "0x0200cae5", + "ll_free": "0x0200cb19", + "ll_get_conn_events_info": "0x0200cb25", + "ll_get_conn_info": "0x0200cc0d", + "ll_get_heap_free_size": "0x0200cc5d", + "ll_hint_on_ce_len": "0x0200cc71", + "ll_install_ecc_engine": "0x0200cca9", + "ll_legacy_adv_set_interval": "0x0200ccb5", + "ll_lock_frequency": "0x0200ccc5", + "ll_malloc": "0x0200cd29", + "ll_override_whitening_init_value": "0x0200cd31", + "ll_p256_key_pair_generated": "0x0200cd49", + "ll_raw_packet_alloc": "0x0200ce8d", + "ll_raw_packet_free": "0x0200cf61", + "ll_raw_packet_get_bare_rx_data": "0x0200cf99", + "ll_raw_packet_get_iq_samples": "0x0200d059", + "ll_raw_packet_get_rx_data": "0x0200d0f3", + "ll_raw_packet_recv": "0x0200d1a5", + "ll_raw_packet_send": "0x0200d279", + "ll_raw_packet_set_bare_data": "0x0200d395", + "ll_raw_packet_set_bare_mode": "0x0200d3d3", + "ll_raw_packet_set_fake_cte_info": "0x0200d4d7", + "ll_raw_packet_set_param": "0x0200d4f9", + "ll_raw_packet_set_rx_cte": "0x0200d55b", + "ll_raw_packet_set_tx_cte": "0x0200d5f1", + "ll_raw_packet_set_tx_data": "0x0200d631", + "ll_register_hci_acl_previewer": "0x0200d699", + "ll_scan_set_fixed_channel": "0x0200d6fd", + "ll_scanner_enable_iq_sampling": "0x0200d709", + "ll_scanner_enable_iq_sampling_on_legacy": "0x0200d7b1", + "ll_set_adv_access_address": "0x0200daa1", + "ll_set_adv_coded_scheme": "0x0200daad", + "ll_set_conn_acl_report_latency": "0x0200dae5", + "ll_set_conn_coded_scheme": "0x0200db15", + "ll_set_conn_interval_unit": "0x0200db41", + "ll_set_conn_latency": "0x0200db4d", + "ll_set_conn_tx_power": "0x0200db7d", + "ll_set_cte_bit": "0x0200dbad", + "ll_set_def_antenna": "0x0200dbd5", + "ll_set_initiating_coded_scheme": "0x0200dbf5", + "ll_set_max_conn_number": "0x0200dc01", + "ll_set_tx_power_range": "0x0200dca9", + "ll_unlock_frequency": "0x0200dcd1", + "nibble_for_char": "0x02022299", + "platform_32k_rc_auto_tune": "0x02022345", + "platform_32k_rc_tune": "0x02022391", + "platform_calibrate_32k": "0x020223ad", + "platform_call_on_stack": "0x020021fb", + "platform_config": "0x020223b1", + "platform_delete_timer": "0x020224d9", + "platform_enable_irq": "0x020224e1", + "platform_get_current_task": "0x02022515", + "platform_get_gen_os_driver": "0x02022539", + "platform_get_heap_status": "0x02022541", + "platform_get_link_layer_interf": "0x02022559", + "platform_get_task_handle": "0x02022561", + "platform_get_timer_counter": "0x02022581", + "platform_get_us_time": "0x02022585", + "platform_get_version": "0x02022589", + "platform_hrng": "0x02022591", + "platform_install_isr_stack": "0x02022599", + "platform_install_task_stack": "0x020225a5", + "platform_patch_rf_init_data": "0x020225dd", + "platform_printf": "0x020225e9", + "platform_raise_assertion": "0x020225fd", + "platform_rand": "0x02022611", + "platform_read_info": "0x02022615", + "platform_read_persistent_reg": "0x02022645", + "platform_reset": "0x02022651", + "platform_set_abs_timer": "0x02022665", + "platform_set_evt_callback": "0x02022669", + "platform_set_evt_callback_table": "0x0202267d", + "platform_set_irq_callback": "0x02022689", + "platform_set_irq_callback_table": "0x020226a5", + "platform_set_rf_clk_source": "0x020226b1", + "platform_set_rf_init_data": "0x020226bd", + "platform_set_rf_power_mapping": "0x020226c9", + "platform_set_timer": "0x020226d5", + "platform_shutdown": "0x020226d9", + "platform_switch_app": "0x020226dd", + "platform_trace_raw": "0x020226f5", + "platform_write_persistent_reg": "0x0202270d", + "printf_hexdump": "0x020228c5", + "pvPortMalloc": "0x0202339d", + "pvTaskIncrementMutexHeldCount": "0x02023485", + "pvTimerGetTimerID": "0x0202349d", + "pxPortInitialiseStack": "0x020234c9", + "reverse_128": "0x020236b1", + "reverse_24": "0x020236b7", + "reverse_256": "0x020236bd", + "reverse_48": "0x020236c3", + "reverse_56": "0x020236c9", + "reverse_64": "0x020236cf", + "reverse_bd_addr": "0x020236d5", + "reverse_bytes": "0x020236db", + "sm_add_event_handler": "0x02023a59", + "sm_address_resolution_lookup": "0x02023bb1", + "sm_authenticated": "0x02023f2d", + "sm_authorization_decline": "0x02023f3b", + "sm_authorization_grant": "0x02023f5b", + "sm_authorization_state": "0x02023f7b", + "sm_bonding_decline": "0x02023f95", + "sm_config": "0x020243e9", + "sm_config_conn": "0x02024401", + "sm_encryption_key_size": "0x020245b7", + "sm_just_works_confirm": "0x02024b3d", + "sm_le_device_key": "0x02024e89", + "sm_passkey_input": "0x02024f1f", + "sm_private_random_address_generation_get": "0x020252d9", + "sm_private_random_address_generation_get_mode": "0x020252e1", + "sm_private_random_address_generation_set_mode": "0x020252ed", + "sm_private_random_address_generation_set_update_period": "0x02025315", + "sm_register_external_ltk_callback": "0x02025451", + "sm_register_oob_data_callback": "0x0202545d", + "sm_request_pairing": "0x02025469", + "sm_send_security_request": "0x02025f3f", + "sm_set_accepted_stk_generation_methods": "0x02025f65", + "sm_set_authentication_requirements": "0x02025f71", + "sm_set_encryption_key_size_range": "0x02025f7d", + "sscanf_bd_addr": "0x02026355", + "sysSetPublicDeviceAddr": "0x02026805", + "uuid128_to_str": "0x02027071", + "uuid_add_bluetooth_prefix": "0x020270c9", + "uuid_has_bluetooth_prefix": "0x020270e9", + "uxListRemove": "0x02027105", + "uxQueueMessagesWaiting": "0x0202712d", + "uxQueueMessagesWaitingFromISR": "0x02027155", + "uxQueueSpacesAvailable": "0x02027171", + "uxTaskGetStackHighWaterMark": "0x0202719d", + "uxTaskPriorityGet": "0x020271bd", + "uxTaskPriorityGetFromISR": "0x020271d9", + "vListInitialise": "0x02027297", + "vListInitialiseItem": "0x020272ad", + "vListInsert": "0x020272b3", + "vListInsertEnd": "0x020272e3", + "vPortEndScheduler": "0x020272fd", + "vPortEnterCritical": "0x02027329", + "vPortExitCritical": "0x0202736d", + "vPortFree": "0x020273a1", + "vPortSuppressTicksAndSleep": "0x02027445", + "vPortValidateInterruptPriority": "0x0202756d", + "vQueueDelete": "0x020275c9", + "vQueueWaitForMessageRestricted": "0x020275f5", + "vTaskDelay": "0x02027639", + "vTaskInternalSetTimeOutState": "0x02027685", + "vTaskMissedYield": "0x02027695", + "vTaskPlaceOnEventList": "0x020276a1", + "vTaskPlaceOnEventListRestricted": "0x020276d9", + "vTaskPriorityDisinheritAfterTimeout": "0x02027719", + "vTaskPrioritySet": "0x020277c5", + "vTaskResume": "0x0202788d", + "vTaskStartScheduler": "0x02027911", + "vTaskStepTick": "0x020279a1", + "vTaskSuspend": "0x020279d1", + "vTaskSuspendAll": "0x02027a8d", + "vTaskSwitchContext": "0x02027a9d", + "xPortStartScheduler": "0x02027b45", + "xQueueAddToSet": "0x02027c49", + "xQueueCreateCountingSemaphore": "0x02027c6d", + "xQueueCreateCountingSemaphoreStatic": "0x02027ca9", + "xQueueCreateMutex": "0x02027ced", + "xQueueCreateMutexStatic": "0x02027d03", + "xQueueCreateSet": "0x02027d1d", + "xQueueGenericCreate": "0x02027d25", + "xQueueGenericCreateStatic": "0x02027d71", + "xQueueGenericReset": "0x02027dd9", + "xQueueGenericSend": "0x02027e65", + "xQueueGenericSendFromISR": "0x02027fd1", + "xQueueGiveFromISR": "0x02028091", + "xQueueGiveMutexRecursive": "0x02028135", + "xQueueIsQueueEmptyFromISR": "0x02028175", + "xQueueIsQueueFullFromISR": "0x02028199", + "xQueuePeek": "0x020281c1", + "xQueuePeekFromISR": "0x020282e9", + "xQueueReceive": "0x02028355", + "xQueueReceiveFromISR": "0x02028481", + "xQueueRemoveFromSet": "0x02028515", + "xQueueSelectFromSet": "0x02028537", + "xQueueSelectFromSetFromISR": "0x02028549", + "xQueueSemaphoreTake": "0x0202855d", + "xQueueTakeMutexRecursive": "0x020286c9", + "xTaskCheckForTimeOut": "0x0202870d", + "xTaskCreate": "0x0202877d", + "xTaskCreateStatic": "0x020287d9", + "xTaskGetCurrentTaskHandle": "0x02028849", + "xTaskGetSchedulerState": "0x02028855", + "xTaskGetTickCount": "0x02028871", + "xTaskGetTickCountFromISR": "0x0202887d", + "xTaskIncrementTick": "0x0202888d", + "xTaskPriorityDisinherit": "0x02028959", + "xTaskPriorityInherit": "0x020289ed", + "xTaskRemoveFromEventList": "0x02028a81", + "xTaskResumeAll": "0x02028b01", + "xTaskResumeFromISR": "0x02028bc9", + "xTimerCreate": "0x02028c55", + "xTimerCreateStatic": "0x02028c89", + "xTimerCreateTimerTask": "0x02028cc1", + "xTimerGenericCommand": "0x02028d2d", + "xTimerGetExpiryTime": "0x02028d9d", + "xTimerGetTimerDaemonTaskHandle": "0x02028dbd" +} \ No newline at end of file diff --git a/bundles/exp/ING9168xx/meta.json b/bundles/exp/ING9168xx/meta.json new file mode 100644 index 000000000..a3aa2bf35 --- /dev/null +++ b/bundles/exp/ING9168xx/meta.json @@ -0,0 +1,18 @@ +{ + "app": { + "base": 33734656 + }, + "ram": { + "base": 536870912, + "size": 21524 + }, + "rom": { + "base": 33562624, + "size": 168848 + }, + "version": [ + 2, + 2, + 53 + ] +} \ No newline at end of file diff --git a/bundles/exp/ING9168xx/platform.bin b/bundles/exp/ING9168xx/platform.bin new file mode 100644 index 0000000000000000000000000000000000000000..13793797c14d90e65c1833f2561fe9539bfd9df3 GIT binary patch literal 168848 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¥QOhDsaTcr!fd=LW5TCU_$A#cv>vfoj#Sxs9jL z^&{A$D0ooqjYh1`oHg>d~;486(u}IV@BBEuJS$B zhCNRVwxlSsFN@H#t_)N@<`YR*sNC=Zqy_Kt;@s`{6np9h5gFH5Y&&VC$aK}WjinG* zX6USRANc0CxuJy%l_&HPr(|diQl%n4iuGTS$h%0g5p^Ln6MCm(z-TqtAx3Pt)Gkr# z1?xA7fv@7P`~KlS)#!r>RHw0e&gchAs2*m0tV1!h5WhzWxvPrzrE2A!GE%3f1}Zlj zHCpd6=Aq4pK= zrU%T_!`^=6DsU{!CdN$DOY@$`$jTLuP1u^lUKHd-CDfid1I3ts|EVqQHw7jjQ%0&i zp{H+5Xl;qPn2#@cKA2dBu`ye|tXcbo$~l3r`pg(DUXN1U1g(zx8so)4*HK@~!I(s2 z$ZJRxVS|Lv-(oX7(uS2mpnHr+!b)I1C{~>2v`cp2GpyB0>N~9>@CH;1V6-;JNBFTZ zf53L~e168Bb6PY>5oH5F%x46q4%DefmZe&WJS0@pANT+Ht1&}*+_k!0YHlFA8?+A= z<_euC+bGcSRF=Vgb37pP+$l}-YnnUD~z6W~RZ{gp%QRgT9LB)i zHb&3BG5e-w?7+-)efmxybXMhg5dUNQ<5ldD&>Y$c4b-f7Cs}p(Xk}6}){|cBDa}|v za=^j(BCH~|_?|joj9AJ-NgOfI9Pvl%VlzBP6j96y3Gb5tHf&Yil}QEiUt3LcE*~Si zB5Asj@KgUkppniXFH;JQ#2aWN0d=7@hjVR3=HfFg$H6dSbG-o8j{3>>;5CppmOkel z2gAmPc`x8Kd+rjv2J#w!U&<=`R*~Z~6V^ayyD7vWMtGJpqPsm-g$o7p=v#em1eRA0 zzf()RA3Tgb-;_9;ez?WjBeIU3-%c2(PZ0WNI!{^<+e!ApK;9Y6pTtqvdq?obNx_2e zgsSAPJN-$j#h}CP9!GjC7_v-r#&zZrN*DQ?rpI%@J+mn3Zz0AK>xquOEG9fmT#4Uc zQx#%P{06(Jg`1NZ=jR~%>zq;G!O!%kV|B2qy+g$Z$kGYBV!(s%=ZEYqw0d)ha3v3b z2y1XEPW(e~P2^#Z;%wU%=IdC&Lw!?yzX|&;n3ip;3$%>6ERTnnXvqtWpb(m^*)bdDC6VTM;u@kclgrh9ZdF z;MFZ&I>$~d1wwOA_8ME~0$jPx$HjRi17*bCgZ|h^xkAX>$qJ6zxj0ue5&n&Fig}i~ zlMgR(aPjF#K@R_Ae&GOr#j0}FC3!cN9c?|=YM*)e*mv?iY4zqk>FYX1jQ)%{fR_$T zdkze1J_lvUL%txsQ$L3uZSZnZTPu7=lzWHUKr<8LJPyFO{qU*51aD6dCjSuyUZRs zqg@16L3KQgekX1s$}4Yok2dt#QD*BXdrn%0T9Bo@Suk2j7Gx@;3(}Q) z3ml5wja(T5!?^QabmdzhL6yOL1Kmhr@HOp$@ zin2R1mCV2>zg7M5pmcxzCqU03BoFRQexj@)&in|XbRzm9XH54B_WYRc6C%iXJaP`Cp_1YhbnVsz zCrXtu*r~o7KLh{SI^b?<;;tYoS`%lIA~Q*V)gyM5MK~IX0e?o!nID2VGlm@;G8tm+ zEexi-C?l4BH*5yv(HYX79w3|fB&_Xb=B{qSXYz!0;~jZAtDE5YPFAqXN~kF!1ECjz zpC}Jw#hUd#_NvW#8Ygd^BdIIB!9#fJChmUV=SC2n+2~2{7)}|lF5+pvSMUES_9F9+(Zmj2fZZY(AFx(9 zTfq2jMYQDY9>|En;+BW=UPqk5m&Zr~l0?VK2px;vLpnIHyyc@X2mVQ)?v04&S`_5= zVKQ^|YjXzow@ATDK)E!+v$6nD2ZU?R(WPLYwhA0PUi6w~WYbkkIQ7nU=HivY5OigV zQYqop^ZQfJAp1tgN(Quj1W00CTQjJv>@Ysf#wP}5GF@AaPhR6wYeHGcsWV{lR~~k@ zW4;K`*#tJz68C~**zDGfTF|(n@_X8L!J^8h<;>$}Pd~OxpXtpnn*twew$3eLvnR)= zm64SFfiLG6j(o?B6=)n79efop*2Q$O;zh)E_$wOpf{OWw4~gJCzii1A+!6d1pPlqT zUZ8yze7tfi#_fynk~cIHa*N_Fc0x*!KaVtadu3>QroyrD%F* z%J-UIaqX3O^XhO*(H3r9%W8RxAFoYY>hRjV<;c3`)ttI3`CDC% zv_5l}IM>gs_vk5(q12Pk4z5@+U))$q*d+^xh;zRS;8o3!h#rHe& z{mE%dz;@L!g;&3gh}L)GW>_|((8RX)7lO&Ex9$x@wrz2pzlPIFuJ+V-N3O3CpiAsX zxZ#H$#mGwk19&=MQ3bQsEzT6j)tfb!W;#yNcMEJ3fwD8&`GFm}BVtl^=xGsNkZXv! zWll2MH6F4n4fINs17?gLwub`BW)NLHvE`fj3q#vik5WbpNlhHAXfaKjhw`TTIpi31 z!tNG>-;;7w6Uz)@28Y?~kqp$F%8aZaH14c)Z<2rD)v^Q-oe5q(GvpvAl}J(KZ6^KT z)7K%-ug)>EDBNKdkhysV&C*fgNzAAp=jUOKdZwSbLa_VYrl;7f-0_g>jP|-=fjS(y z)36WCgUmyYx1q)Z848DtgSdysxzHIX29w?5L9!D0D=D&#<{jta)Y%75w_g304=e{V zyr|LCd>Ppzgb)|7%fj;~@JBMBPUON<5Wn*wG99ym33p6aO2YSTYU#P7tp z7V~wTJPWx)Yb53S&RWO{o+{z7^l?b!K<=(RAATI;&d_wVLz!9$=nP zlcu43L^q1?JDk^MLZ=C}`wA`_a&V-bGsVe9^m2n?abYtG_Koc=u)5++Vdp*>j34Z1 z_KZbtV1;H>1_M=JvwTRw6}5XOd#hGLVjk?5g6G5Ds;?38?pm-1D!v);wqS=c3p|#- zi+3ZE`n)y~r7&9eYCn$>Z!(^5aE~yCoN0$w&TiQw2WlNw)A8F1%N1YY9Y7J!@_eI( z)mPVfbNN;P9zPKaeM)wrSIO?>M^E@n*z%HY?qCVNx286$Y!7k{zM#+SaI`L)kKIn0 zqZPZijHl+aKZ=DNrC`DMY(e2PW!yVzZBAJdF^BUD^OWuSY@xY!JA8+DmNO<_thJX} zd+l5X>Q~;6W30E+ES!FnQ-N1$FW>T;LsB%q9OFoTKP)S(+p(^muU~TroyA9S1 zaSv>6uYhZB7VJ8+*w;G2tU8LI-42c$j4?gE*=T`nG`>=i)#ioHHpEp6X<*2VW0gY9 zQ+>bSCL_is6;(bOOak_ZAJXXez+c^m$g-vJ%HYJ7VtHXzgKr7u2dxAq*ow1(VV;2K zOz*|ZOQ!E(!dY!clAlu?_bRMtAWk#<4~b&r^61kF2QPMEmBh*ktiZtOm3{*=MY%%X z9{K{mFyoi)_+^402-wI-Oc?3@zr(8P65m5SA@UXW&Alm}wp0O7p+3|55Nj3|3Pzo44NWk0T-V!()fpDhS z_X1Xoc31+w09)sUR?0M!l1)sVP5ivk;zlU8MW)uBN)Bkd6$oWWcszRmlL; zZ+myKw+|VR*z;q=G~9u_$g_sjF0%Ddtl!5gIn476Q4W5t>n*I;Y_AS)^uL3VS&!7@ zSx&z9CC2qIN7EKy&Vi1955A|Dil>VH`Rr&^>^4R}Sz{V?*m$6Q)nS!t4l{Q*ax&@K z0i9EHtx1Ot0Ay1RL*JzV-*(`iT4MFZWwEG$S0Sp@L;piqB8^6%@16640`2(|I z7tjDtzOfJRx#C4n3qdZQOW3%vbG@Q%SHJe{q<89=2)yAxJR@SA})+pvX=>!J9SeGSHwKwL&$FILX_nKVV7_8G19a>Av;>x z-0S0P@HQ_QIEjdY+eB)efF7&wt*`TKxpK#^(sw(MXKB=+9a(T*$KHwTg`Z{dd?1_F zv}CzIm>LrcszTuffzNfJWk>T|-RVRxP!HN)^3aGtIU>#B$>O&rWAwW)`dw167#_(@ zc+z{KyDZWgi@NHI%3RSi=wCiz$#MZPK6YL#VR|3gw(o|Nz6rg{=k)-CiBjKNVs4;1 zjrpohqpsG;cC}8dpyvz^HlofJ!z(`p6uL*dX%-Kjo+S-g5H%mSea7{Hz=Qw-D9`UFQG9>txY|U zstI_~qSS&vKV{o(LHn)7EI<2I`?aI}U?G!7iL;?cj&ISBL6=iBZDz7S{<-gRXQ*8_ zY;g^csV`u6GG46nsb^DB6*QaDUPRNr$f!pQ?(AyX&5VtWVhu zuRrR@&AH*@*5Bs1mDt9P-b>u?THAfoPr>`e*~@N&-QYCj>Lnpo!wFJNH~752S(Y?- z(w)#1>viPZk&7is4ojH*Q6}uKfiFabR~cEXi$iSAaadB+$DzGIQ?-{7Pr+%5+ui6c zi`DdY*`Pm~-I+%n3yGP)-%{W~W}zZ3Y>m_2j|-7}_2I7s-?Xlj?goB~2W=wTlJV+f z@p*8p13!A4pH6ai{}wPc+TEL?4sevXXl%FiG)(0>Q@_HF1ojcDy1zdva`1Xq0vmNp zXQqqm37GPs`{trP+Y)9rCq7OPLa*yw>~%e@xd~o^Z!!21umZh3#Cjsk%VH6yU%urA zAdu&qV%6?V3&n^-sh(cr2HSTBlWMjj))-?o91NP_-?XZYV1-6@!3R0@AxQc`a5~vh z@09*$5w};3!noN!T-@>^)(Ef7bX>qXac93tc^xx_fiH>)O%H|IqgAX3+->;_Yrune z(BSVZf412w)@`03ey(Rkk;k_o1FZpEeGPYf3g&PYA_&GY>~=ARGQgI^3hQ-NQ5k+y z-2Kj;@RL^035V^v6AixE$6mm0xv~Y?l|Zx8SvD`?~DO) zGd>=!ohEiTnnTAC!wNe&dkcC5?Bpz5dphqu$4Q_XlG?WioGtsp+$__nrQ&GXe?3db z!Mzy*YoY+QMApe#5?XKCjQZ9zXrslVqZqvO$bMdooGGF7NbC2zBU#9vl5XAgWVglq z@%gmy$LBNNcRjIeQ*Ps-zI1RIo1NK?D|wIy%h1-(Blqt#GwkcYjp*-p3DB*HcVsKF zMkCYl%dFrt{o&@%bZ_i4{hmlt`zNrxncbG7#D}u4KS&J9Ue5Id)}?d%W?=7ss~oMY zl@C?YN^BKaK5M{lLT;l_ZSF0=T3#5*+RasG?@pJ`K2%@#y6$z3*fb-GUf96Ey4&MlqW^5x>U?X~JiEDDnzq zP1;O$6ln9?cKO(`Eb-aa)0!_4tfgELJ~3l}8??F7enxV_bs>Yxd=6RB9k`n?aX0eE zJ&M>YSLI``Jr-#N#@vGO#veis0(0*qQx1OTZ^Ec^E)?$;mAs_(;c#k{lOFg~^JFpm zhjrv}nqh6ZB_x9_`yWrZ4KD5_oqqxDHV0_BiHVMVK3LhvDsgI%b|P|%fl#+OPP8M| z==9SaKpxfkZjCEDpqYn8VO8^lW{QM_9R|nmPpW>~LNY0o@W4{QU$qp>U}|WVxB{9X z@pM{;=$8&_#_?Fyf*RsfxUF86$NQ+cVOCR!B3zfv-J)n*5w}`RTgi;Id zV>5E|=eHDvr@=0?E6*{I(VGtT9<$=Abzs-)1BOFcDYd+|n%k1K?zPn=TkgVZbjz-F zdscVAD#I&#Rv*%xk=SaczBhar)|p$Nq2C4H`Y`PA9Aa9MU2cOhr5=8`X8j!Vnk~o4 ze_}zl@R@_Z>LPg`Ob{~Kq9lPqn(Vi{!l_T`v4@y@PrMNJjy+Xdggub?d#a9v#s{z(x{&@en zmE@P*iZe*Raq70IWJLwr0LOIG#F0o!*NQ_@$>!zIm`c{8wZRyZ?{o!ABv){8ZJ8P| zFRr!(GUNhPDa(-9OB(V`=mze9_AevPa{jl^@*B_EBbP{f~X*qaz4RdP!a7hY*!m{p2D2`C-JPgo5fKWyQ7oMESG zK>5wsa4}n!*G;kb&^w%McElofct6G3n2%UL2j&T{<|XKLZbHIN^Do*S;O%%dEs@lI zom7H4a2>GOLN~T#3t|IyhbfzYUcOb#_ouzu0Q}l+aU@oX&@VrgcObG#*${q=+J&@@ zKWp{FIe~hr8NVdYccCL2bz%;;Q6CQVaix`J1$-BnWG{6F>=KpcqX7Xe>G+IVu?}mM zAo;{agcXUI6v~`TpQuGMs70TpzM}d9>}b>%{Z<|ob5TC|z6XVdLF&!NPnZoQrwq5cN`VkLiLHzn#JMjrCvcz#m95>Y-EsgdSOFFerBVr4EkPM&99Nw$bVYfKJ*RP^6epu`ryEA_+(Lk+J9?+!~2i% zev2R37hEzl=-($CMQNs5+8CN&?j1G8`mI{ys#2TGs~ z!>T?Uaq)O>Le9SZ$dgDMWv>p$kS!c@6rW!jmJkPw{Fw1KE=MGb`i${Cf~RKs88jI4 z2|Lgl7S!Wc1Lw4}{Z{p+{$XHd7(WH$?2G#t|He-lKln7y7vMXZMDXHo<(kTeAFK?8 z@SSYP>LfkQ&k8!Wbo6Cw@^TU$&7vMZ;9K>a_3{a4`%>J;n`y$8 zS>AFr;w@R}Fb|%Ht|++_aYdJz;fHFm;aiVlXsPJ z65SWa-rf%%FRkC>?ieN7#MwbMds>{vogkjms{1XyPA=SH2i`i7oD(Fw%kISbmTtry zen8f9$fXYwR^b zX3tRE<;dL_qi1>EiuLB0O)Wo`4kL%G=Ut{2yhHPaq9n1ZTi3*!dd-$#-JZ)PZ*j3; z@H3QOdZMOc&l&B5q4JBPnH;$uID^yLIq=LD?{f6)b=}9%Hy7t-{{!x|XDBwG$_BY5lwaCiQ;cIT58+PM(9`>2 z`Aq%dy?8_RJpA&+Q0VD}7w=ozF)6fzO)tOngW7;nSzj`r>r9=uP;}$0?+yv|LRph9 zx07s6kyasED035^_TAoDMEY)Y9LmEfw;E4;y(SM={PU2J;a=8T%A_LY4PV|-(x|9R z-i!BUkHHyt4BaHHmbxdt0Ut^XOj`o{+5$5D&8MAhnL9d4nJq1su8*cE(~VfbeVt6W zNqYZ0vtA#iYtY9FPHRiamiPFowQC<-wVbl{r1}DL?jQ%LM&oc~oUy|H(`pm3mznOE zJ>s!{K0gN~u@6o3v!3m&Odg4gcsV~C#|HmLA* z32fHDXu{rV>8zAtYsI(B0Sjz}GzuA`vaPFJTSbMVF$8G~k0VppyhDsKp#?N{LT!gz zp??;BT{7>*TabI|jP~}R^Y6-5e(8rbcKq@Sl%(ma(s?ibL$(P=UmJ|c-UrAA@%PVl zww>1gMYk>Hgu{BVi5)zSSEtI29_T!+wdu$8*(O>!voL3iT^7Hh{cwn>4xKUv(Trv4 z#QmwZ%>xER(VlImc6GK{0zBs8=U8Q&-q|i5zih=_=1%5$sw)?unHoRvSA3_rZk8Kh zn};=F`t2=bP4!{L&N)E+d!=i$G+P?qauei(8vO?;(dE(kjM!yUN%5`MU{D~lP9v@g z02O5UPObGM#~y?ofzG0SnwHO_9i|KlqO;u?7i%9i#)YTt-|{l=n5LS{mY#?ytBlzD z9g|+IbVXkcVg}r0!OX72XXbKA-w%FU+GXFmoiYb-J3Z~xM^yd>cw|xf!VEb}DS@Qg zzhG&LAZNB9epK;b^iu8;L9!_8C6khhVC_LvFV%=7L8G|qtLw8BpBVUmb%zV7J3Jn0 z%ecb|mW3iQ-JjIthmGP1mgQAgHhz#^XEyj2@!$7`Rh!HEHKJ3c*5upW1VPwvhK$%2!FYf zTt7<5knhpwdA9?x^K>jiJhTcccIBbvkl5-TYT_S~U85xa*3Pxpt~&3|Ree|2w~dxu+T z?)|-#9G5*2_nk2?>8g~xRwkBTdb)<>c+S9xT=!m_luc56^Z=bV=2T2Bn>Zpjycefs z(+KAVgmAOZ5}zJQ`HQfY7@q8F#|g{wvsgPhmlLCO1LoJ^^V|kb%v|UdzmSsJq9KgNVit^n{SomD!=yXS zfk)gNha4)Qkv;PuNu&nUf%K#H2|Vv?OCpy9?blOT$#I7^7L-~_twPU zYt}eD<;QZi)7q7)8|irPNe;3}hK_ZVqa7IjQpXPuo(2!4>8LjsS5tLb)$H*%&z-$XI_g?Uje_H zMSKU|?u@N8tn3ER>?rvQ_BT&K>}6Sp9cBex7C1xVDSV1?eJjNSonR&4Oj^tXADl@29l~ zU?ZnKKd)^>7Axfm>UFy2yjJrz^|`anHf{96DXug~>Q9EvU<}G!INC*W`}lArE4k3& z+}>(L-BqxIfxM_M@d-)UG#wd#vEnDN3Od`fR`dKM{Fwt@3-7SYrbRhkXDRk@>Lc%9 z%z2YZPBp8~y&Y=vEl$G|5Xour`d#5Mvk1p&Qq#sxn(3N%?}GBX?!NEA#mnVY)$3Vq zO9|E_Arxx&1NbQQaol}~>olu(Kn^SiR;ss)=A;K%?99;FI5`{VM>tL)+yW;7Icyx^ zIK9gSYtZE`Hj|gpmL;}$zAEs%)TtlgI;@EkK#hF$Jz{*P`!=+i)rz;5!!kWp$??1J zNAHu3wZ2rJ}A z?Pl=cazdTA(oxU2Ud44tk03}eiG8KB&8oiKZw(N#fOZScc1IOZA<)vD?MadW^jv>v zK>@~=Dc}HWJH3`j^t@N`TkPuZ=Ws7;09hF@s%T`PD;C(RLJR!(v#P?obe{{_x_7Q< zzkG-8H;6rMed{Id*>@P@0)e32xMNB`vqCo_7V!DOIg{_zZ)Rro;&6d#V)Kp9h#$dC9^4uC=3vpGGSNPH^jpq0(_S8y04eEw_W^xuf-%#=_b~I}0}og*BktQ@ zjB7sEet!_?bIi|q?u=veiVNM2KUxCz`$G#XSOM83778setJ4oqU8t>&aLmhLorsLa zlh7A6zcyyu3QnEIl`QjKIpJjsdbEtUO^d!Gm+Bs;30y_KtM%dn{?sQt*RtsQBfp#O zlQ?*elbQ=Qnp8dNzB&(eLJ1fnTfj*Dglj(Eh|fLR$+wL%@?3_=?=Zgyi%?qWdsso5 z4^kP;3$w$|!OrkRD<@i@gMAMp#fvhS0%^f~)$8+Jh=lBwsrs1mA*TfJVPmv80`@kC z{GkOs>0-Nruw^t2+S|du)0`_#6d%ydJr=bdeMf7(vklT|F0LDg^)iEkyv@ zp>Ms9IQM40{L;p1VqyEuc{U%rx&~NGV^(zxth0%Ho?nMfDTX{mPU&H@`pY4b!)zLB z$c68d@?=&aVrUa|rVNaj4vQW5H|_umhZfY=#q9zI)GqF4c9(@(XfB?!D^~4>%ndCmC#UV8}V7JB9_6;Spx{7t%}u2~M6)$*Y(?d4>b_NxKrLO%6@ zZf)lfufpz$b%GPRwBHS%)9RD-=`RDL7o!9>&x7Zrdxb^KKt?FNQ^20Xe1aj;moj@E z)n&+;KlIbl3&v3zUmxh_y6{M2KQWB9HoGSsMcxh|NOL+7F9MxsOg!xRTw5~ylc)z+ z?S1{qR_u)n3qxLb6QOyAJMaun5H@5hOc-u2-0+k7Zg3ay$jo4O{sNve_M&MT|E3u{ zy4;KBwHuJvco_AS7ct=^o*RM=^c(D|a^rjIGtn9=hRnSZD|pm`XC;9E920QklV^Cr zMb8rN#b^nA%Yt@wMpF>IiIx*W?F&loxkq?tWpMfGb;3I6du!IO6V|S)tXVf(0Q2(0 zE0-IF)OlgllW|*^u_w-1Oq|AlMt)B=*{m*36dxe2>)B3{x~^cf)Kw|x**b4&amkQb zC8PWfoaKI3kZ&q$^UarBvgK&3ihiNv=69tkdS`>N6+7VFePdZl&iPTl4tq*Qf-_y6 zH8^K6>;!o+=rgm*oxodr_RUfXCE(TFGdkIHE38a5_}cElyLdS zdd$eQHr4OO`@zIy|Lu5xCo#!if%kt&O!P|+jrGJHvM7RlenrO$cp^>~O415%p0w=z z3Qov}yVhAMRB}C0wC!aY8iyJ6Vi0#D%(+e01~poE*7Yhx#>VAO1L4BVU(~Yk>*#Vu^yq)j@~`|4Oqo{7xNj=JuGUcE_5qh zw9e>?4wRGD2pSvIrfC6QPLq7{LTRh~g!G>Lk;DhnDt*C)m0N>PRCWLbcBImb8GZ^Y z@^P#mqy1$U|2fMCM)r=$84Cr~#sSWCQyB+#{JzGNrGpIcmLs-SzR?8TXCA&_Ne#D{dZ-cz48W=@FAGgPX~E7 zhck*37WDFaSvfZkCHyyJDkrA(QP6<$b8>)<*s9;?r1vc7>Q48iW5`hh>ecP~jTNJ> zW5-5K|MRlL=d+dzXfF$Lo&&k2asvgGzwI5(9$pr!{Nmy5dPN0g@gR#NpAaM<6tFV~ zH?tQb>_;PYB+Jwkl-K^k1Tm9EM02P2;_@tNv#nsF%YxNr@i5t44g=d6?Us0Y-pBpy zdUHJG*M<)-g!?^C@~$Rj{$ZZBtN`I*(&Vka#IZ&4{W;s=fA-2bWq!#nmdbfKFZdjt z_QlTI3*^^)j`$Kex6CJ{$=IDp*t5m$lBeA)^>@+u2q6}$L`uJdRqpaxPj=>R4dVSM zH`yJuDX(CUv72UUfl1*ecgvU&!2X2VX;Iugsr24)sk-#Hvn1hczGbUJ>UyafG{iB;)7{{qrksGtdBJRkDh5o+Z8t z__FyGG+zg!5}0E95p{sv@2VS|6Mb=RdT&?t`sM4F8+-np&Bb>vSGY#zUiOLURd|IfP>{4)7yr)pTq^{z zZULR+wH2R$uHC>l?g_GKzMP4$D_YcV46}E<7st$ESy<45DU%{OD5*x9!aevnQojLHBeG!by2@b5w2c`)qJl9vTYJ9 zV9#}0n@M+|cE5HUq;ezCiu3v)eE4dWju?kV$_e*-*x&}E1$X|c#RETA2M`NIlWr3| z=)uwf3w%7x{blErznkA*biLv0IcY)OTUDMRcF2ci0U0^=C8;(gwh1RvCBMxm`MKdn z$UN)-MdV#K+GF2P#ewomgVheya@>Gfv3*sOR7?K4i<|K-WC7K|kO9|>XRE)Y${`oE zlvI5ve<%m!=rUtpJ(sv9NOq9z%c2$}taqBlW*KAsDA~?A!yfGhJHlJokdx5DkaHfjOR&urZQ3wV%W7n7ZXsA%4#btK`s5=V8CNV zCpwFQ@1Hk02^T=mxipst#lw~;?C<} zd5o=a--_K^oE_i_Q#QU4`9OMuZLxyql(cjpLJPczEQ!2ZN$rKeZnn%@xc9t5b`>t(cq11nB9aWW&XIh$@)YZCLyk>~gT+GS9e zExzo|r(5hd$+on(1*=mB?8lZe89b#gx{6TuG5zCO!txFuf6AghoA`z@4K`d(%#b-) zjx)qcc`w#-7ur_qyj9*WKIQ9)TalxM!4L; zwF!6nKu>7^jc8MOd1dIq8x4~>VlnMNIosu}E0^SLeb{dJwrK1@&KW)W#as)nZbA#* zo;(*cso#NToOa>Y&PVKSr$VnzMng{pU=B17ZDhr5a%a$lwj)hy1S2k3(sMU_NBZ(x)JuD z8v0&Ah8f85$>JN>byW=T;$QQA*1D%Y23?q9Yq!9|s+I2oN?>R6-d+oP0xMlIou7W2 zlGbCj+@@QR6@-rvVvRL~!AW6lJfp#4-)Mf>(qMg6p3G*DEie;|eN0`hzo1tDSLDnO ziss%t_PKVw-gLmC*y?2DRxzoSLtl1b?Twflm7SJG;c+_Kec;h;Kj$9H z`o!$AviUuqyaVL9x!DrK7=Q3{t?*zJWiWxu=zJGrHOoV5YSumYXyv+f53XHavmpqt zi}1*r8o}7OJ-lZ1a_ElmK4kC5u3R0xU%+d|ek)!b`;q5ZweGj$)r2Fz>SGZPJO&o! zMDF4HGZC|B(YeLX`?OCy$Pynhc`xjm4|}iBmQXL@Ph*J*_b%`IQAtZey^KHl?%b1Z z`C*nc|HAf?iIOLx8oa2)4fH4N{b2z(tUqaIhouOu4ZP@V^LrhOnCoz>smCegJ;1_& zys`^exsV;fS@vOTq}5cU9;@&=+b>e=J^Gz%N@~APa?@6b9O4Q8gnd|hKS`f<+`GM> z$EW?cdmf%T<&K5EDx}CB^%+pRz%Ia3qu#uK_8<2m+fA;R)ymZCb+0c+ne<2aOgnRc z&GY(LYw4BbIy#@Jf-dAbl(cKkpPmTZV`R4*`@16kv+_%<0v5kNn*1SHz#&gj zFNQJClw{J`mL?)c9(L1CJlnpXLrz4dn)Qy$tb(;V+dneZA**}&rAS3+!E*^!Wv$RV zTwtjF)OTes=P#v5Z{L+CeL(hSc}vX;y?wv);IosB4K4WfjmMImeaWOZ$9%$hnR(N& z-rE(FrUcr`CovqsEd0bjg=XQQ39RR?k`Ko)H~V8?O27vXwTF&J>sfw|plFj1+S?92 z&30{jdTYJ!iixuer?nOR_V#E!XZ)TCiJF8Yf4tuM?EGiVYF58%<#^RJBTXni)09Z1-L`ll%T74UhUM;<@yyBaHyIhv4$f6`_k6BpZkUi&L_ zZ{6@m=l9!mP?(y8XqG~JvxP3LEmYzE2-7^Thc z%8+xUhug%R&ENEQYu`_Nu3w6`}2%AB`2{cJFm!oj$sPEBaQPFZzeh!n#|< z8)Kit3sDR{nGQ?(iCbcr@iJ=whh+s~(n3Mls!ZyS^m6rOHc3i3#=jfG*6sI?zZkduwhqF)}x z-3pK=ZIobbE~5SFf~-Z~pZW)Q6gv-$y0ct8>G<_j{OWC<+^yY`z-WPQV-}=bri*U^ zo^Rk6`j}8A#t(x%h(R~BUd493j&@kP{-Nc|9~PExAR|g}?QMnOH0H%Pg8hb-l$9-+ zfA`%F;-!4?z4rvl?|ks?drRlfFPmRBTL`XxczIYTd>H4EUC%6z3&`+GTuG!W^sXnO z8}}Fy>P3*df6}}|u@*Z12UwWC1P0>eK@J}Er)u1?UuvqeM=j`?HxiusIq-(xY`+(O z|A;>&xfr-nU5Gg4!}^`90jTsPY$_~-_2N&~ntShI-P*g@m8IUh*3N?GJ|G^} zZ;w!G{T?lK`+?N@HWj>8A8thEiMY9li(BEL4I**{T-if}OIw2Zk~)uOC87@?$u-33SI4J)I@*0xJnhqT_q=$f`{7PY??W8L5hn(-h5MB(cWHc_``bAB zJeO(27yrkgYtvHn{b0hiiL%EZ9f*b1eRE*`pW@ya7u;Lo*SjBx&vk$6nrlwr8ansg zfqB9_MX37%mN*-BMD&~wForC>H<@x;Y`qTtR*?q=5uZ4!!TtT_W&;CJ!l`@zpVHn0 zzNsqhA3yhI?LwQf7HrE+OCc?wEt>_mw1tvF*+D@;k}i^z0^NX?BD5@0P{yL5xEB=x zml=wnR7JsYK}Kg%g&B}7C|YnC)3V$&Nt6Hgx%Y;}@tx26d;jU@_BrR=v)!{i=Q+=L z&hzY-=bwUQtIvXndV)!Ciu4b;&E45j$Na~7CYqFeer&i&s4vw z-eR`b#>2P4mnQtJmASMoY90C(o4>E{ajT~7JIQyy{{p0Sj6!p3W7Srii!k@DfL(%N z!3^9FN-~DNj=6Wg&m~@MO%z^fZ|3A-Yaj&ppd$~B~4X(b#%G*Hz9(BO!_ewijk-=aa>@##S^T8bSM zACh=K6i>fT9y`2046=@@M17gg;>ekjc1HZdCp4)o)6*`9i-Bull^QZ<`U5h3MUrq` zK&77%Uq#!z3X42Dt6UYdw$Z+(mTaJ4-Fj_F8rpq@R}K7o2HM>~kHYTsSk8j~7Vgb_ zick3&Adi!R9WZkqtbsj8_!8j@bMi)R3B!p%Ry9|@I{sVC``3bm^+Bmf?^Sru-Sqw` zyrMRE%Y7xdX?iX`C@%HEmU!((Pjo30Qf4R4o?=d)PP`W4i3iu+ z1I`26%x_k0#;#!V`uexPM~;C#@^Hf@xT6frSe!F@_Kevj=Gl;DHKce>-h(!vdD?Hn z#bsPdxHD;@DkaXTNijLqyNyK6Wu6tY-jmlvzCqOhnzo~lg(VFbhkFJY--%;7IL14Z zF*9$I)>PJSQI4rb4f=?=fA*x$v6wSv6vi0_T|OD^io|&?zGu|X+1+Osm?M;Wn`+E) zrV7X&c0eycQjC&s?~Z@9Qs3;yII37Mw_t&-V6M!No@*>JW2;@+gr-~@#WlYU*=4EhhUdVOo(AVAlnFd8yCo>=U=EM{;P(S`^g z4Vegcu4g3LFimMgy$f*|*HY`QWpdc5llGdF8fdS}0*wa@gcHAVJ*`c3JuFmv17_0C z9lx|*C_i?wi=f|aq_r>8FqYc(ckNoVP--T}qJ?PJip3?Bf7Gx$(H}iEW)feH*gW-+oc7A8qic zBK4quYWt+6>t|zzOLH+)rv(tqvdt@+JFlp6Zhm!T(X9fVOe}gx$X~R0VPVA}!B#-B zTj=XSLP^m=sn5+=b5+cWL*ql(j~%+UA5&QlE+a{i(y^ShXQOW?dG_d>@LfHjc~a1E zkYg|;CRomhGddD1=i^x$6tp#)_E2DTSK~ zTM8MhG|){+TLqWQH5XMx=Z4jPp@}>ewM~^6W@no~+c0Yl>A99$CC#5-W80uZyFKOk zp&YXAlQ_4wc`Mqr5cQ&OP-FOn+Ce&t8Kr#UAY3nBR4`vCKpRv_pA4RREp9fbET4dG zTb;kE6qrWYgZ3ny0`3ElGmZvFw4$>S`fDvyYCU6ZYRf^~Z;+*rY1i@gd!-UyHSCMY z3pc4-46q@{wHO4U9J^%q^N?leMm*(;LlxYT+=RL{oH4Vau8O7Tom>rM-dna+g*Ejv zGFOt3tGHf1;pm<@2BQJEx5bl~6NytSm-q}UxXUs_QAU^e#D{cl7G)tR5?ygGa9-5H z{;}bpf@0HMVtG&xItbEN!LjxvSb<{5VgFbPxfhZqZ7p;bMtuo6LzHEZ)`RCgCVQjR zZg+uyl|eKWOLR73J?QJi-A(Y=U1C*`?o?r~1!>I2e4IOg5)D5V*2qgESE!=?l6&d_ zpRu0KT~v){#DgDY9H73@N_{g5U9fOrQ9&gp3muSE3FSp4MYalHp^Bo)#ijJRvZx9N zs$4}3@b`Nk#qB$VT?Vai$X{T<#$?X|c2=-cq^}ObdS#rncAN)ylE>PCbz`}_ZqSO* z9jA*aIF;-*U@xdu4)WQF;c2FYPW34bEa&M>?v?|tKTo>b6zjC&yrH3rhdvRkfMu_v z?)gCv=o6e+x~i)6B#G|ggsSp&kVt0kFM=b_HNv{J%Bg{#%W#v};=BU~G=9Aq0^{%E&*Gn!ZXev|1 zT2FK>3NofanrhX~M02V7u{4~Pd~v!DyJueR5yFn83Z z4J~VNZ|hlCGV1rVEA-78eDjA+YxT|wDy{pm2OBkskVP`k{u4dluv7YS)AEhr@K7tL zm9duWON8nDO?W1tCMu;S zt`6h!F(`j*z*uu9V0J)2=^B*YPbyu=`4W_+zG=X?wj{nR^4|6ocz%UeP?ZWakR^Eh?YySU7JK zmT4oV8jHk}H+{S?wFoB@6_ulISmK$ARqAYuEA7~JISOo*h4M_K=@^c8yLHeUE&aw^ zTiBG;1)wD66`>3)9w2xHncxN009set#L1LK`Jn5iMd95I`B19zqKB|f+A-G`l$I1# z7X3$FhJ8PXy*)%%&W7ZnEL%~Fmg}*Nxq5DkMcZ!ajFa$Bmt(gm^FzizjhH2&^&%EG z-URG2XkRzrP3M? zR5eH_Uxc%Kx{1W3y{QgR#+_aBbb`UySaz;VC}+t(loyq6FQ;8#EA+lbTGVZ`xlb+{ zCWl+-91OZv16rfr@}oE}sBSCdbOc->zZ2v>q}iQ3v!5BwK1k9uc6^ahrY#2MzLEix#V! z%qhF=fB|dE+TvQ&a0|}6IoB5Kq@ia8XGKv;e|Ay&bBjj+p6BrJW@Y`yTBx(66rT~F z@|%j+NSX>WP(yir(V$-r@8Nk4(u`k_-c!^m162JXxK;hg%Ef4Rq}nV&gW8B2XlKN7 zKO}O1ZNiR4D61GsluF~=9pI_cy-{hHW1>jR31tlMfS`l3*Fi@BOSUJd8uk{KPomXj zGiq(tbvvfn*(&bws;@Lu>s{pD={3OiV>oc5*Y9bfkR6~7+FCLs+*~N(6&_kWHhRJs zze^8lxH+h9&otCw%`OKoe6zXK9CE7*uq$ty4CelbXSm*Gwd!9`wG z!&j|H%cV7|UWcteoayJ{_DWa_g{j^^{mOH5TE%aGdzU#gB;9eeR>*kn=K7QcEhMe4 z(;WK}mtfUx-?7tT4fghMahf&@eAE5llZJijnb|WQ|EXtmgHU`(H`H0HOPA6aj@^1wx-{V1aOMWSjZj+16l||aU!IIs`IB$2N6XpQ z9`)$C3;9Pqup3f9`PU==KFD9^Pg`y;b=T}HOp0Z05WM>ZHi`Bz-GDwpli!GplNYBTJPD9gftOy|)Y_29Z zj;kPkWBu;%=dm&-K|(jDD>!YOd!A>br<=K}!f6YNzj^h$fjjrD-5rV-A;p{KiMST$ zv{$p6fp&W2S{(iJ(NZk4=PTqEeJ$o;uNJw%OvSz^to64+LaVz|#!7eihJZo^_F*pA z1yc$3B?8uY%zBBVLsasx_e(L4Xx~6K-PNWM&M;^Pp}X!8$Y+Q%tx97`cfM@dUL4#* zvoZQuqcXBFu1jf!-UnXRXj}w!6u^v9YN{!7(dt_$tC^ocr@m#57bR|H0m2!Xa03#ou5#m^Zbw zq}eYN?uI7A$uOq>(Sgg3#}Tg{cm1;n4d-Gm0n-e}q?B>(qb;_g1#nu>UwX)8+n#1q4IgD2Dj zWx5udglZ{=N3Z2@#7kxJCQVCzwXyz{_-{aa|07^up~jlQnLehH8|Jr~bJludYac*b zwdt_41mDBu)b`bwZkHq;RN=9Sw}Cj*U~ZCBf+@e7i+pR~&G-Z1jdnv9}_&0dHDchoD{SAO`}y4B#EDcap1L z=eDYpCWFk)b8(5jR+;{zcb|1cw)Vov2$SZ2v^0n3mKH8n*eB)JNhsie!o>nzl$PcD zW-KhKD#fM-yO_zNX8=ju%u)eObyZLJU|LaSC1^AO`<&A9q9u++iz|eZ%K5hupYXPF zNDWGddxdyYP!!^E6LIy2`A?fLcd}(D_~Y4Qa_=28cl?-H(-4)dD%KlgmegTqnS`C? zP@@W34QDmu1>~u>VvXi3Y-S*&$Njv!o%T2*_|;)4qrj=wr1Wy?Qiio~ z_A#Dmea&_|?1T++#ik5(_DM-;VaBs!e6ViMcF$*qzKwp|Tf9YxcR^0%Qa5d!W}d}Ae9v^Tm^^s2p15mJ9>Cp zqK(TL4&-nLvI9Vbvl&Xb#a8amjxLgY)NMss|%RNj| z)Drzj@-iBXy7k~QOm_~P`0E~d-;=UUlL(uX(89ww;J?W-MJw+!h#MmBd%$1!71Siw zY^&;vQ6A+9;iKHnaFzqw%zODoCeACvii{b znJLYAD$lx%gT^ow^a3|7<4s1ig$c4+TGLRc3vVXi&3NqIbDhvb3rnaL=W-YEc{zc1 z5pO{S-BB4qm$=mnK1k9R;IA6ey16>VSE0AybIgKggOX;J)gOcJZb=J>ll`6IQ$dz= z2r&=g{q(@UTi>@>($0#TI=P$!Xv0y#*UC={;ASu_{&TFcgbd)RNk z275wP745ChgZ+6{oEWHT9#Ha(Wn>Qd)&$s={mZzdQSr6@#YZ|KTs>SW*HS6}l+MKxj0d;> z)0T3{-3zpi+QkV!v~q~Qu!FuZ6Sw0%n{uVEx6#+Dg_<43CR3bKd#WGCb}}@4_cx7b z+3y-=y3={PDZS+l7lYMcp`K4F9j7(^D2~8ch)_?i;T?&t0YYEtuIQAG9mPkn+I{XB zgVyiCc6cDd`0zRp1c-rWCi)Fc8B6+CU?#!$z5i)x)#IEgpd8c+wz=$~`ia=1?r!n@ zNbCKN;vRo(PTyu)NsP#UKb^29?!a1h91`B2d-O5KJ!vR0lGC^K;dEE(OHYaK2euLi zpkb?rPlH}af#zB^TDyOs8DoSf@rlZeyv|+Y+;4VBIwUK}?k7?*SA~=d_*24?;liI= zsRk|&q+%Ur&yl{y;!LaUQ32=FhpM4%iGy~&%7fJhp>N4m5h`W)ACywv@m-B^c^YbS zw)0kDwUp~V+-YO(`~4Y0O{=j!!*X6+-l4*|80k$K5Lo&n;ky}k^Sov{&#win$GR{P zdudwQ7A=s-Xt18aKEQ5TS>>)#)kI^|A9ZpxsQ8NYObRF?&&nuu>QTlbL@4B|4XbXMxula#Rh{{ z`s*-w3?iPZ-(EowmGFajCMfHS`W3s%p88u&rOpATjL4zesawFcj5p19_BH+5ve)w& z)4~>A0CtRs2lrdY!1{CJw7d2f4>*^CxiQ#uvPHW~-S#Bw6o2j{u3JjI_VsVkZ;hV6 zw+=Vm;fy|&W;%|WO`l(j_peTh(}FmE^6-g2p35*zblz!t_uBiY@K9 z=X1oZ^1RmiIL=TudSaQdVxy-wbTM*InJ^EvuhZ-+@7PJSw?dJ8a1OP?4CoXaJ4b-4 zh22|>%Jqw@&GmQJa@St8*>=DB%9>JU)B!(r_2GtykuX&k=mgg8qP-rijw$s+a}KtK zyVPxCcJKAaJD1}{^TR3xdS$B^Puo-Y_ zZyMD{J5p~*4_zaubuZk#WbWgTNC)-d8xE?PzOPGLZ%*Ad4Q-m)NnbSxc;Sv~X=9Wx z?(k5m_q=^t$Gb|Qi(l^=BJoM%J5uV`Vs)tTcWI?Q>w!M29H(v@&W#5zl=_nyd$yYD zzZbU#c2ya14vKH>rCJ85=Vj#jYYo1PZ|SRUt6%|8Zj{F*kGky@j^EiSdi=>QO1td8 zrgdVKuy=F;Hxv@IxNTn{eUA!lHVrOJPIp%+-_Jb*>nDukF@k7!_ltM$kK{gra=-IY zx$olr7`&fq`K^`g9E94Y0B!TOpW0@iP~JL9C~e*AIcyk*er@)hZk^V6&T(4Y>vK5{ zL0*$&j9oTb4@0S+WQndiUH4-Gb_6b)PI`m%SR;F*?QcO1k0Adi{BmDMB$-^9Is;;> z5u5D%#Z(Ule22&;=M-KTHm6ewt`t#1J=`O-ckad#ip2Z92UO&#bzCDoWyR|q+-3|P)6A$4adx2vv zOoK?rQaFVTofry4`%7C1=v*2(jpyn7|0cdIke98bU~vif2B57ZtaW1=;v-Zp5(*s^ zmF157#g#=0qbkZZ`E3*M@>tl%CAcGSLE80@dy4NLKOEFPd5moM#xj?K?BTj>5x?W_ zoDv`P$z%OHHVbkNF33BWD)#)qfs=l+m3SSG+Ml$3VQ;b4*<-8+?USvSzQ302Yc#0H4lJl7D(B--rQaZ7aG?6qzL!uA1 z?!B8m7D)r>W^Cilx=Y74dvXlwl;4hT_Dm4esXre#jOTw|#bQTi&qk`WD2&wtugqgU z4IZ<6I@{fo6HRoRtD1Nc-93qsA+7{;m2_qt_!{dK=waz3Yi{NIQG(1+795LkB3vr7 z%_Uy*4I#qdyM+ZsSh=KCOXe|i7+;WvNHiyCk4DVS`YD?~6&5}{G3P3zL_FAMtpNv> z=It1K?|6gCwb?TT+7t5_Uu{Soa$J|1_D#~nv}LQZ_>=DHRgf0sb5bjZyiM(316LFG z|4EMCa0|Y%twWI3v8ZExZ(7Gl&Yr%Jb^**?(Mf)dsh50fAuKEmx>q5I*93}!O+@mIbMQh&e%jcL@rd2tey&wyx*BNVe%+pUeUs$a+v}4`)}6cn;}P;$XQN_x8ZIn z(GJwF7?l!-mI=@cC~-P@oH9|ZOr7dPUZOoNVn3Q;4vInSb7_9k2!Sk%dw^s+#9$`r z*HZAEF-iu&2G%DI{aNwHX5wFM zwDDk2a8BIqX(rCHRDv;c37wwdu48IXv<>g>!}nCbT$S3Cx#X32;*uN{y1OEc$&e-Z zOOQ3le3P$1-;N1n9C*2krMg=#wq`Do!<_;L`GYibK=f_=yNN_3#<`}B(i}Q)k1hqLCRX(z{cIz#W z8t;8_@=sbr&!bPoxu$Cd>YcEp5-|#=2!lc63$W0ub+N6u$%nl!m)uy(yB>(s4m@!Z z7Ma1j)Fz%1CwE-eX92xtRpus0zGsG)BwqG+g^s^8eIf3cW7kgO1LtCb&capYDsgJ7 zZj6QVefKZT6bF0~N$x&_5Jp8Z=9I47#zvmSnG;>6nf8xwxk>C5& zTpHREGVPCYHs<~TWz9rfl9#zHuW=vHs%hj9llsnUp-cFePr6QFPI zQ$RY6!Mm74msIJzBq1oaFzDSpFFHLwF|MO=C5K%s4>>56=|anS@l#JbP6S}pst;}h zxsO9DXiwKM&%w#J2@~K?s#T}kwo;RmN$zg^?S(6R=&|eO3GlW0ufi#b<>exEyjq47ZZWS%eZSQy;C*in( z2+0LbXuzozVx>*VIj$>g;asf0*a|WD_MN@L>?yU%&l!^%Ftq`F;u z8`m<)&FdSlm}kG)b~G{{+S0P!dj81LR0nBZNVVx)@Uz29Q5UxWo7#pP{x(Ql-Zs4D zsAs1!@p5hXCxDGVM=v(P2)oyE6i*P zwQPK5iHz zO9+`H|KFQq#~_n1S=al#b__Z{bpwmrFntu)jDNMct zMD@YBtkf5wJV>$^cm^}yoOo3DaQbr69zktmT}Mo{k36$el&E1d^6Uq*Y#|A=gP#DD^5Uz z`ZmG=2esU>3|;k6b6#lV&?&RlR7!J_aG*506L4=#4*t8kNs2Pc<_V{ z*Rqd}OSr^`ug?mmLJJaSH$yLeY&Vo-IHHX@2260dc513E)j@Y*d1uyTHkETF;(w|w z%yrb$y&=^BJOJM)b=FV1#C*(;LB_kAFe-T9F(ajC`C3=vH9ykkQ+_gr0rpGEa&!Da zK!_n;74q3f=C}svvN;T``JW(vVDquSs;*O_kJiL>jEECK9*ft`hkCm{G5;2Z6Rq2k9UHenwdEZ7) zq;;dG3vL%gnKgM_gDR=eu6jKT64{MoS0aZ}=z1|DAIP+i17)J5JM2?!rr7EmV)s3; zT!|a_T{+*yz2)JBQ{r1bu7Pfx;B42Nl%vi|#ff5}ok|KEsQ(|*zO1Bu95tns;ZjNt zH$V&R5mGG!2R18d@7|}+D}?qn^ISGK%!yqzPx8HQdBW46=?QTg#*(x@_>`z$_zmrV z+L=$mvRP7&7T<(>G1fwRYL46nBt!S6lK9>5o;IpGHqL%Sc)^>eKF&r$4|5J$y=v3RoGUU9cgHQ^xe0}F>OuV1EafV#<0(J4^n^U&_U(|) zC}n2C8En9cgm~PXSe4T~Czz@|-pc~*zNM3Mz^nDRo2C1Z>u^{4(cvC-#3Ot5(v5F{ zxtP!d&3~t1n;Ritm%kHe9SV(-BXdZiW_PghmNk3!_g=S$4LaAN8kd_xxfx;G;dm=! zJAtc6s1PR-B}L_Q(^bA>N&0^@Z$KZs06PVW1|SvI8LQEH>E5hEfP@91-;J4nI%GH} zKG&QpX|6gaKGn=a8w>6^GKxX>7}biu(AWS?`DWa}lEcej^E2AH$lZr)yz)UQ_p^(I z#n6A~8aP>tSd%jj8a%CoGHMN1z$GsoYeW1f=RwA$M&m!b@@6U86)B~-&=z=*b+irw ztYuelMtN_VyY(Q8%&6US*sM=Gi2Seyxl~oNaw8ch#vTXITtYwnFx=Wir z@{{V-)mhc#|G26SHal3?>?*!Wm8-^%`KOMk-MoeRxAxCGpN4}BMYcCloqJMThdr*0 z8E9@V+y5!>jbUFT-m&fA?93Uij@2%+XznsSoL!iEQQ(+f`hLFv9_gs~WGesvyayx7G>< zP=?Q|F~`Rn_C4TG=c%nTp@(d%!(f%yQMZ=LZ4+m7f@bZ4y$01AD(ro$e?Dr;-V0#C{&vO0zEfSmR0+&T3D>j_^syBGD>-QamrM&_pM2kWAHK zP4Dp@gJnHP6Aw9fk?VTM%Gt1MLcQ=G=gDdNBJB6a!Kz}Lp66Y>L+wh;nQl+EzmVlU zG0i^S`iymhb&6GQCpx~xyyAH@UBx7Wf6XK5_8j@?(5t)v_3U*U$jPh0|C z2cw@*Q4PJXbQ^hO`Ut|Hdf~=4)MFoMj;ptECVdO_5orchIU%2oJf>gEgLEy-m^Mbp zDPOc8ciL12J%M?R4$^UOLK;E$bTm4k3&w_f8d6{UQMsl27*26}OlWM=LtE`dyFN<| zdF@BbVo*}w4(!^R%ZQJEp^#8E9~0(tab-9@?fWjb+!?0 z4ogq&HIj_dR($7;_wX@C@&sX#du67}hFj2XA^#-waU6^oY$TsGpLST(2X(f-#!Qyx5#Tlss-5pRgoYZT5s1?EV@Z zR>YG_jCHj;8XYsTQ~EUd+TGc4)3RsvvDv6ju#rJ~NN_<+-ka;?M*muE`R`P>Qr{Z( zeJf@LqVo)n2np1Hrjfh6KC}Vq2 z4_<(Pdmlm3+bLst&gc_A2mdLQr<|@k?zLzMUtjG=4@1iOU>H)SNhz;%MuHy}93G+| zed3P)NKfUCbvBj=&6(|kxJ2YIFK8{<3Hv{q99Qv9*wbk&;cyzCFfk2!QPeG&?PIy# zh&4UvD*hoK9I6!ldZ0O={8D7sf_V7Z-e49k{-JozmxPjVg6;Z0Yphhr)a)0xAQg= z>R|{*^$&`#bPkxHZXRT}mh8^D$C+Y(1f%M)EFD~56gNRb2=96fdIY!u=ZfoLd5*RG znEy~A%_;sQXk^xz$GPxI55$f(b2~0$ZO0a5L#{(Ca?PP+ow3 zp&)E`x{5jMTB)5CVhDGsv+Hv$>*Rj?-wh{(xjPjjp^VJ?$WxSyGU3SxGy1gXp>A4=CbQbUQ_m_H|TB^Y}6XPst99oEjomGRe znKRazO^*6(ldZ8B=SFR$llNhtG5!|l-Lb=h)MUo`LkA@=!elG>sD8V{ggy2OzfZgX z+ceMnsaFgwc1Kl{Nt*rVZBeMv@y@8<^>*n29kAIh@XWcETTxSKPv`EwpT3XAE$QD0 z)my>?7H&SUPXVpL@*M7#C&2O{C%A0*PW%@f(Gz!jYbBlT_#Vx@o@53MPgmbf4@V82 z?$m-_CAuIJnv627n@}#n!*=0XJ5jlzGHdtn;eXw;KJM_I-Z)#k{E;~UvYlUZiM{Qs zFsgc6X^%oQmRDqcb6?xzFF#(p2YG%2OnzWWpY?m7IR;jD4A6CXJM{G34t+7SHa}lB z9Cew}DcFbP<|a^>xqW0z8p6hQ4xM1C;u?a2sg&*|F-A8)@qioafrT!jLw1$*N6aCx zw*~Z_2W=b7TB^hSGunqx%v_vPVVjmf?lA3@qmB8*A1A$Lu}IewxA%C+r%t;3ZdrHu zqi~XC0)vm%lg4~*tEn{7BBVjz(d8nQk*ezlB69 z6G$f~!@MZ_I6Cw9G!Z+`TzD%C`;F!<@Fhmxd|zXUzPWKeXzYHRYkMKr54!81%a6vX zM59X-^f4o07jGq@+B5N3$69d|xxyLJc(0N=a4`{c8oEs-FcTe2F@QDvg)N;l?=to3K()UTa zROn49-rzPwqS{DjX`X$(z^Bll>`9m3FYAKR^8GJ1X?$9DUYbuF1PM^+NXO}G4kKBG zJFs4&2Ah52Oyq*{g`ctdhw4Cft>Pr@3Uu#MC*}Dr%MvA$-hoSsC_P}r`sTqM<-U-ryzJEeZsz}dO+OsXYr2=X3byPvAaB@omHM#FI2E<}(Dxp= zmD&~o+O*8=?ZycR+w0>8>snm%IgDd-`z50VVXyljvEol_R&S+vSB=>SYxHG9T8M># zy119>bu0E+q~lKa4L?}pRBtuEO*#in&OzXQX4Ixa50QYGydkiyB)5qljPnV+HMGzj zPoG%m(YS2Iy@3mf&e_)~G~InoKPPk-;ET1u*Y0)DUExi{UDF`+XV4i2>06^UmSmAY zNx^2XL`OA%j#AuX8iJzAtKMbDnEZz?4N~+z=!a$QzjiX=XloF6QRG^8YoR=-#nrF{ zw+1uDC;k=j{sQTOhL-EK*?=@BvETHG;3BviJ6GK>w&b>U!x~2~aGd0J{%d*)+A7>f zTw%GLCtWTp>xVGr+Yc_n^_KoLJprLt@I7yMrCsAAH|}^sZA)p?810W>$3iVa8qs8X zA6~Lz9H&-v2Xex%t)P#Rg(k8l;swu1>$2j0ZM#!$V->#Z7bm;zC+A((3pacN(K4W9 zq-{Z)<1tHI)##7}Quf4Ix+vdA48v34~z5sWx zAQN>XySZZ+C-i{+Hg13*X>jw3MZc@tKFH6bZnysAyq)SMtd+mDE;NTjwDv3s56uSE zR_h~urx7hKa0^^kO$*71k*-4UpJ7$dAZc~DJ~x&0SHogxCBGBn_Bu!6cV%2nkI^7b zsxr1^ZRE86gyKO<7_70b+Aa4t_OZ4s#P908-rwf-65Cw})1#h4e4#m1X3IcWpd*9k z5N-*}a|m_}=kIUIMa_S(d&P79AFQO=PVTW(|IM?4BseuRD^{zw>YL)5V09ESbOWT> z(bLN%2gP;Z^Y;MWv3YKo8?`sgjauk?^vH7~6MF?AC*0{1Ve`#B3^s1OxZ%o7dokAj z*6J142I{4H(CoM(jsIbYC!nWZxnXv^0J%+{H~??D`JetB4hoGcbNhW|J@Dt>(o>3M%dk$!**|4GqkP&uZ2w+iLhZE3Rb)Ctmjm1K>Rqk zeg3CSGWLq~FG$#4AUGzYEg+HZw)#v>hdrz`v|A2{UqM&3jH@*0l?3!k0J@*$UK!uP z^$&<2K)>NQUjVY(H}uL)7%L#Y9@Iz}YYAkosaL$>!`Rz7fR()BLCoB@m0o$Tvq9<= zvR|2sUh#?!#G3)VLoc`7Sg+^MFJAEhyc_G=^80=n+i(qA`D}!P-uB!$di~OFU>C;H zT+e^vr5*FdCVaqPcZ23Lbh|)vdpNYN1VugU>q**PAfZoM;e#aS zfe_+7U&^L&pk~7*-LspfOvBfW_Q?2b%alp*-G#9_uOl=opPe!eVM9Gb|kH1L6^2o$GURA}st66>)CLP~@)m1jP3O z4@&bi%R?jL?Ev(ldU2%rlr<=x6h~AlWxnEgCV~4m2V{M;D(n3vG zInHGzs)bhjpg0t#!XD>2@CVOXZ=^A4?SX~}qED`F&g_9)76wU&?v~81aNC0c(cc*} zvE4o&8qHh!jE&PdZ?lgmeivGPpUl!7=lX#f?iUavp}h@Qu@1UNPni1%R+2#cQ?Ly+ z7OcOthV~w`zX4q|cQrKlM6G)UXA>K88kkqq1T-wpIbFc|3|&~=G0&0<*5K|i>;#*^ z179~DR3B+n1idKD#?>9rD@9oNB`W8Fq>KM5)>GoiJ+iwma*v)K^&-u%RXNGPZWD~% z@GU%jSNlYx0d9X_I;ct}>}`6hi8o568B`7GUF<3Bc)Q<$b0<1sB6@*(YJ7)!tBhaN z4WuJB^gSGQdZB%r#**pi-Nfd{Hqj0W?LL;rBk$=r%fV~$NP2Q{fI?)R5Vil{JT^d> zZ*Br-G_KL+azM6jfMl(x?nnEQxF4;C7Ar;rK)avI(jkpDZrZsWKR ze@Hdela!X!JW%2ftF~7i_aTO0l?RtX)g4!`&;(y@wiJ$AAh8-7;u|KF2 z%Ww)4&K0LZd-|rVpV}T7zkxrDXO(i|mDU zf>@@*Xdde8F~KyS>u+ru3F}Y+u@87YGGC|H2~PMo_$=-^s$E|nzQ&>Ta&7~78l-_g z4Av}(7ZkwG-79YNeTUiCdehw73f_ZK{@8(eEcw0pL zzwrJxd-5bs_~PvyS6;8K&B?G|X!2l0$)m*OrEzoGd!abd0UE0<26hc-tb{3JT` z#xuisrZ!#dJqN1>LnNyPX}@dJdwoRn$g?suzNkO1x2b<@T}}daA@w;XA^Zie z`0TYkaz9`)Hl3`SWZvfsMcKjrvz>>nYMSyn~6w5ks zC$ov`r*=V$c#IDDF7xZ4$uAA#at*#?`hs#{+L8js4TY_f8_I&*!=z`hcTa1StR>R? zRufO)5Kdz{#F_rCs6lNL>TTzr*4}FP7BVTFya};Xuz><8UK7@?YVa56ivy2O&AHOb zlEz6iM8A$pzxyt#M`)k%O$>dz$!`Uoyss(iK*uKmZ6Nl#|Sm= zcz*j(#X`T|K2%FiE&l%oNgw)gctURe1~=%r)8-4}^u-duL4f7$e z3TMJo1jbI`e0VBgZAD+9qGri=X3s^vPy6KsOLt4KL~IpCe}Yr4zf8Ug2V@aq8S7bQr5859@; zh?&iIRUo7;m<9gsfRh1x08;)v71#@KI{dMK^y@7^J`nysfL6d;04crzNckiJ76PUL z+5yu6sV{~AmcTz8kjftcSP6JL;2OXT1&#!yHoFth40x9U?*@Df@$LcK3}^v1*n}A~g>6atO^&AVh7vUBK<^s}hoFD-fl)<(CDo)LQ-Ol)9cx-rb z@n~LSJclPtuhS|&nl93h`j8wE2;uQZ|2R%1%_qz%j#pd@klul34jzjC@K=nF{~P1m zfDh&XM^G631Xjz~L2{wvnJJN6(oYNqSCRu7?NQ|Q$t=IU_CHu1)CCmZn~gkQs{&?5 z9q5mKwUN@OlRTF}N<761*?2aDB`^%A-~B9lle!^G4y@eHLv1C_2$7FgtwQBE=6DR> zpvF8@++3tyPdBdX66Ep9!%e@zkt#K{1I15|q}Gw+42{%*E2(0+k28LFWM@|m+;iZz zV2t-u(&i$5vJ$@l`E!c9CK5LLkSCS3JW{RJC~lk;F|Cr8hg+w(RdDMSw+8Mo#T^DW zX``Z_raS5#`W8X2k3cx(&kGoPN*op3T|)5%tu{)DqZOi&6O-c8T#Q!Y=mo(`jZOK4 z!A%`a?r?$HL3T$7I-OC;CsM$iQrumH-o0rQP<)!#8o22fEdUQH`O`etQXqaY$cGRJ z#qSC?Izw`I6QZKD%6D}aG@39aya&qCDd9cg)+=skrx0S4IuIV{s+84Rh>HtT;`9-^ zb`4kDw;*kV;*LZ7Zc6-kftyNq*nUI5CkUz;gu*l%nS_re<+bn&s9P5$tx-^^qZD@{ z+BQ;gCn3)sN}l}$wYsNLw`7DTDDM7(+1yug--ht+O8hj`&7kCyE~r%fl{iDtJ~2x8 zP(dZtvl;aqCa9%)ehT++#33DJbKo9jpRd?nYTO11X<-kY^9YZASfj!cBQ*qOH=APxBVWXQ6$D zz)j)V!ku^aLY!yNwxbbes1iO#fP5g_^vgj$9B_&c`H#iePF3Pq;2x;B2{#T>;uC%x zthmR+ouasL62fj(+_=%Ez71}w!z5v<)Q04qEa;>*Jc+WV2$LtrGWolvq7J_oGdEDsdjbIPayn zXX6`V755y(8KKnqK_N49l;WO?ez{$7FOcdf&r-N=QQTF?KTdI1 zBRpPlFGKr4%1*+2HNp(3O{jgABhNlcJ3K6ehmTb9Um-+B_EqAq!Wg(kiL)AR>@cLh zTLU*ZC6arsaQEGDh%^6BjDG}aeMGzkc&a(zHV`!+B>0Js)-*2ifD z^7}Zw0>cy-uD~b-8Wb3#z^)4HE<;scVcHYO2eU-VALZS%iSb_6MX)`J^5B2BL57?H z=i@zv4^`lA3Vca{PXdPO>*Kgcxt{3?9IC+KG7RGk3!X&$Oo$uO_k^irsMi>#P`EBk z_Nzw8_2utS>OEfZkCUM$Pl8mhD@r}e6!-?!M>A87$8j=L^8!cT9i~#kH8KP>Ce?$F zmSIdU8Afw{xqh*-KP*mxx5-eGBtx#B4EaIN!skOZlIUn%uEt-y7FUaZX2-d+|j zL7#eXQCdL2ZgJ93pU`80I0qiKp*12g#PkrYNU4d zvTjm;`t&`7-bm+VJte;v@#TK*Cj6E9H?pTNmhuJi^eO%QJ+)s%qVO-u59JMhn(|G% z_B|Vw@0g*$A_Z<&;6*^6cFDE)J|%o4g`=Kzm;(e)EATBqcv%?6IemAN68~KVjsYxr zk>?-7vmA5{%`YO}CiLKdCwX=Vkm$KDx`KqmoNQ?aT?e>Lpm2`$NaQ5?);|c%G;5nXf zUrQJV+zWdINJlvAG~!A43;F)uPq>UjIfTbHB7eeR$>AJNxakEzGhp4nseS*ry)yBB z%sH%4fNKG>0Z(*dZ36rX-;a|(w*7XF&jFm{$9e>K$OF0$@FM&}0Vnk1_*}s1MI1j4 zFa|J>U>V0x0NesN5%8^*96yP|YdL;0;C4W0d}QbFek$Ny&I*n%1bhMhBEZ3j{}5n0!sh`#184`lvXtW;^uC(o zivg?QpHJcNmjG@7Tmbk2zH1?17o=MRcn9*E0i6E@cncXA$?1bQek9J6<5I;m_tUskv2*Yfy&E=*#-)l4MmW))=inzAaZ?_RM-?kVJfi!W z5Kgq$NI;_59tI?Ot@i^oj#R93Dvcu*yK5570~Jfor}?5{KL8S~UI$3~18~7GZ;&7S zw5Ld(PxDg6W&zT^B4rxQKNb7c!eRa)|6H11c#rr*OP@wPiH_a~NHkO3y&O;U(xDj~ zPirI9oAwwFBR%aeJ_RItt;-aSCt7V5Akm7Q(>b1KqSF&Op6H>A2q#)-3%-Nspc#Nf zOC{qy(NXJBFQSQhpgqz6tMB75o>go+zL#jRIg@E#s@MUP9}74J@p}VqLHa&`>B#RE zz-=fe4)9aNj|cn$^$-BxLViU1v>+bQF|+VJM7P+GKhY^Y@Sf<2hY?P+%~*sN0FFfZ zLJ9{g0{j*69s-<(_wxWdP!F2VWwT}c$IX%P-x&1UX5h$djE^^W^88UeTYxV$OoKfU zuMX`!UU}`sMna*|Cg_icTCMpY43@eK4U?T|yGz~rddp$cPWy$}tuv2j?62~u*Npz8 z->Ze^yKkO;blBd?%aM=eeL3jOl3(JUpMC1i50?A+RaqY=zMTJE*C(caJ!DULd-#TN zM^axe{;AKi_kTO;y=7kQBRQY-f9;_kdp>pVKS#W?xG_T;p0hQ3{KDdN%be;fG5{GV@m?tznc zykFzftsDFKfF1K%dp&*MzixkbsTlqEq<`G@mqowzeQEC5dp=qjY`Zw%^2)1UivRMw z)X~rTH}7q}Cw-#N>l^1^@Bi5E^QUyq=v>#ir}K2DCNLl{KCmG0r@)(mBY_J6Rj^NR zcrYtCCs-DIH26yJ-QXv|{+&*{e|skAG0Iu z8+Mxg$bMm$f-rR~P0v)4F|{h2dI?BI@UxrO_(EDoa}mJ3Gr#^$sS zCq&)Ft=A@V5xV|dSo8pHy)KoD&<})r5I4Evjz8|^|5K=nV}|b1gL?fha!_+ZQVcy6 z(~z#4;Xj!d|C!1EElsvIhQm|&zb{9_^<)O_Ic_BPTyID5lmF}bX}DgL&iMbHPHm9O zI~nP){+IH?F+m@e_%&+w1*SLczv2OC|Makm_$g}k0{pbUcmaOG2kSMoZ-g#D+p|nJw#9}i|afn6iwIwllOv`naOM9+lsCz>WHNsdo+O(+i0Hst<) z{ZY9@52>-Hkeg_tP<@Cl3b~0kiU5;|;t+ilaubadN=tMSh10kh-XgDW4nP_=DSxMR z4~E?TM&Z~;93lDxJU;m8#lA0z{=qmpK=cpjsY67UGuH7T(LsSTBLL5#{QuTIi1Hu5${jb;m5;&SPm1*f%qPF2wrEf2=7;&hAB&8O zdLw#N%;Byxx_{SWVXuzZ)qNu4o{aC)_a&iU;*KO!^3MJPOs}T&9r(Q+S_U8J=ne*x<9GvKzG;E4v z>T}bMOusrK;lAvdg|k-O|H1=%XCI#PuLsZ1{l(g5YtR3!;9}vKBIiQ~=IyXQ=2%!f zety4_j*=q_o?bY2QBvvmr7xDvDA!lKQ(>*tEPicq){+xTN|ySTuB{5M-cYSw_VBXb zmd&a8tR{8&`sL@Bk9v5+!~c9ZVTESLs1C1QTjg6?vh>7~ ztR=54)-1MGzEh#Em{I;>+4rSMrE?cOz3|9_j*@;QjcjCJsM4bm0(x+Pd3fZhdA@-+`~D3^48N zZ%W>g)GzTRp-g*%uSlzU;g>&w~F2z@kaRT-|alGQa&ZvsH1( z>z}Jft$Afl4D$D`UGm7)M{3q->NnR9SpVVr`#1PDG(I}+G0$UfY|Q^t{Ntw|-`3#R zG~x-}lc%2CxA}=Jl~2ujI(uu{Gl|dkdM@Vqs28GN?EX?*W6HLSm-AjJcy-10=U+Rp zVua9`6=*_3!`tr}3-R7p1dk(&>*_ZduQ}2Gif9QK_-~aZ5As;^W(Zz$7k9YmG z%cm8eo%}rKi#9Zz}LC};LW2Q|XB|L^sqVkZjk3o_q{856ES5EFk zDK9CPdo%N9{P(Qu|6M>6`yQ!ROnv<0lCdJ64 zQ~btfaLDst9HA&7h-$I)Aw!0w(+_To;<(9Aapc$1dnpZKThftCPJ{Q97Wq(I888cc zQaVg=e~5);X6Fex zj`E61+!nUYTR;{tUoS;Ya4m1i49*|sE*r@C zKj%-C%Z46{>&=1rSz;?Eb38DllMkzYg`wJ`ig$-vNcjLsv;0jhh4%P^Hol%|sNtYY z_kWX{Me1+HvH;WZPwx96Y?w4I;2$<@$YhFxe|U$JZ9w!p!So?Rhf1SJ8VB>kaAz(pSD zp(LDlO)n@}Cxp32pd48j@(o&%WkUv`Ax=0@F>NsDZHd$tphJbF4rF`-{G?B%1bujZ z7~}WoyWaBz*XMPPb86zA--N^MU{^D2y+iYEVfJ_(TUtfZVs(| zoP^s1r3BO()MBt$!Pd8#NEDPvsM>0M`t%Ht=Rq#@(5D(mYCR#qoLuMq?lVaM+rIDn z{Qmmk=VZ>lt-bf!YpuQZT5BJPbByaDJ7J&2Gtoxa7x23W&r5j7H~vkXPS{t5^IM#R z9Yp#yr0H{E8ez9gChU4VdAAcb9gi7LHJ)PB{bN4rOhNwC;rd7)N1J58*oXWw)VmAM zF1**^84EaJ`ir&{ehBZ!@r2N3AD&%!9zy+}+(y`yc*00mq3-waOvH01p7nUP;CUX; zYxEf&EB$Rn|17GJdY1iMLsP5>%o5=zV{N!|2yk8X2;r`Gd}`$ai0^oxU~qFd7WZ2W48 z9CNDdebZESIer)8_s6OI2DQA?TROJi*n6O>y40?+Pp9@9uT-Xv?KfQIx~hthbKn2} zTOI9Y;_JgHicZHJYrUxGDDH=s`VgQ7vK5nU59WrtWGmWXzdD0|ff;`hb2j9mr%$z(B2%iE$(&3LqnF_k05 z2*gH|C)M#?#5|`!$ll-0aG#$m6{m^$Vxb5Oyh4bf%s9*Bom*IV`7V|(GI?AkUkOuY z^3b^nIwGu`^Sc7Rr7+`JxB0}Tv|yS}=2a$3hi86v?+L!u)ye2yGU_C=Z2DwOj;W2y z?>nKBlU3$!f+tqzL^C5JHMuOi{{-OLuXXS(DWXN>#B?zlQKEv#x4Nx>n@RHe!+{K6 ziL-^nymcax7h9io>rTiI|M6j0rYbpGoh@-9gEGO+Ofbu~KKAO*-TIR{{FY^M`0FSd zoBe7x!*-u@whH;&Sz#vWW4npqE7|4xZMUEk`gA?%h4n69NvsqQ6k_w0;I~JjHP~G) zQ(?O3qY|h*Al7v1NLy08Na}40Dachw@!>9(94yeEaEUgtUbKpFA}b=_#TS-HlM;U4 zV<8{(Smv?yt_-H$7b=`72-;^LTwhs3sS7dsa?cq3{M z6U4dVLn8AcQGVRZcbP~<0hzF^GkN~z&W^Pig)WJ_xb!XNMJB(z(>QSoo(wW{2N*%m!ZT-Ncy}23R{C)PL#WkkOsyMF36R-Saw;Lyp}ZB z#PUvg-Qg}mD!Mr4QpYBR6fW+l0p1pMP;3I19H)>Xib?Vu#vTW}70&HsxF1UMQMOnD z<`y3Bv3zez(f-RlcQDU2_OnQ*Fa=iv$-two@Jb+s>1T^bzi!TE%L|sG&YFcKotqxq z-*5D?&+oA4`;A-5JD;7x^~W!qq-TF#-f37=(mC$iEnO!4sxD*vw#40uC7m_n-JP4p zyxz|;Z+FEpm0g6JoKV;qfBO&9in^?G&xrHH4wQY=lfspE#@$}nnYy67lbg=GT-a&Q z?eC7~*yqU0!1y7e{9cXWnFtK<41T?Tc#ijBj>V}W=4inj3+8s}SwULZ$*@_{M?IDY zSrO26m>I!r9{_cXr89fI%V6R&|5G$w9-OhZOHbI7rf$Z>$h)y-hr3CV?hNe*>$-yo z<-mwR+$<)_<1@3N2r;0OKPPn5#L80mbv7Ou5?{Z8}!(ru=F+`{{ULW&wDzuv1=Zkn#2nuH;){5KL!W)`D)r&^cxl zGGRes2;WLqfJ)2cP^howGAlRr1uhHI>%n2YgPfQox;inZ&Nzn3O;cftlq@djWJtR7 z@h~4=9n_178XvmR=JP>{DMsLALA+}i@A^WqQ{FJ8@Y{u!hGqJ{S{lKr#6Ad0ELmuA zvh8$*E_E<^KE1l&{3TN{!7s(&s~x_UXVM_!7LQeoIwp*_yYrI`^mno*Q%Jw*QjK+68cZj zX}XO79fJ{al!ZqKNpZ2IX048SxK56;W?!*g<=OrV-t>@A-FgwaP|2FN zhdQuRY_F)UZ9d&R=DtjCLy1wTQHdidEPGjpLE;>iaHCe+sH{HR`1HQv_eT%&t)SG8tU#fl~C)>N!o>s!5M-L1>$j9m;7a#{+!mb_HSc+MQs=jDVs$W-1Hjf9TH z<)usUdE>&&_TPG4)m&3uGcDmu;>)r>*>N$O9QQK23aZ&%Wc!QVojjcO zwZz@;UFk9;w@+E+5?G~o(6Oqq(D4YFVv_Ww#P2e2?E>iA=gL(w5BspP$*w6_KX6m| zra3qnG~=n=*#wTYxG%4GsA;98-na68(eiR!{S=qO)#x@!4Jsi4z%kh^2lYa(@&lDj zc|yx2$i2{Px0nRG@*mjiS>?zenRHNWG_dUqMl;ac$T98Xl(s>S@yYi8RO9E7seY-r zGfqD>hkO2c^><{4nns>iZ^3UmX;+UDeSN!nn6#+B6Fz9J6~oQC$*japE)3ry>+=lK zxIC*gJ}*N`%bOV2?syBvWZC%y8(mBLTnlEw( z{oFWZ?2uVrE@vr*L7G#3g*eA4aYL_!p2t{q4hDK_R_~)BS)X!h{YrhOS?>TQ?ih4m z=E&y4DTPEf%H>z~ubHy%!yd>GC8uvyheyx0>x69O@unPQA_hFqO-gjd^gwDXQn)@Qc=KEyRRRd3Fls+D&I-&8Zm&((B3=;lrk0Vy8& zL>sBX^5c}Z2R(o~R{6~UT}fhi>T3LN=&G5qYCS{xjwDT=pq!EH!bwD<508Neb8$wj zT(@*Z71+i&D<$ipK(g12F-LlZ82F9T6Kje~RU&$v1b0TpV&JZO@s~b>LvrreU0xC)Mm9Vpt zT}&Y)4Yb)nG@4_ga;c@Rsm80@MQne(#PD2cwMe|R)jCMA`Vw;!&Y>7nnl`RfZCtBI z$2nF@KRTKor=^#Srj1(q!O?WKmM$MnXKCq@(R7ZMzIQY&Xz6c{rfpjKw$Zd*OHUe3 zGmy7|6$Dr%!fj=@mL6B@8T$7*29)PAEpuNk5K5O#F0HM0D*<@r8FTx(>D=`{apqzIxI!;dn9(p+;Z0UGyt|9DRbbf4UnwCB|noif!`$p3y zExl(novWpHji!l~t{YA>r9{ykCgd>fS2TGo-dcBmnEqA6vHmSu{l`b@mzA!e`KK@z zig(vA-uaetB~aw?x;S$?QQ}n_PWwp=2{X2){%(bDC8c=2wTg)^mDB@F8=KsY`UR#H zmKAM1#pJg=A5G``S;a8RyrQ{ZQI7ZgKDo3I{Rp%#iWAzFwqUT2u?}7MW3QkD$j881 z&?{Wo>~&xbA5Y4g4c+~6PZ&S~kdM$>vN{l#cHUQ3@JO($sS z_R(~Pmj2^t+MuOB8cru2(%;9o=nitT*ao5usr=C&sHy#gOsgR51e`sS4w+ES9c16o zq5SVEC$a}&t5IGU!ijOX?gbZNnfusTM3LVeY3G9$a^rujZ2A~y)8iz+59>=Y%*f2~ zF*zi^Ut8~~m!eB*n~3fFCC=jx1IP0$v{w*LV-ZHkOq6K4H_fvjH*9g}THezENmnbvlRbsMPkeC5+_ zLO!SZip@2vEY01;&BZB#A0x{~qcmN-TXczK&^jOM4TyCjP4n9McxkTznrkIbrgVle zLgxG>lKU=B1BNrv$iiN?cpuu#?bXZC$g$znd%YaASYmhF7ma+kPj|Xpi8>k42t9w| zeF9GZ(a0_}8X4cm;{;8nSk78-3K)uf9M!$#oSyN$%50n&*vsKctM0`QyOVXPMaejI z>LkW)DohAlWK$t0;ryW_$0gUV>G(xgoPK3?g1oqxI}fa|`ff(g$+|Q2{WZLk{J%-S z#2#P)m>|U)J1A*U^NDgVPL=ql6cQrei!~_U(Uc^@-f@dTp6G~^&RFot&Z_wKuju9I4<9jcoQVc zX>(Vd1_@BiE3KD19#pxPXsZ>DB*}1Ywqv~HbtFiSIa0%%ybj~|5wy?*8GWQ$@Hddk z;IAvS+F#>l!`#(C>PjnZy~>d-#h+W|a7x@c;&@tG-?}hf<>GdzK)SF)Wk?q+L^>I>c#l#@g%NAUu%{AaoI07HSXP{LCQz)N%~VZ1 z$-5FZ4d>Um`-bzbfgY1`-@pl|26hIb{CvP!M7m4{PNr*@sWNf(C5Lf>jhwKFrQ&7T zV#7%1qn9|-E;gT&m_HpKugf<}7CD+VNiiBD7g@$6Pm#0b9GNs9AJ648VHbW`dWvMR z&%@TBBg=4#oN8xfyPj*GY~P_y5E#2o{)>^31bd{TUR;2F;$+@t#zXs}Ygw+C%%)vB z*`(!|cF}RfMnG)3e1l}TVFWrk(9GqNa9cB4o9xEP?fHIRzEL`_3T@9QeEh?maq)U7 zQFaaYZIZz+I)miQ#aNs>)QJLXuNO@(ZBk6S1)XuaxG?1>CcM;WXm@ID$`!_Ru$wXG z`xgNVGhU6`ZF7|D)FV4@l>`w8;_|ekvCM+wYTZr=* z+4c!n0(USnAelcaX3rmlWFj(TBhKpuMW*^UK+#|%XJuV{`}Nv~Q9HJZPNBYJgVnUBG}}~9@~)mU$(9Do9^x;vT6V=? zY_PtEbNH{inYiwAv@Z&UC~E;>rPcPO*})L!wCT6sap$+bJ>#y5rOPU-9-&-+J+HuB zSX3<1JSqd8Z+cO)b&`pHzcA79M3_vNB=*i?Y`W(tw~y1fodLJ=;C3gtJ(=>T&PlnQ zHRq2zt$UI3GTT+l>bl&pXl}6T>c8$-q;ivWyGg$8%v?9+d0joNwZZBH$BzpG>M+MA zXdJIW)0romPaC_o>DaD9-S5*jSbHdxAJaDfGk#y=uN~(14UlC{|09rXDd!eBo{-Go z_w`b-^yx^w*TOJx4F4*H%D zxZIK8Q##UAE)z0=zfmS&rr(eWpcJM~JmO9|Q=`cQ^RP^a<;P?K&AS%XH7pPtyUa$L zI71u{Yv#c|2c&{oZA!?JNViNE*9Lr$=e6YQv*U>mrDri>fq1d*9Z zOCTj)zd=fndR;?Vkt;)2Pvrz%gYhp?E$c+DzKBdR$jpKHV%ra5boG?Ay!e_XA+FbZ zAN4rdDU8q_frKE#5`t}D_skcmj9_=gAY7Lai!Tu63ACl0Kpan9N%&vsO^(>UPW~sd z!eb<-43mb}gD4l-+<>T4$m}JZ@r03HXf(@$o@xJCqaNB7BR${9$iKNfo21k`{kgC^ zRypFaV;5t;6dhUMyr;r<%a1tHq(>b;3V%x`w&dHGv&jOH{Z?pb40ka8Ks55VzVnw7 znD`edbr?ap{BE*q4kR$VMlWb*Nv+mrv=$rxQqmq;ZwPv4_epk9Xh%eTx6PPzio7_hSa)WZ$jEdT z0T(6d&+{+hotgKrGw+IY7?xSSn}fZW(N4L%OdPs%n~Dy0VSkqktYyXId>wd{YO_o| zodH`f!0N~}loqqF)k0gWr_$g)!Zsvy-)C&DzZG>gyv*jZu@nLT#xch8I+b}JWCoD zK_BHC#_!?PIKs%|_fSf$FJT(uuur+Nsg}yrbKzS@>GufsFpAATpVQ0ZM|lq;Vyzv>IjC{Lkvtiy!Nl zcIPA_3zGn`T`w0vKK?6+|1Y&I-UZe;5AUPrN{nTRK_tOAv8^YLY!dZKeLqKh{`JA~ zPJX;a(qpe^C^k#^SFcyMk9-lJS5)Um?bmH`@Kd*$B;>`%eoBDGA2(av3ZlF zyBm|_#+{2o1?i!ywNE9STrAEPMYOxO_w{Y`-1CrF)JUO4Bi}l*Z+X6GDw>v+=p2fi z>}}lXD5`1Rw@uz@a@M$SJ=wTC(WzJ7>hIY0`nE}cDTL4#kTL-2o#2eD8gUD}eK~!> zZYM_mO8;0nI@S0Y?JrLo?@ZL?jx;XM&zdIE9$xL;uYM=cv2EY-eJWp1$DmgZzhAk9 zWxdO)Z(TN1s93gQiML`^<%+5`!m^4LE2=7mC#u(Zg;lFpO*R|>w0Wy`D92}@V6UsYMLW~1=Pii$_q0tOMbvTQ-&Y@u-Vs&#_6 zrsC0+Rd`vtejU0M9;sflcAfCZNbV!6*NpV;^iOn7_oIIv<6j3De2c!U{91G^D{uBc zv#`y|248gdhGBCcV_ZD^q~Q86^$VMnv_ZbrS7L23ls)4mQ;ZV)!n>GVO{#&36Lt2+ z5^L)nAZK4o0@~QZ+|-;C{Os~8&uv(!P9(w+C-lemXc68yc#)=wf;beh0<(sBIK@2f zfZTl;ba4nd)FT;n?pI9=wIZ*>8D4D}C$ifOuguSQuKBmY6M9Q~+^p|;zZ)XYk~#}K zxwnJ150t2_FT2TSR?$@ruXT|V@IO)oQ3VV-F3x69HoeQ)jLPnJS@@ zi7oQ=7MfY7~}t0~3wRi$2-f=!dmKvcP|I%DO8k`J<8Z zLx*s(BuX71|6QW*Im*umUjs!v*^2SG1dQ*;fE7WsQD}%SBSL{XfjrqtN3$AjdeH_F zyBRH#&A@d=)FDD|La7I>IwjE8v__N>RPp7DmGC#1$eXI!`KB5Ni+KW%efa_7XzkMer&@h2V@bTIlPGlw9+ONxa&(4V zuTXcut&;>Vaa;@gS{dZSFXqslV9TgKA!g;H{DCu1L6U#0NG3F?#5O1EsF--$Iw|hl z>)os|?zXWfKEG&Gtf{xA&Pcs4_2JZIB<;4<&|LW2eA1ZPo|4Ah#)WI-`L}tc6SqAg zRfr-m78v51s5eKc38@UB`kIxh@x;=gyq!#ZW0%A96%p-tx=0_~yB z0`_NEbEi(}9r~LFn?mK3MD>e*=;_acXFH@;#RYykh~ z9&R0auY>H)2lVCY+uEB>d0;R!{FXBC>*3NV>IT@HzPBnS!z+b?g$p5hSFQx(g8Q7) z7flh03KkZC{j4o<_gTSvy!1BC^2DjfUj}+Q3o6jTU!oU`xy1IE$O%+p5`@aZV%-vG zjz-2riNho{sTLb#YBKc&?h>Mr|2oFE@-2+l608k87P>F^LExDnSMyBPhn|=8@$Ij6 zkJIUD8T^fd#(6xz)W9}gTTo$;U+p$&B_>^RQDFt+f$XO7Fm+TqXG(0oNs@yBeOxY+d=SvCh_9z3EX9yVcbd|`+<^wI_IfjVJsJ$yUw|TTeF_-g_VSI=Yr}-S3&7|a832P zDln&8SOygeikP-n4r^7{vk2KThp^Fz;b>w@9L_rgTx;SPZT3cGy_(ocS`d#i$cHGF zN$YrlfOn@}QVYq%)bi9h2gC=}iLSqf1i#J^7pBttb#+F_<8Q$H4TyeG3!{;6>y{Hko^3r~)FSMxCvhH(1A2|GG5n*Rz{JWr6(eY=450kX9-GLI?k|>*1 zGvXlHj3%rPXv9vkYMN;YqpTiegj1M<#1Vn6>%(|P;v-}7p9Mz748RX9F}4EGJ>o!+ z^V@f+?2pGAhcZTLQzsNq&76U*O3z_buVu=p2QT*iB$e=fi^w_>p?mRSmNF4?i%V|I zVTw$4uLz0L&xZ&&>dDsYd>7-!7U)fk#K3kygs<$zeW10z;?M@`s>%`Gjz)e2ZHY$9 zP+nVGwPr)rnpm6*yq;BM-s4qw+87_J#AAQZV;8Ojj^dy}MkBBF)0zEcJ9sB~SdXyz zS})X6eMZHY+k%N=8}=eYX|b0~#mNG)Ne8{vR_BCXFVv3c@K3fRik}2IF(HmfE3MC| zg92S+&<*>X8g=H2Jfv)HpAsxU%mYezL|JHWQQ`@asqA^QAf+Mt_ki1YCSG{5RgcGn zCkYSqVvJ{?mSsoepkWV{gn*wiA_oo1>LDrzm6AO;t0%(K^tn1akSrfaCtZ@Sh%dvr z=5UFtm<=}~nn&5je#TKNfsCkGLyNoXd>Qt#!zD#xqnkO|)cjRPndm^e(M?XQv>s^w z0yGlXoJ|b&!ARq~7BB0m3)TdDC7^*aV%Lc?Cp0`v%tTq&Z}Q=dMl2|+`b&M!_&%}D zw;J-lJ_~wKnRo)9@j>W?rXmugapdka*TW0^^Mmu>UDlK1c6Sm`Op2v&VVSkA*}V|& ziLv*T_~G9h$`C83ywDd=7(~YLEmq}1KkHylG6Lw3J_Np1&{g&zV#b2|3Yh?<-NDF& z)<%}#HmA~NBLI{P& zBEq8PG5Xh3G7@7(Vc^aH>ZVD9kuw9cLpobrsZ~jVeSg|u3hV%hiayFflX@eXst5x* z!K!p=V;YQvkMdeyj}RTfxwVu88;_(ahJM%OzZ7%g0e8YlbE#|P+#^<{X=p~sstT}>aS|(`ucXFH^W5HK4?zy~`A2V`7c$DM*23&%JQOAm?eJ7T~W7@io`C1xKb|K1PXLnsr z=8ekz1A3ez8zALD6}^J^+Oint1jvPx(cTVUNi_1OV++yhcgLcUKO9TN+wo&mdxM2Z zXaJYRgUg&Ay=(*T5XGn#!6($}j+~_$6MR62D7KCA({3)zia6&&gUCIc=_Qk|YB;86 z-lgl-u7e$A$;zsgtJiE?;#<9X#ga$XR8`FsmabU6Y`HMe2U|%Mw1ss~R4=O%sJVpJ zK|W+HA_XZYnt&6Ep=iW^EFNQAeT)zq2b9olif8H#ph^AiXD-GO4!GK0T@5=SjRYbj z4fH^1mBy+wq6IDgdMx%%q5S#SjFz$YJG}MkIbsTZPngk4Z6DZSa9SY50!ss@Oz)!- za-5A*7WWBAHxJQVV;{APG6IM5ioTRn^pLTihx5IRtyVq9&uH~jvh3k17IqC+wb@$+ zj=|Xx6bMeL6>9 zOFYqwBRkh)cEi4*$S;PdMskNr_qr7x!Q=1>o+%z*>k63SmMpDUTfHo{Z{6H>0d~Ei z$QG^bIMo!I0`Bp8IZq4*o!>XxQ%))XFWtz+H@=V1&X|x6aT9$V#O~JUi0+TXi~9iJ zW)A2_lI$}A##tKkzCe5^L(o*zx(WBtA6rVXBFIt(2F0N z;zb6YF~`F+cFu%)g6M3e`*(Y^t@%*D(oOo4UB{cLJ=*C)boJ4BF4`BR2vV1&n~j0LQcd(?@RJl2Nah*PPOLxjhv zRM;Dp16w-Bx`Y~MtHr^baXNLfWro4Qo+)s)HTz2L1sBpj+kP5sA`ZJWap!aD9nM#8 zfrjSEz+cAmOIQV|hW4gv61Z+F1Ag+nsT$_Ksal-8U3Xw0a(HN8oi+C{vC&JE#$F=G zTTM;ARzqoW5oGV>DD23(&ln-iqeEYmW3cubZxH1n^_Kf5lzJ=Lq2mRN?)JgR(gFMI zMz6h0xT3gBg^eDennqX&6^-~MuEq)(_j5S%A!2xAZTe4ns)^E8?7IAkFHqvTc0UP} z)abcWE<`%It})Ysh=rf$p(P0@NhsA9R#i}#ewR=|?~z#$oo$)LT#+l13mFg18R`Ia z=HzJW4?cDg2MPTC;&a>MX>2v=)0@$v;EIo7JSL55Y**UmQL2&DDWISLC}>JDonugo zx#nHzA?!paG>Ml#Al1A3KI5tM126w!Wo;o__=hT*N_G``sniX4>tnV74O41MDzFh) z={Vx?3O0AO3%>ux3XhjO7J!sspxJr6QLdtx_K z<4zGugr!vX!#|-L_Y9Y^AXgM@&~ibt>OPS9TV571$t72>v|mt@^ORZp-p|2O?h#YWs2PN0(UWy_DzK z(t;nASqnyE_jpjAPGS3qFa|NTDbOXxC~pl~lx{Uqi4Kib&JScL+xjwOBpe(m0L=}`9v_l}d8+!tBBO%O5_IjR>Abzi>MEbWH$A_6@DQy%lVtV+=l zqu}sGu)ZVlvAR-VZ`$$7@+-o$n#$NZsNmkrQbcRnm_UkRRdbZT3}z}1N4;W-g2)_^ zG!$IkHLd&#|0vcKx*L(HQWW5QJVw`~5qeMMx@sSlq|QSe(MkL1?mKK{9%`Y!EV^^EiU&It=9}dO zq}Tf6v8P2NulF-```m`G1WV8D;!M~>I6*F2G}v^0SG=cY{r_s@L|bvc~S47f#sR^WOQxIO_khJnb@ zfqiuu8sA4F`=iDtCv@7afUpm+2^ojK3~3y0PxoMhz}wSB782tXv`iarxh-mF;(-I~ zWlP9}-H5c)i<87##9L(Ccs{F?gyklL#;T#8YJ{tNJB5(??MIR5k zb!Qu|4&m%-kZJm3+a#GgyV$(Mtbe-*6!^THeD zB**O%@0cBaK~8bZmF_`I$b*jJ@J<@tL0y}XS~~&j|qLU++(dTp(U@XTkG-5A6IA4UsA7n3FGifMn+!!Q`ScRVfSCo{a45B zINejfhEBPAkU0J%?emu%sn|&JYN}bO;0h^VWE=k0R1oFq0S0F>9ir}!cF;NL6gyhH zEg5YE>)z_%lzUZ9nWz4*jz&Lm{3;x)k&GIzNfke0*1d{+gX2kQ%sIv(Adc?Eu#9@^ z!;L{5c!@ZC(!PxWwT@?O0X4`!-C;p&%^1hFumFq2<`WnEByWvGPbqgYW18XN$T}XvM9B9T$@bd}_{CHC4Dv z`~jc`20#Dukg6AWz%GJ)$hL72#*^76Y{Y1UwyriNxoDTV3-hQB*=Qa)-gTT|iWtl| ztnTKERdY_;b_1ncQm}%in$%KqAaLkQ4^}Y~tN2RT+yt)M6lxaGhcX!ZZG=TskGQHB zO&AAEA?!h_R!m^o~qiJT$5leO0!uyMs6qesVcXsi@Vqw|J%C*Ak z71YrrOchpDJwZKAgdls#vehen0**54)@v?cLiKz2k(aDmzjA5S8m)Lm)w-(6VI#6Y z_0_e)`c>=K;%u{Q^{NpkFa=mqxj|T4wN8LZbY=CbigiNe`YK`FYB;b_o0^yX7IIeu zVdr1~Xu7Iu*}Cf0Ft3h!v8M>s9ZA|ShSEn^mcombt}K)v31476r9;FOs- z(eSOY^ALlzd-bRSSgc6jUp}e;wiEU*y;#?j4to|+{))XM9=0uqXjKmMa|Z?d?(gT` zs1^}-u521GL!x7o2Mh|~$43dd2pIHzJ>DCK^H<}Y;La4yug1HKI;Ix#Y-}79(hmnr zfb${N1~v?=vC!`d86W{tup8)6J_lAp>;Sejl-2jE9fTYJj2VdKzkYf%OiaLDr&H$l z<2?1G0T!?e!4x}fecJ#zQnikjO~7vVx9|+~McdQZ#Vt*rt1k!6Um8=r9j8Syfpi&? zU&8Kk7}ThHL#G_+)$DY(B>4eBqph9f7}xb7o34%#=4Ugw^*E!j()#=6zcwFoUp{GU zfb}YlePMxk8hfHc)W4`xLVdq)CKD2{SD_taMpW~~blzTP9f(Zr<-c8NjcRR`lZG;v z2%CXAw=qxDp`9~IgpWET;E>WR9qZ@nuLIkf4s>6MJAY~1V`sr#WWpYCj5i*!IELf} z)v;0Q-)JbgKIS;eIm2Vl_@`q&e<_t=-}s}-)z@C!M9dAO{`@6lu0xvvu&IqcUZ!KW z+%Wb(sW*-tW8qyQ#$KPN&H2O-5sr5(1dgpOY&Wk1R-7p!)6Hu%@Myoa^*bozTZr;j zFF}N~rbA+-zW*NG=N*(Lal)@xgM?~abpG_5KTrL`ZLDXO*X^m(tS~g+IEy%VFDK1a zXWeG;1cEx*y~5(55+oQHY0GHzJ>@+faOoL*)(X}WQcHPi>!UEJj>(8z<3OY>%1&W$ z62U0&JX+yfva)*J$|b%vtJlRCa><&i$JbXQykrTi7BI>#TMviFMnnZ{sDk|hd>->f zzkJb0c3kw6>lFS~ABPhUA*Y9V;tSjflJS0>7tg(W2xGaPKK1Uek+!yQ^xpCv*CBn} zNBx*bQ5Kt5+q)M5hbyi55n_A7tgU7ZVj*C;irsxNmhvs`74S9K46xRoj&k_>CT#uG ze)I)oCW3GYwfy$Jc#0z=dEJ{C7zuNvwEO(3GPjpu&V7thup@KG-4IJP@q%V zk1#g1rB_R3g(J`Skfs1)_4sK_8DE|*qFF?8*W;^fg|co=_^N00Ut`s z7TByD@h@LgKoRN<6!F(yeUsAqSJa_)+t<}JcrJ04RM^9m{$NXansCf1YJFsfALD)4 zP1#IuMp2yCt?s_}>EN>giaRPnTaU!}#D_6Z%LWTNuepJLbhA>tY0G$T!Lr!-n$kVB zGn#Owq3{1lXV3LgI(r6XBkS`t`gjg$`dxrAa}YZx)`(f6GswR2P}X_X*~lt(SRzv; z(Chj_ahCYFSEo!@+nR-T+2fn?aQ(lVskhW21n*oa}V_|(Q zfV6OXXTcgvJvMZXBlDPqd92X-j4nyN|NN!I<@GpI)WTQp2L?aL#1mv1w3P-v1YqjoM9npmB&=N z{|3+oe!r5m@}Rg2o_yBEbOo6iSPNFUbI3r9QX#%jvJrSFiGGAVEd_fbe0STpt|DUY zaxs>TWcPi+bd?u;>85?SDI1-dRcZYS`&&`*-%d^g|IyX@u%EyuT93Y_O`k^3bhty5 z@te=p(zX{addklsHUU&_e6(o%%iC1g#eTExBAIhut!&f(=8r1hw(X*a8Mim>=b*7~ z#W0{Rg^#*er+i0Ei0yUSe&HXUi&eDzJVvRJ$+vtKq247uzD8od3%6Tv)_{LJHyruS z{^rP?W97&c=49j+BHto5W};pd$4!W5Bw{BrYcIst1ZWF0T3Et&7Lh3(;X+ZT!9m?( z+=+&y9N2cFUc)MvqZF?n508aX_vh*}0k&%^Q!DO4{1DYLm^VJLvdWf0d^-Z3IL4kh zj8$@sbh&itYKn7lHttGw+X`LQe{XJUZi1dcp1T_~8QY^-M1oKaBMEzS5!Ek9O_1y= z47&Xn)6H0g$A_N6D#WymuTJLS#u{A(2CMKXXthmShw0=-dVr5v8+Q<8F`i+S9oQ>O zH>9^9Z3P|O({lcjp?Jr|8N-r|DP@%>qW83>YI0dEOfMe`yF@@#^Kw69L^YSOLpndt zDpiQSv4vG&UcEC_R)Kk37S}LOu}+>J!TarqN0|Yu#{H;o*6@BYoGa?=G?&6D0M@Aw zzv+gteH&vtjP%WGF-4ox0pu&NVkC4s6Zc+JaGp{5k-e2wGGL=nT4!VI|9l^36>~JU zk5{732yUYIZpQu?&zI0!e5`;Q0ye#D?y6x))(OPa^F<+eP(D|^ftuz6-2*IL_c7iv z-UZbDYcVkBsPCRA1fJWW~**4BUQ9tAfV5 z4Vvb`XK{8tf-_x07_*rL&V2}64JoVN0IhS(Vy&MChhkdmzoV~zMqefH3EzP}DXr0O zmRv!-o9Fl~ZI0)V|F742!Vq2Szo8C|vq`{6EhPalelM$B!1xRjd2&XGatnEmQ_2Um zm8jAEY{$h0P&$p0q8MR^E`x`NMr*stZY!0kxV34gWmg6%o(DAeN(uOW|Mn&tnL(qm zEU*my1kqTTh_K3Xn8X~3K|DjYoaguFJsv)z;(o%Exl)1HSaQGIqB6dC@z2?JiLVPM zteHyV5G!7@TAJQ!M$|ghXiA16(bi0Ora7_z@l{V`(;FxWd24Z3DL#)zBQi?r*QwJ| z|DO6)>ef_ceBPsoMoh}{OUZfjrIb7_{OE;r*g>-L9+vu{Eq%Ao;YT!1{SMqXBZ9%U zL$#0{YCOLKF`hJrsj*J4#p!U$z99>hxVY*6hoczfTuynWe+zu;4pFY%3>yjNG57h< zuQXd9H)`u+iM*Z2kqgvgV94E9M`QC2l(^upd@1@RtjYo7$y2DI#d9>)MI*t1PdfxZ z>-acKxGARZ8|WoIf0L)WaV_*OHO z6GM^JgPYZP^{;n4c46@a!5@!^yySBR2mBSD&`Vp&`Y**YjkHvDlB&s z98ZV6!TsuNGEta$;d%6OxZ9XyJmC#CZaEMXwq6W+wk8NuFR+uw;f!}F{Z7?bKPzb8 zx;?mb>nB0xK#nrLmpMS{m;KcKQyQ-@6nS{ii2Ik@n%{AEoQ%z+`ul}4g^b;J(t&Q) zk|0wko#{D!+k0r6-B|ZI{j^n?NZWl4k9dkbUuI#2n=P9$r$k38Y>X2m2S!WdiGI>& z+xeLFAneM)K~^+<`@QCUb&cMk2x!}O=LP1V7Z8v2@7uw=L3Rrw9otZZAKbS?5aaCG ziZqnmL7{xV@4aRUhhjak|3XK(!kH1h?q?>!&toym7t=2-b_EwezO&lQ_`&j`cicT^ z1@MQ?ex}3g=O(cZ5*{;2$$UFIr*Erzr%D>hEpJ-wz}20qp`N=$z2AoSsWyu|Quk=DD>PCkQyW9y;OsALg5WFr zQt)RxN+iKiEZH3_V#k}pE_~yND8b$^#xTxtApBnQV^)GznaYg5>2lsiOWtI}oSSe< z*>;X~@Z>Z{rTzPlN8uVGG7H6p{KbeWA&UZS<^d z!U*T}riB=PdgytabsoTzW83Uu5c&BUb}#C^(Tk~Cz3-0J^P!%vb&IDW_-b$$qArMS zD1vW@$z|4>E&GDUx0n$PMU*XQ@1qez@Ooz)d;K;xT6DKf&9tW&~o;vX$|$ zub35k0ma0>7T~~Eu!$%PTEy^3ageF(!FUndj+iAuoh2@_B#y0wk6i@ab^)Vb-Ok zh&^DGr#1VDu5=*s_en0hr@>maw2SnRxme-#^2Qf-j zp4=Ln=9?s0gOR6OW0Y-xu43@V=qE$@byNWT*lwWftsechZQF{rO|!MBt^nnVKG+Js z#@EbZT$Q2hj^0djTRhyhNg9T~Kuy@Ga$}JOBde03Z2U$G+DFm0Jgv>A|Dw&3f7&Kl zYZKDi&~?w!I6Xrt{fF9(YLRQKZA&Gc!JgszBQu!xjoNeup!{t~8uVJN_BXjULm3DA z#6RcSTeenhjd4MYYx^QU97@r+;9%d{CaT%-UFT}^nJ{q%l;3DP(k**rwGBT9)wku*@E<}WQL zlj`sduxvASZhQfSjr%UX;b$`aN9kO35_C+T)L1tV$s2Tq?0(z7eFAQ|XHfVz#!(s8 z%Z+uKy}NuMVr_j+ok!+|phL}VtYc`bc0JBsxPikw|BNj7$77$J>`24Dm!bT@v{2!nW85I2Aa@+!q z72iqC+-Wb{OB-anWEh z%lM8B z;%R)fF!b9UWcMbFg4R489WRq^E4#I>Ce~A6q^E@L1cnEW&kd31$7&jRtk3^cpR#hd zMXx0M=9P|dfZ14gNG;+Mb6;J7aXRVULtSS9gVUES7H|JWN18BI&Jc>^>4ICf3NAX+ zdQlbxBHPh^WX>5%=-7mt(tkhZK-#`@A1K8_cU92J^T+aUs`L9}Q*KIse(V;cx$ZeQ zOB_;X3;XKW+%dvnWU#liV-juk^uHa;RO%recS?64ziFjy1@kMi z>#kXwE{-L?*lFK+!e;0$CD3~Zayq_+8ljbk)cAV)&O^9WdLnlcu)sUtRFeh$F0OkK zN$5_s7!E@E48_AX#5MvieqAmH+Ac-ZpI=3+BIx!%2bxy8tW8zdzNGSf>hNB%#8~%b_AtE7P!A%_Adk{O?pS8*?u2%w5O(ENC>8Dz?qB#l z`Z86x-EvdiQ2;n<4&vSfWJXC$yQ$Ok8zGRPtj7H=;-7n@6dt-`y^QFovVfx=?Drtf zhdra|JlkIP+_LSpZMO>_VpkA+h$$T;0zJR3s9I84wE>}+OO{t{6sp$>Gh?p@zAZXLLJAG>7a;PL;&z?^EpE_Tq!weQ211DR8MklG5(F{UXt zs&nS%VxNdcRso_9u`e+n3(1Av1Pf_QCf~Tn_Vxd>(a}A2>hK;Ljg)Gm`@h3F^)F%J z3u)SZ9gQFc0yF*Q-tf*pZMk{d_+k7Q(W<*cMJy1#|B<0o!6GoC^QqAJRNQmSz!weM zvJbeKGcO=bezvb}GU9>eg9E<<+q&AyiijE)h|S%{^uS7}JKk;Je&Ny;mRV0X8}fS2 z@~uh>nUE_o6My$GvFo)6N2Bx%^l`*JlD1~0l~Tog>xpJl{?{iLThBJ@Cto@l6%^12 z)yvAS^vx&7%B;KG{bvKs8H%}=9LrMHAflsR^8#imKWzQxol8nvZhu{dsi+C(C;FA= zfr4?f(N@36b8QGV9JoZ;@CX{k-`20A;et> z;~Hw+d|1C{d_!ME>|1n%-ijUv7)yHT8{qI14s#2=?fg!d!JTBItq$H97{KFn?B?KaK-S#IiX>OUmYm<@4_^SXfp*2Un5jeXn@I z!kGwDU%e9dP48GlgDU8+=C7DCdlPQpGIMd)wz1J$*VF)SNuoGz(xOm4zIL|=Yx~FE z8Cb1E!Wfx$d};TTE*JM>b2H^w>4G6sNGGP^OCWmkcvb*+bqP-?`909&0{ABKK$W}_ z)ul_u$z~~GvQf&1_koW203t3x%{vqD^;F|zgJgpCm4Fj@E~Rz6bvaD~Sy1-~*Zk+YXf@O9wQJZh8mzwirb0oft$+5W(%Rg6Lf=qSa`GQJ@); z=7cf#uN^L{E3?V1JMT+(Wz!P0Vn{u0u@ohnn)5{FK!4=7QI|Er7HGElB#fD^&HUnm zq9yLxPH@-VKvnCjY1~VFkx!y?ic?PiEOh?Tc!Xb5e=)0krn*A!AZ8ex`ru)F8+W4>F?SN5`v~S= zDbEOA?l3pRzDF=uqu;M6zk$n}+@&W=i_1>aZ++)Vb3=FG=KVnAmcHwJF7zD^nfBzX zdj3t^Im(BI8nA9@w%}Xg_8cSVHD7h4lbkKhaSeIth#@r9T<89{416(eyp2LU-P=g{ zpAgUsGZlBk-O2c3oi5CY+f@et>kw@;_4)?beoe-DO8vhIGgA#xvalW0?+|0YF-z`r zeC^AyCqvoPf3?F4-lsU**;Ff-HzZp=S<}QvU7)^f!-<~Ym+-v|&_EU-QnR!?urf9r0 zE_6HW`K=oLSnp-RMfV`;go`GMFbP410vZ$%Z9Sb>?TJ-uCO{7;NP@Q2 zp4x8$cn%af-L$p=(%KzDn4L_L`TyQM0cm^A_y3;f%kyN6hG@-^#amndgDENwN};Ve8^-US*Bn=nwzmNhy{VN(R7G29ZqP`K2(7a$ zZA2)p=lwI;8kG>luI_8=ZT?;JmQ=$%?(2tz%iAc^n{tICItW@qwmqXpNi60oSXf1MO(V(>zLa zV-ZS?KFu=dI_X(jhduUmjb{Ar`uBB>hF?c6G#a5)j6seFqTdIlFsLEoLV)H-l-q+h zp&;sg956<*Sf?THbB`(KbGkkhuZQPYde@brFYRqauRW~zuyhc8DTGZTGRI6asbQ4H z&Y`-)ZOy2;2z%l}CD%f=gSw3@ijG})P@;Ez{oXJZ>nR_5gAeV@#@J+awf5>jJHI3( zE6-u+(6x4GSD@YC4sbPvO3Q%O?$$hwcTu~kebUukVArbEwB8l|8-5b}Rq5bd>cDf}guFMV|F z!{oO<^eE52^BB*6@i@;Dm@)O!u@DkQZ!Yzdu}L24C%j+robbOOpI#l_hTc^gTX^}w zHRH5?t{%!pKjHZvbZv}ieU*bh2^lr5ZeDe(#L2mIL=WBSmDT6Ft)t%}{hR<~jmLlA zoiTbPy_z`6AU zFRt9)7~1|xqjiGyh{4&oUhh1%p5Mqn;oTll3j}Uc=MzTUt1ss2VB=CAJV<=8J{;+_ zar$X`WOv|u^v+-V^JKGVQ+AISVKFy2(tI|hDQT{bs^yMd>bG;e7aI_J0AH_QQ;0O1 z1xh#SxruSwb0i&|&;mEq7ARjF^j@09Mbta3SSz&+wVNEBxY~uQi?pkooSW-AC)~HB zK>5|dBqE`47o?)!A4TuNh0w8Pp=6O(lGEz^x{mkI9%-O#7NRe z$U&R(%@L!|>ugiYbDGs}a}^guLW35|6oijc;|Da}=Kpnc-1tQ|I&Kv-ZdL=vj43M* zGiBLfj2HT51lmyQ*#qc{a^U$kort^(8ZKh$le4BidFvwJC4Q#rtjIVto;lxDP4vtC zIU+ZC;l)h7X^^{e19p49haWqsYO%d`&GGhX`={-ES?_69YL^W?h8#x~?tNrI10A2k zQUAzq>3nroqgypUvH(Zp>gRCOul_BL{OU*TS)2db{*qTdp%aXt_oy3nEVlblw{A-O z#CMzlpgax4rw(Pq3QbQGLVW!XfwfQ1WK)vxVMv>c70l(TCAZyg&kJT1f3!|ttXrR3 z=UvZlKh_x9=&Plfl$yJie=2Ldu52UbUz<9feG)R`4jTKvuRD9R?#&x3QGerlwmpm$ zb+vBK#*m%Pg9lh~I-(WpoqKH*e_dhadMcQqC&Y~5pMYoLPq!e84`N_@Io*riznmr6 zx=MnbKFoz6xxwGE4O~!X$fh(Ob?@iuxS&O5@R69Q>gEe-j_1xW>#5+Yi}D%>iOzl4 zrffKBbu?hTb&jq#=FF}(2sXtwlr;|#dxs)g6rbnPy^GUZAOpeXAuqGQo&#EO-E;;Ki98yqD!CdX1vY^?Qs)Rg^3llo&MAq5q&z=#(HhWTVdT8 zJ8`yMKYm=#&DwP)1b~NWv3cx^pF+8*9qsrEhSFGkLi+hvZ6->6z znf;3st~xLHN21DiJ37~)Z#*O;HGg7--5NHB^mu2tV#M+=Vq@qW>&S9-9c`?5B15}& zY+bsO2Tk&>_hKILJNV7s9p252+Z#7`ZtvWjIa)_1>PW3UYK1w*yYIAB+sD^`+D=)b z%w_QtyS8zm?9o;_*M~7jj1G!dHsjcTRFC7Oqa}_^XW9dV<@_lycP<_+b!1)l{SR8H z-ye0N>=#F8I9cyl&icTu&O$^UT7teH%{%(-w@0bw|3JC42hwLyO~26YJa*KE>qn2~ z<9PU}4#z`Bo!4qfzpfUSBj>tye{$4|vOhkWj$`Dg0ms*lrs4SNQ4YtKk7nSw`zXH= zPtNgA%(b_v1@631=f+*2j*AYv_tS{vh`No4{{NTC?GBay7kGX+mSB8JFg`k!yWN2C zaUV{`Z$3=#BLicZg^~KY#)|DZp=5l@VWOeB`po&w@LW9?*3GOo%3Zw-%0|M}dy9L#GwVtA051o3~g>e2>j)zO;!%Mn^{)4-eP zHtIly3f!RQ?vFNp^u*@vn>QcZer$6x{*w9d1}dxi|vKMY$sEV)Adeoa7%D}-A6%vZLy`Y)>1nt5VidTyDeg~F)ELMKGSm% zjWB`J;{>ucvmU)8quAgy`^f5SQ+}GzhYV3}(zC&cst;}TW8GHRlpKt6HumZukb*Md zIiV{yIP}=zUrZQ6O+jh_^dE5&JTquzCXi2=XhNxliot4AHYGSQ%V`N3oO6T5xi7#Q zjH&#M5tZ|Q95mFXdT3Mr`!Mw{c!2C{K+Y)UAGr8vj!86I)+gi;F9@|mLYABlu2F~M zHJ;H3uN_3W%c0U*cb&gBPbSVWvsx%ux`}U0uMSP@!C6GGRELWG+`R*_+DsUXuf?vI zjJJ=#7y8IQ@{lLNM_%JI*VU|j1Oy%O7jToV=LHz~lU%>&>r#6@ay0aKjk+GuxY!;I z9&g{K?fS}ThIkKl6uX;2*E8FInjZNoNIU<}LUgRQe--+)eV6wu?CmCPZ})PPb#Spg zj5_!!S59O>vnXJ9{|R6!$#RvVJ1B52{W99C7>m-mxc0ZhBr7>Umg&)8tmw*^Ida&+tV2$`N6eLHQG~9KDew{En&^&j`p|2zKyo>=2PQtO613Yp|` zC*o5-B%ea^MGr4a`Dq((ckj1LyVWl|`BC>_%;7oXrSa1J0dNGGA2&nXNH)A`46#t4 z0Y35`zdj%RbJqli@4I+E>Fzo+6WEFB3Di9yRQ1K$KWldPoFp#QjMT8 z<#j9UGhvbSxmI^Ayl4|LWbQNfT`TOIWd3F9MA))VdsWU|rNS>moi$z_FB`SGtf=eF5$mj6d^0Oa z-d&)^UmIC67`~h)y9@Zw8fZOFQ{yj=6aaBYU$x0z4sGYA%gf)3w12NVdp|hnpXy#o z#up}2Sw{3O!*PoB;lQ1G0^nXTi)j4IvEL@*vqowj@m{j7$*Br^t*0rL-DAo)xmNR3 zq_}5Ji;9G|7j$n7ScTh`^Q~?(Nh+RNUq$_J+Z|y~tc&dK$fo0lA5gsS>bEq*HKMn6{ z^8uUk3+zp1te)}1HCh=?D`Qg*CD03|)5?B?vfd?kE~%)zeG~+A!D0ktE?6)dct{Hu z+_|*USFvEu>?+dgZooM4*d?jX-XU45Q>WDl-$2h!Rlmrf)%gmLO(`~WB?7koIfzHY zn7OJ5s>70H<=Wau%(K;knm-=$Yc;2OD@ZyAMMG1M>DeAhrtn?D9w$8AcU-lX@~?N(*%WDe{H1J?>JX0tnoN%)+fyrF!zlWzv2AJF}bB>f+^n6?_PvuS>sP z`3K4JkTWp%p=E*ZKV)_|p72~+Q}YI7ZN1~%69$LlNgh6EVxIMgjCd`-k$4F!FzF1U z><}b1-ajNr2EQPQ{tHsNFFeN~F`)sY=9J9UIV+qRGEUg)lp57LkW8;Z{XPqh&Y$}o zJfFco#ei7k`#qZg3F2_|6b>=2Z(gyB$0+akh!L1t=4#`e@z-9t*4s z07Ckyz+(@mjQeZXFS}~EM+{lbV+j9+osH&;CsW6M@dL=5%B;h@^4N#W7o4+B%PGh- zWFn$3)K7|e{N4;cX2$N6qAscH8K^g}9;HnCbxss8e)SyWpO7(>`u`c^8A zgK)tCP<36orH?=6Dic<&Sp!rmyevpZ8jlc?LUU5BhoEx^U7PJ!=Roj44$5^%0`SAE z_}##A(Od8qQchHmJm7lin+LTR;6r$QP09G(!>()iW~udW)atTEJ4V~mYjgQ(TSgz} z;IXb2Tj?lSnUusz4P1M_#7p@`c`1@l(&w8*m-O+fba|3=V^o%G(K5uxZ3B--Gy0Q( zSt6U(+f|13`^hr!BBMA@H_RuTtnV`crD+F5bFc=lh1COTY}!?SPrPG_1^>FdSTS!Np-@-cIdAstMgK3i zf$r1jX2JrJjQ=X3FG`Q4`_kTqO-f)=naCv5DncI=qIVOA#}TE^S3TJty8xQre~k}l zZky#CUoC-4DjlTVh7D)7j#qv>IBs5Mt3#@qVN-?^4(W)>SPRy*LxOgQHDHAb(pl)# zJnDBRo`pWM0+jeH?FZ`j@I4#f>7G2?a|-tyQODrycg(8csI0^D(mbQykDnI?MHeK8 zG*)a=pJkt}0(WXMR|--AXbZUCsHce5*kWdbeDDr(MYJFS&nX?hkiplS*Ykoj4Yapf z6(rMgnmbIIAs!2OfXC*LT;UefC`hpj8Mz%7vU0ETKDug)6a!`+PdI6!RpZNO&l`+; zle~B?OgnNyO?hJ1K(2v@gqk(?To@QY65rFn`D%y)W6UAXSAP9cm#=;tzzf$P6No)e zfhN$i<{}Q7lL#?|mDz!X@*8kawiu7+?pjuZo}`6=hhjZ>0h({A^FmfJlTKdXbD8u} zzzV#zt2BQmGSH@IaEi`8bdAmi4+!&~Ys(ZTNt~FwcmJagL^GPryWUkx7Fk|+SDofI zxAs07nUjSW@Nx4>q?1v@ByNv!62AwLPq0+$@^XFfOk5PetZ57g7`>|YH=<0q!Uo*l&`AL!{|(6z}`i z0~Vr-K(O~*vU>*OKT0x(;O9ae$l^(F$L3&{^d2?-2aFhDd07vbwDRT{T~EZkld0UYq6tZg>qUVf7glYRwEpv(A7oA=;(e|p?owx2 z9Z^Hi$Bg!!km#gowX)#8cqc(Ybx zDk}ho)q|+1lPxJu-eCa~4!%y=iTwC6NXEQh284N&}a= z@)yE0EH#AghNoGm278W#RWOr7oD6r`5Xz7R33{vXnM(rbIeUpIlFIg)!IvoAg4BQ< zBzG;rx?Mr*`>mfap8EHTyO}13z!!0Z^Hp72qulNHOFxioTK~A}Y7Oa<$_K$G@pZ*g zj%`Btr-d)H7lz{TBh)JgTArG-BsjXpIiCl75KE1LNaz%tw9Rf7EkJIss{5grkLB3n z-89cqYXll)8s~h5IFHn`K7`Rq{id}aFsJ&0amx*)#*NlTPB<3s>`OP>t0zML`Qu)* zk?%Dd^zimEAS#whQ=cV+Z@ z8YJS2-R4rW{7?b;Suy4H;b3_B1d78w;=O$03#@_;;7$`p#9;i$;dK}r9)TQ95_loj))T|)_ANmiRXqML zBk}3%biA}0kvb)85cqCC*~%t8w8agdUVSKn7zSY$QxYR`0}%P3lP^&%kHC_I{~Y|^ zn&uF5(W{4tvZM0O@(`y?1ILV~-kR(tQ#}}q9+V%NRdu!Xi|S$T?~p^DXrYD&H>W{- zm9j>`?;7JgV9=sVKOHfOrO|Ij3zQ}Boy(RV(Z-aJ;$0g!7k_$>y2^TbpAI{~9`zB{ zwr?Wbdw(Lu_4^zfGRlHbpif)RNOCsK44MVR)x*y(=3|7^%E zKRZr{JX;_LTU{HP)LU5=-n_5530_!C@HhPw{(cT<`3IqgXUZ+uT@N8&$73z}KFvCO67ODvGwFa@WHg^hl;)RLF+Y5YTIfA8pwNsvfc{!bDey zO*|jc#;{>G`T)BJ%M>%P0&f_&C))5_3u1;dz-grTf9SzJM42OxEB8R+NR6trE4ebs{&B!Sbj0rVr)b}E$)sm-ut zmsZYOcqg=Hf8PtNR|R}tiTinQsYXzk9RtvPJV$uS4?q9o=W3qYaeg}@Vqfxv8Ir$2IG!F12mh1K&$WE z+2Ym1r+P4M1~tCibt}e@>PXq*fQbZ8yoS|f{*KjxpJw5`_$OV_Y3OEIEc6`F?62$X zM-FGID?ZQ=zFO}W;2Kl)hEVS=RS;16-@OTz@h!x)?o8Zw7TC}hnb7a-~)b^nP4lBse<=y!{ za+bQImSUus!S%i9$5&m0kg_R#J@NI$E5zYEoo!30}8r^zBbw+?|jW;`fK=TA#2zmZ6y%S_sBlXO6 za{G0e)vyI^!ut&)!_K=ZLv$JOl@|p8<{GPtL9n<<5>e{nLe!peDQ3lX6Gs(!nMw!E0jm2w<}+}D_^c@ zV#@PFoS=s^mzt+FP1H^j_HT!1c4KZqY8{Nvg)~7jFYy4NyOq{D-Q;cXnWQXWX5fR4 zjS*64HZUOaAV<07$6PnW)*{ARcCCmdfD6AUJQDvwf^+8`w+HA>It2{fd2ovYcJ~g2DGHf!58ILWZ}r{ zYDNpIpj|P8a#lbxMts5o+{?n>w zXT-ZYMs4`f#^tV&_>w_oUmm;wZUSc5nxXH>kA-Jw_bgT63v0eZyKkx1?>6t;u6%gh zOvPN*4@5TMysWI=08ZIB<(95;xxwo`VbaE&cE|?UQ)dF3!TFrL6Euqd@$<`eIzgkl z)it0_`Jj$tLYeS|U~-A<1BF_aAPQyIC{&R~p#+UWIhnQCFiLaEhtuRH^|s(RtrZ%_%xTx}w!Hm)8V^>DMB?Kw8;J&@CFjDt96Fm7FTt zKN|5#yGc51lJIt`3Hv|sr&arE!Zn}Nn3n-@*_S_qqJ&4{b((}pcxw*qCp2H)0S_5% zWBi0x#*biM;Cid{ylZinU%Dsi54T3g!MBui<^Zt*{whQM@ZRVonG=MyFJWF=T)M9F z*zbVtjafQ!WF|Pl9~23papJ$Wf7vaB+YmwW6vm8!4&faf zL4H~*VY#jZp@tI5x6#kPd|~IKQU>isSRwwfyDHS~4>^ES%bfrp5(3YAq#V6QE_-Cq z$wVIdGMqo2#1=Gw$WgKQIseYFpegp@a!^>pW5oJcxC?QIzgL^vGsNmTqljI1(Jo|{ z_lbvk^Rk~oel>VMm^oxwHUg#Agj~#rdULZ)h!M$0p7k-v$b6`GZ1!W&I`58To_hlQ zp2n#6)6wG_{C+8;IU*qwD!B1Ghgze&gEAK0Hx!D}=XrSFti=AoEZ|5Z@H5804gdCt zYlA1s;1|xJJX3N9bJ{?CpU=X4|9SFj{M396Kh?(k8j7k3_^F1s^eE#|DQ3rWSAKX-eGdtdzaH6f>_xOZUh||s3qE>Xg3Et&RRdgHV z`SMbEmRv0tU~a#u`mArNbIC)R5P^{4j&HpX{vPJe2ZNl9`$Ah(Z;(cB=RQku`cH3_ zo%O=DH@E#UykZ-B33z6D!k9if^h$Rm{3Udcg{xp3l`q}j~pIf?F)PDb3?>mG^5Y@YI9u@I4B;w zIY>zU9ArGYK5}3J_=R=U4+luzY8Z&WGR%S2>oQ{g9>t` zT&4A}GvNte#U5)uqn``=4*b_S_;Qh+dopqorp7H9e+eZhYgGss+^Jt}_?4tO!h^^X zjXwg8c+wvg)T+lh$Lvs3=vN`8>g-HGHc)Mx;OB!e(0FWE{|A7g0|eFBxt(bk%Zg!1 z<0IZ5AYOYQ{>G@ab0GdDtewP@jgHB>x}{gqGl(bCL=9n7;L#G^62G&x?X~%@Enp?H z{=--7Q@_q4KYRIA9{#NVrkB4lCyr<`0GrTuy(Q0Ozb?!@5dhV^&z=;Ar za2~t*6!he`4A3*Lz$)H!dH#F4*5UYLBj1wgvv~wj9Z$h-?Ygn+e0UhK(f90oNv(jr zP!Abo40LeCT?I1sDo@Ex$@tsDtxxizw4-OoTRV0lr_apJ#xo9C{AX_W-lIj)C zhgq@Vx^G-@9!exsYOfr7!m+MY91&y0JJGsI%~crT*C1Enx;o7XG7_%I{Cy%XMt@YsgRg%*GJ*(m5W$kGOoofU)QmR6mg6iIHp2&7R=``b= zb3iN2-ke)Z+60G&<5s8!HSe0cHB8p)+D25;T4bw)vj$u> zMpIL2P*JqkHjAY0v|Hw-R^+?cO*Wf5&~sx zbYJV-sYg#<8>B1%M4t!Z?1Ry^fim>JPea1y8HpcH>Y)WA-eAKZ!*1$8uC;;qIY^TO zaTh$QgB}aM{}AXdsXgqj1^??VHo6xPo~r>iqNJNm#yc|Yg4_@mS7{^kAm;hhF77P{ zc*mvKAGue!V%;FSWbv|Ij&aBi!^`9kLeZrB?`ZcJ+S<|nfRm875(!*&bhM8k|Ak(B zz;Px1*TK>tG=bI{|3TC%GU3E6Vn| z5jRBfz74QNRRWj^cp5^L21r4PM4^Dji%Nl!Y3LXl4*tXg=G*hd6Bqbm%1D4n3OvJb zA|uN075uurdd<%5gFWS~dl}!+PCZ`yfd_fnSRMX>{Xp^=?SYV1{02z6BXMuS9QFIH zM}#`E(08;OTz!ybz?XnWp}vMc00$S%fdB1eP%+@39rqOJ z1J_$3j6uwnzG!2t1f%o4L1+eq3}vz!@h9#Hbo>i;zE+mJij}9&#<25pa&cn_SL(frzl7Kj-+lnu5S__-#&6Rb< zN`|g7sC%XuND#X9#~QJN3c6x1Y6t%>@H>|GE#Ud4!ikMF{3fq5k>{WMgXHxW2O6d2 zeMNkuAN`jzwZ*x~b1t?=`NatZ%R@eWVX zvc3hn;wJwVhoWQt;FY)!D+?>nz&9grVwm+da(j^PiaQMqGnp4>R#`2$wU30DyFkvlJ45d1klD-e#YZWAzNtj-EhBNO-?4r?YNSrvVDB9>Ndby{b* z#Vhe&!lLg{1T3g4@h_00mUwc;{6;1)mgiwS{tqFOxv#OVrmu=`4CX6;g091=({y8V zcC_t66op2q%F%w}dp;nbs-=qzy&1-hU2OV>SnDbV*?(HVe(0Tm`I~Io+8B*O06S)` zauT|lM`EubE}Xd@?jjGFkm@zDG@WHV7Ea%r z&0DL!jlN4N-Q!WLY$rZjS2aBI8g|>7zBxcW&1c_%f3U&znwrb_6CTCGI9b4PC%%*1 zEQwa7W0+cL371#-`_gk-LKY!i`2*xuR?nP*lFd3M2(@y(L&V%+a;?8!Kui8w@}G5q zf1oz0me+=W8 z()VWKiKdAC@nmwRn%#W0f5FlIxkmf<8hl2PHl`jL4>Qf zsD)^bWMf7lu0^9}6NU{%H-MV;$Ky%tQh3IW;Z}d7J?ThS=8w2)-jOo)U68m#N)$PA zE*KsrT)`%Sbq))cHwER8uu(u;!V@x{e*?>R%e7?zS*q!ScFvy;Jhg~FHEW1-HDJ}K zpb1!|SfOFyuS^q#r#z`aJdbVt&4n5Yhx>|}-rtzXE<yIOHCUy+ zPs(=!z0uRiW<~3M7BC+o@2ciDtbgcVk*^)(k&vSa(`+g$1`DNAGc72yPj>S6H!MT|jfg;j4t-SZei@AdOUyOE}V0GE8`mMN|`DUdnZOKT;q&zqx`1g$ND$nB6xfk!h-yXzh^}2Up zZZUV0g1u)0%Wx~fY&msq#yQ=kbI`1$`>vJ^qAbUP!92=Hv))s5tUY(H?gyTt&UT>0 z0hit*j!`}vU?uag7y7Utyn{7Q{Lq!SqGD#u5X5|?47iq759Y=}+FQu;+gYqbG`bmc z;udJ|X9v>+At(ShG-B_M|8mqDbBxk*h_M=`WBE$mhqm&3Wd>s9C}+eN?Cu!{Uj=Wi zr`h+-v+8%6@s8CQKqD;i{AJ%sHD(2tB)st4JexGN@Tnf2%R1pIr0Wqx7F(*?6TMfs zgt51!hjFyK^Rj0=KJg|lvaDC!Rr>y)JZ%mM0k+X&EIhee-5O%03zbq!j=Wn93vU%v z+xZ075KRnTvLteI?t#zcw@1=c17mWbOlTNAXU51v;69NHkU!?b!0Jdxd>7UJR)M*y zp`EVYrrklMFP&kNuEZbGGO>?554jU#NHlY=risyZ)>+v9)l5QLbiWw21z5oCw*@=_ zLD}SS;f(sppL`K{IvA)!7*9gG{w-Q$yV5}QVFmB(*l8{#on8#z^OgLgWD^GtX6#D5 z5INAXOTzjUQUBXRvu<8x45QV8IoF|{^w6GvB|he0@CemK@nD~9oFC}xJGxXRy+RZ@@`606rFBlohLac#9$>u(_bN&dA+}Qo0pt&*~db?P5 zr}_r-E$@UEe)yqIHJ_sy(~nqQ+Sk`T1$v}Mu4e3$z`OVGjxkCCb3=doeRcjm#$$iw z?*kuj4t88BpPFOd(K(i{q(d4qV}`8^dPe8iZcQIWe9YsRlYY#x6d#ibK4vKX9_A!u z30OO4MBbIM`IZBy$ofQ$MhFGHAXq z8#3-SSvhFm88|WYy#l`-g)do-!ymig&HW`j?_w9KtiON_;BVdZe#a=`52%l1-@ht> zR1WBi7HE6+gdvhZ(v?3CMEqENtSFkUG!M#tUQSnT7!+zEQtQ5RQraO$VB0>(2kRjp zSPc^%>Z{-&Az0z)i`{$+WCcmv&83j*8KN+*_2)IJbS3I@pAX6sSFg>K2^^#k345m@ z@s{N8E8^brL!!Zd1AgbYhT2?cn`jJjMzxX;;BH5tRpSO)ao>eO30yyeWcask%uO~f z7D4Xrbmgyu=cJ0L89wabp=0TYnUy6xM?whDuir+j0nNaCuy}Wo2B#eH@k+OvKUBQH3gF=0VSj+~lqpyRnxadVKA$;edYKxS%15!?ouaYR} zlhGFG8{#h2DXgBsE1P)i8o9^X1CW{ul#f)s+{oy>KYjw-N~b2P?SO3#=y=q-fI*z$ zXMtw;MtSRBFzO(uWoWu6{;AwiN$pB^*{GzJ8fU{0NouYD7_&e$Z`% z2b4kh_wEt0IsAwP#sY8H96cAHyzV2wwRKuQHCZ5SS72U-xQbemG#!e7vrPHwnGopI ze(l7s4PnRSO*IW6$U1fbQV^BVqja-cVy(c;4&jsN@V_H7bHfhEf?PvWXWx9Tx~Ovt z=Em^Xyxu>{g5SO-3%Uzej>>|ys;tR^{qPKg75>OoS@0})J>p$E;kQ2l`)OKK4ge1u zGkRn*N%p^2FNZoz;O|YI*xY*LONRVEx7HDut7!!0)>hQ>PKRRpho1jqk7cQ|J{0Dl zb!d?wM_beCan9M4aIyg-d}aubH87U>R|(mt1^c5?;V(dPj9 zr2e74My?Z*=?mQ-Nk6DRV=~8pHIzfRQ6cd3@WF+yi^D&--8mSgIZYBYHm}}a#3r3> zFPYGc9ZWYJKH8J`(iMWQ5|O;a@{>3+Xwye(p7Hk?xSI7s-O9er&^08gLE@V&H1w22!_~brwkBQk_Q%*^s`uWQ20aMRb zYX{>U`O1F`OEt~W^Yz5LlazkGHX?C59`5^o4%Y;oh3dFb>iZScD7sjIoTC3NQd`kn zSB@&&80edwYY9@u=1biXX(l3$of9AGGjd!oBHb&lcK64ZV7K}b2((T zT#Hrjj}N_1`~>Nw$qG+7mOWBNxkdRRNgn%BUBr9&6ceN%{GX~D)LV5a9+JFrCsRJP zJug6ezEI)PzZ*?Mb`P7&sNo};x_;Wrv$-xE#z?cH{HQ;EXix{9wr+rTP46O^7HygS zOKoGeeX!}d^Az0xeIs;5&m-K9hqU*I@el%diry}U*t@LF+~k?aEmj_S0lvf>{Grl%IrKK| z)cdeD8c%(IR&~H)`};mm_Jxr79Q&zorMo|VuhxGX`d{AV@R`5ECU>az%Kt=0vXTid z(W3l0DFy2GO_vm@)qAC@WqZzEujt29v~2co!ZR>GD8fu|6+Gz6Ojh&Usy=g0&9k^> zeWY(QIIo#j$0i+Q=-D}rCtEh@d*M8fr)zmK8_$-R?2k_#EEn71<{tld;TRrk--K6k&AX-xN1cRjExwLp@dJA-R!>cei$sgo?XrM{Ye;(0!=j?9r za{RwX;PLVb{Ngcd)g%8CFN_^^Vy2jIai>zXF1&p2nlY&L2g8o=xCN2Ag%@+m-9ZLj zYPzZQy0!x|Gf*l#oK;NAV>+1wXGPKh$x{YrzEbs1vH{^?Ok*^+ z)Jj%D_{$;jKkJG`JLE@NKX2913W|E!=^5gh!m;g*Pq7<#Xz&OxOVie`0j|=nZv$Hu z87qdkVp?bHhI3z-NAFLqKl{kvuRj;Gy6WbXC9EG-x47y~ z^%Fj|M%~D3G3Gc2eg0+-=VKQ2SkOv%At>!SPPztYN0+Yg7{Ax+3bIMq7G&^xmuOWFN;nh0a?Kot43tr~Ea! z!l4h%ubdsCw(^y`VKWmM#|(3KAqNa(5Y`;bQ{MOhJR2JTtt9!As}4h327L(DkO6dU zw$4!9r81`zcockPC(cr1Nb8H}-k(SNY^a7^`;6Yj&XRxccXYe(Pxa8a>F^tOra`?0 zS8o}mllj$ST-@(W0xwU5UCk(%(dsvF#UKoH&%>u4(V;8xsRNq#%lPDlzjkAl0b>H* zE5Q9}gU{HX&aQAqF72{5CoU;I+)sVR*g-E~isdPMl0&=%J$W*&d`O?j?gYI-hPVQH zDb}8kec3R7i+Y=Gg-}%~;Cp;{i|WyV|3ROv2QDK+L57dAic}ZT-p>WoyV88)l-Q7Y zR2Q%fx&Y!pwrH_xm*angj^}!rpLl~TaHd=xD>3#M(ugyto=v+Wt-OVo%hyc63VSxO zRn;{gtkcOe3Rl>lL#D_!@4)F>_l3r{df8c*NN6G^te&}|N2(CrRhQ#04!sEs5z2Y@ zWxE+?R{6uapJ7$qAX2%RTDi;d&`|66t7VKVB(mu}*xAT7{*QEou*Bh24NJdgAth_Qz?WC1ufzw?{uNo;W89Q`lltBrq$&Lio9xpg?%z|a@4dt@M-tCCvEq6| zIPXqy!o=z~)K+G3eu5~xdAN2Y(WLJ2>wEK=1)06f!kf#QfL4%nSd?!L`fCKpD<+u} z-s@)Y-mxgJ4hS`Sqy9iRDlB&deoa~f{@37xXA>_x0WoXC7R5RwFH7wTCU`N8j?+!< z(UGFL%gQXV^g63rq;X&10;c8w1?_VDNmy@b{&SG0N%IOVIPzeCKiop!pqs9&tSnwJ z0Lkroi8m#RqCsfA=2mW)=4)Ygn>L1ynN?+vxXw%zz8nSiZH*KLJ@SKIA z1JH)wgQJ1Hq29$%0-txok6y1#7%2#IWgIxa;1Ogg6ZWh3v6s@pXH3_3SucAQa$S1h zc{KtJG*pP)w~93V4D%vgZuXjwTd%v8BbcjT^s$`^h1xxZdqbatr#{w~KFJ18E?7KD zc##L%SsLhg8ggM8Lnipuj{`R-59)DNh_f?;F3jWAuptMJOaWaF9!Rf74JB6b4z*-a z9_iM|PY#~#FR9P4q>HS@!6O2Yz866TPw7KxtsoY4LHa_jlyY1cuz&cl*VM2^li_5C z37%lcR+i2RUwWpa%Pd2O1 zSd(RrF4E!M9GzL$tSYP(`fNNmRy+^Nc^p>1oY<}~Cy;#RnXxN0!I87JQOyiJ3(vTg zcI;*XE7l{+8nyo0Gbzm>wNJF3;_mjsT9ly|E+-d7+?uSO}1C<-(FYWO%T)!dkdfhkcf7#byZ1XhYN=wjR2W-x| zMbRzl9`}Cqqg36Uyj>;t$5hF1Q!}Yx|rl$qkktLTm1Zw#59< zZ2j@ImG>9;dXNKE{$+pYn`ivIU|ani1^)aRxaRo;vEa2MZ3P#L2v&VyS42|IZit1@3%2WrjV!HoPa#&u;Of1A|wjV3PjCZj{h3cCbTR@(hsqT z4T!QdT0c{>{N;gi_h+z?e+Hkm&(uQyXYdlUf_kL($Ay>wux4gUe|$^wztn@A%m1=^ zm~+9t+GM@3k13m&tF}DQu=*FEUmZANpLck$Q+=Rv4$1)`(422Bxv7Be0e*+__DJZWiF5cb$JZr{%3h7)WDj^i5i$m}Y=#XUXtmzze&7iWgYeou zMB|6Ct8DAx&6saX&Z_o~$@N$V{)LzK)W1?;11)4d1`cSsTr|<&yRH459>@U+L+=~v z7y-5|mLn7G^!H^L356SPWpk*oO)Ht9l^g?_JVrQV|=b6mZ{F{P#%bJMl{^{}bOD3Bi!ep&N+ zX!6>hhL<%`S$wahk{_#?h-ACVTC>iHI7sxTLa(ejh)<0kQv79;z<_r^J4{GbFz5fs z=FPGw-T|OkX?plMw#|@Dn3>QhMe$|z5*w%7JlrUb^EIot<+XTqXPO6YtEBl2{sQ0m zFPaBDmE0sMiTlzbUL)c&xU{Y6CC@#0H@_W_+s7%kVc$iOD+@+?Ec^<`3*gC`F>b4Z ztwA64@<*w?(0afdZU}$hJN8uNwx(@A_U4{ic-go76>rw5RZ)K1t6s|~%M|m8jxh1n z`r{tE4{xq9n>(9J-e33+LHou$oOoh`A5w9?76+ z&eC+hP2MXt`>~rTvBC1Ft-iykKly^%$$8*Kpp)s0{0SQIIbIT^N9}vPhS;eM%*3C( zr#@tqPqwRHu|E<&IX`9sLcSxT;O`6w6b%)he^*VliGt>^NWTYW)`3q_<{PyV% zHzN8Od?fgjOlZVamq_TY+rx9i_rva~ySyLIm-$6TcsHK-H#nM((|bzWwy5$RJaNNy zPfQvTHhC{JMu)IQx(7bLU=-gMf2p!at7^o*8UL1uq1To^6?tpvxy)<}Jym^2CFE^H zW^l^P!C)F7n=d(wRt%+>XAJ(X9n;V?y`QY-huDj zU9dveVr*EtavMB1X|?E-$B$@{loc5cy)ry1BVV0YSH1LTE~#B9zr-{pb6DO$nq+w$ z<%P71`eOZSc}jz-52j>V$he1iW{%xabE1Amv{>=zPSoZ~jnFa$=Tzcb96S{~km}A} z(0{iE`c~2;3)qBrM zYv{GYTZ*3OKVj_#`lh-EoV?k^o$#Q8CmacErD|?1*(M(|+*^QoOB|Fuz9=f_6zVX2> zL{VAk9dN>CP_mtfY<;L}Ec{6`dy83LeA}=a`$0A{!7sBd@R>S+wQV=aM)WsB2_`rR zSKuW=(aM><<2VoA`lMvAp6cvKBmb_Kp?O2}AiEvf2FD`E{wZG(hPWlaPh6y$CjLT| ztrhS#`O?as+M=Fk|8>F6k!Q%O;FXEH+N)yM?rY%23geW)LGbCtAzNiH)5?r}H8<+H zbl+mDj8eiea9;crbIfz)JI;`;Vzi7&zFn@k^i^&nU16wMcv*cEQc10Y^)PEW@Ce$} zYS8=zjJ!(7zd4Ec-dDk+!+Mq*)NE*D_X0I5p%YyJozsdwleeXL24X)7D(ax`;3|Uf z-n2sB0Zl%#rf9Y)t_c>Lm(VXO*?2nf1j+c9Ba~-mirCqH4_58=Bsi+tq?5s~n{ya| zZe7rxJ;A3QZe%Ru(4xDb6Pa6Jr}vNb?~tjF;i!$x`_>;ns8^RCCoLDCL&MS zb&xT)#i)p55vTob}Ld^+hfS{aX{hHQ}5Wtjf`0S5)6C^VpAtWc-sP#oO-U z(3U`T@s2#@;z8nx;T?|XOAF*Xo7fi*A+knW&vU*xFCCJw(D6g{`5acZyz7-P=j`m8 zGp1l8-@~R%DJwgE;{wE=n7*q{MqY20?TEFAKUBY0vGih79ryY4iGOYX(wOu4Z;G;~ zr6ICduVm7n*^GZ2&6y0dbT&eI4+U$Cu^B__B$y z#p2qha>SsNtNaLf5%;K*-Knh4d*^5w%I4%LhJ*LkR~rqVFNT)iFY1(M5??~!a|h0T zGW7fI9qMzAdsTrgs|%?+fs>1~g4bQ2wd1b%}Px`0IaG59}RXXy^s|8~%-ygw`*0v`pZ zBp)LmT9R@0t0rse+{E&41P@Y7bI~XeVgp7Aw0FW`uK03yO7{bu%F^ZQ)~qJQ3XLE2 z)sULKlL~;|G(($@HeW8VyOWq}&#=2yF8gEkHLecyzJ+6mxuxg7Y0!rG`YuHHF|iC^ z2J$Ky9M-h#8A7V9vrsr)5`Cgs;eg>%T!ujn#uGzYd)Z^6PRNu zc;T_itH}fKEc4jk#8J@pK0)&|mBHJ-q`sFU!`j5b`?L=jq)aGVW#|=*+~n%0MNX^x z)F`7i=AioY!l~{pYLuh5y=Y|bA@qgoFlEOg^&KVyA`*!9TpB=$+RraM#(C^S!+wFY zmvE2ygA@lap-Xsryvxw_lG-uK8+35O)54lWJU>wvbxTqd_|NsnD_=0NF8H~@*FD~4 z25zF@&+zMI@>(U2;_kt|_`eTpb(pe0N8dE6Wa@$Ul9GprAD|lG4Xe;&>y>c_H5 z9z3Os2Tm5eYH}4Ha_w<0OH2q)Snyq}A(GS6OvaQ4NJ9kk{PDpla!cJdSa-R}rS)y< zTU@J`>{L9WaIOH42=dCZY`mT6144MT28;?9n?B*M?XWP`KMboSvZIhcb`HD)!YvY& zO2S6Ngx_H9(OetV=`9_FDcAT7BVvBE`3l^4i}uZk&ugIATG_<5`5Edk|sxg9Cjnd%f=tn(CU8is{wILSu{n|lmSiIOkE42 z!pt}m9P~xU8Jl9~6%}n2N0`Nb!ZPCE{5?A36s*f>0dug4i4&iS0<(|bnb-qW`fs#324sTW*ISXb){nvko|9RgQDKID)~ ziLV)rQ3ItzuAGs+oEexMH8vPv5ea+k@@?pgTdj+*M35yJPr^0;oPE3e37#BzZa$u? z%s!W|o=-b1S$)$o+8M6^t&(^*_%qPmDEgI#!QK<-z>~U|e&t8I6lmqEr4DX4V&PF2|6|4po{4XWM?S`!T zp%Uak0r9yEp9UZm>3a&9UcRKyjH_H+&FDj^>?qnZIY2GCR>>_m2;`0+Ja6w}>Ut7Y z>Ngh=J@T{rzQ6uP=pWHO8Xb&HML|FW4bwSGFg^<*-7h?|c4<|>fp43J#$S1zc7E7= zvH5~Z}utlO>mie1je0h z$DLNii&gd5pq86c=d{Zv%!7^T7|}%gWGTa)~_gFACyA`uD=+Mh?rJ(jG^qb%>M04){K37^opP)6_`tKqxZ{>Gkz zwiW^@VC1ZeM=hc|9CDbDDZA?23c5?Rw~x?=k@=xaw-$`S{{L2Pr#%E#JeaBp~7m-H~H?B=^lO4&T$#SZwRCmuKG0cxA0jz4)W98#Yo`84M`|oZ@LC@Er z68iXh)JD2sX!Ks*?0Ui;_Ta{P1D7x(H65W2MEw4{(D%?eEu5H61oXq9MC0ou?V>8S2qs z6Kin-w@fGZ^naV>;qwEwoCR(9b(;3vF1IQoTF)nWw^2oX4DUZ*i%uNCD?nm-x{nv* zZ8~|T@|9W+X$>B4eK;`T*G57vYnU0m=kXHpH$6F=_uKpZB$e9sc6sn-Xon zx-cKFe1s4%^oQ#li)#|y8)1nk5$z-c{`x8S8*%bPu5O~Wa_wPi?`E9&_ok|2q$M(U zvneiDB_zNC)|-wELk5B@XJsS{MG>`=2Z=5}Ix}_yqAKr&#-I`J`RXudEfz?3&ES^d z|DnofGI@XUKUXvf&LxgPz7CS$xIi<>a3qZh4poNx%%3CSxvUJwLxwwG=Opj9FDz{? z@@AjJ8G%@WV~B?c-f{8)iX}il;Q#EkY*K>E2{aSJ=|K5hM~SZ|Q$F7hz9K z#mSYE1R6bZy?!Bhi(Ah|7aIQ&hlR*2@uHT;Qoud#?+o`ogx9*S=EGAS@%kcf_ooq7 zY5DuBC;^&v|Du{Y|5ilVkTuvMzpiW?-_UL5#vZOJ9(jTd@V&5u_5j!IAN0n&nng7i zBVtC102iOdyE(|t_jL>9l#vZE#d?A=zw9yNk{+YHcSoBVX25&B6l zFsx@JnKVrzi>UxQF=uZDDC`SoAM|FbDUKr)eqQ0@7b)Dt7o%TCoeyyEkgr_re4rCE zSikzHQY^fuVzAVAg|9PapK>*IOkux^w_Bt zZ1Yc<*r3kOrP$1i;GC!+rjPdKL~U;dZHOyt-OITz!kmyzOWEJv$0Pb>em}47@qfZz z#syXcu11^(Vp@mT-lxHXcNiVV3^+-43_ve~NU?JG9JIu^QaY95o|dSt-*EQI@P4eQ z+9*ZBnHzMlKJ99Qu2_Bm(t@JK4-B^p2*Jo#k%B>2#82C{DVwk+pxsOI@;rr;IE)i^ z{ykWA&c{yXv*+6OItck^H_8}R%OHBqmG!3gXC^P7mk>ayNZufTQZ-`ap&lAxblBk4ssApAvR!kNr%8YLwvniJzD zTR(!Why6LW5f=AYbVt#_Xl)E=C{5;O!i&_bPXBueLg1a#CTH$Eq5W!{F57X&Ut`KW zMv=6eaP1=PZUzXokcV~hhlnesc4_Ct;M^wA=bURxa8ASmZtRVlhiVhpwbxP{xeru; z$zLOGeDEQL->!s?OG)yrBfo+A&1LfSuvjTIKt738)KP|M&@OLrg@6_M>Cg_WfGVs2 zj63uo%0@Tl`cYuUO-kj1ChE`b2=}IkfgGlX)LbA>91bV+XCGb7!9qw}>u`ErzZ0_;IN zwdlknHBGN7<2)Pjcf99a{GH&@ZLlY{gUhV5G_A2q;QO-W<$3n)0|6-!#4SS{CcPoI)b_3 zKs2gMjK*;$efWk8XA{YHG$zi7ui+&c6M>kS_of|Mx0=E$(CHU}ng3z?Fcx0sR zrwWHshRvRyjOg62ZaXbOI$6llJUd{Af^0&@)~wg6UTQ8P!UDw8plfNHME){DeW#}&qbW%=uQ8t?+?m4<}IPqa^z|(k==6zCQXon_q8I1niFH*IIf~=nLGGEagyvY z!TYGKC3Otea9G4St|!V;%Gc2Jjfd56H7uWg#6w$IF?a;kNBAK%R{B0$ZBnt?w5J3} z$rGtXIMto_TqCg3$;fNY%kKX90gQ?0@4cB@gn5mETRWkS>qt!VcVpXpZfviqi>hPm z&W`QS5D&gb8{40y_NikVIXqt-TQ>b3jH*dKozb(q5n)d9-pHuNF{l>mvx4YQw}7$*N1Z#Y&5t{* zmQFj9qZtZ?kmI|dY(j`i@gO$3}(QWLj$&T(#7+ocu z0=?7bNSm{7y2vM5I|GS#(R>mG+NI^=uuIFmhSEIjnu!D0GmCi8z?Hz);Sl#_K^#;Q z2QMW=sAw@Jb&gI@-*xa}(0p|+&Ym#^fePA-?$;uV6}NXZ;=;50tim9v`@f$DT0LJe z1AF^^&W%=X%TndnBKn>OIo~boD_u!%$@@V4&V@dRGAi2Szx8v0%i&pRK}JOF4gVZBx8X@8>e<-vP6NN%j2(Qz;9t8aniiZr*4=A;e>{&a6{|fa zx>W83!Wy17_gCY@F2{)tY(F+JWs;8!^K2Bne^}}H-amQph_*x)-&2V)-%-GEKzmA_ z;T;_HXBB9blAfIH4_`q#Z92PXoawyLX!X`}w7M2G{~4a?;1kO)km4(Bkn5NjznvuF zVW7&iM#R0I#wImt!Cqb>QQT(~9v(K?Jrut^l<)_tCiDPjSgh}XN1f(l&xeC6goIu) zl^Z3KEDr^5=K@sP>wOy4zLu*+8xLgZ+Xz1-&n;4EHMOl`Q30X~sBP=Dwv~;MPNHo~ z(YBMfE0Jt_%5o7WKhhp)@TA(FeU2W?CuODZ_g<&g^hCBMQ`zYedhOH3e+-R36q@e6 z8&^)*TfFv($UCQ*& zrl|Eaavt>PX04tk9`(c`&~YTKWnZ5+=jWZ1i;%^l;`zk(K3>?~r}G>v%D8hs-rlEY z+xrY+i{Ee}=GT2J%sy0%&wtn}M2W8`k@l?g0v#g<+`*PU=G?Q4cwMe39{Dt4p8euV za|2y@i(gz>+aNYBX{38G^@{EtY?uXYtG_pb6H`eWvn?GN`^;_dO4v~cj~7!VR-YMX z$ReBkHqct{gKW13Yf=X;Qj5o6(^j7Im%CJ4EWw9gwwa-yNPQYPwYLdT56;Fzdpk_V zloTnDGs=#=QUoYoTpV8Z#-n0mfqYh}-77W%fszXXU4qM{b9Y3OzyrPOl?1fJh$DRk z??C!AlfS?Wcy^4**{rOOBcG-m7&5ZLWNQpsKNC^bprviAzNL}y@s}Uxz{6&5t_ecLmXt$I`o~B9huF_gROpy(F_j8TErg2 zBUCf=T&fL=o{3^#{p{QtveSAkqcv0(9^oy@6%TkpL|4*(l`G+~3y#ABY34HWW%y5J zHY-)Rid)n*;{&(cecl=wukHcjr7FD8NKf)Yt{lkxw=ySRry2HsCwB^` zf=|6V8My(xTL%|4nvN15|K%{PR*LAqAG_jG^lz=Y2K1=;__@AReOGTd513WJE6I%L zcdmwhhc63AFFFXJ?<6#h-qbOi2FkKy=u!0@q2~Vt&O?RM1W6)a?$3A=@X=z`_)A`u z`N>Pm+){B_h4c*3Dr5TSOAgA4z{#D6-5xLHVm@yj1jS3X#456y+SYJO6n1~cl`>>& zzfR#Na_}_p1uL7mChgrh!?eF2P>&{;?{+!xJ7Z_} zhkMeq5DUYJ*Fl$s3|d$fHrd`c(uQJ{o=-p52GW01A5|Hd?CBN2-5Joc5q)y6%d+cq z`pW@3;=!l0iB~Ry6v9CoW#u`g1?bCvV1BAGa&HXB z6P}orcpHJV`6>9cEC~WfpNXr>q0bCPiC;y8XLh~QnKKP%ads}|nq$r@cY=FDkAoOF zSc?RC>+mPan&={oo*R3m2w4w0I5w%nWKGTrT#X&+4dlrHjfol0{&qDac=>c+u_VT5 zOt&iQ#SHMD)!p?Fq#>a(!OM3m-;Lpe?7K2ruw%dI8cwem)OhvjXjizM;^;{h5a74l zfmJaEt74X`z{$y<^%Lr^O-`Xa)4YrbsUG%|Caj85IB_}EJ$om#v!r_%>0e&J5(6f2 z6zD{g$i9Aq;)G9#0GS#Yh~Qm3B7@5hxv_u#1Z03IG1`ZsdOCRr7Q$yqtNk~qold=N z$`}duc9QiVa~mO-v(iy&6xI-8mLYFLE_Y%F{dr$^Ozs3F0$?dAgGMAiOQ6TMBc5-{5%l<{y-pxawyb0EBcWe}p(h8I*F*iYcvan`g$wK3E9YkBSz(45??+_)2KuNab}09(>QtO_qi?eY}r0|gnGYtlg6@CIVZ zRXX#>A@|>E!~9ACX)qn zhF-m9<-lf;jYHs8Btq4{pr4fkDFy9FW~K!ESc$sYJb4wJmnv+cj7m+A za;KCfty2n8g!MXZiXGW~^QTyowkczhMN{-ClQe0H1C99x`0MM1o&G66SAJm8$*!of z-upQai667cZwjdIU#~}%b>5G0hxBd7QJR4MyuS~8i<9-V>BzVGVSkw*`#{V>c<~K}$28 z$>!OAKs>{{0mKU)=R_t^MBJR!_ki~NzE6rdoBc(2R;W@|Uh(tdoG7l@XEBd*-$dJN zE*fk`3~w7*ARg#13ne7-sfi%Ftq!~I1tr4%(6?6T?B;Cd*_~rqw=K+UFDPpP&Cqe$ zYN3)^lone<;t$Xm8!K~;-}XgagXw6Chm$`UqB?BJ9)c5af>r z4Xx@veL~x(BWJ{jFM{STky*Htq^nA@?N@p?w^DYB4S@@gAM%0ZQKbcIuRnPM_D>v` zuf#pVd!wB0n}Nf@Dh?X6}boJinQFb&mB6JN9p2{fUa?-^(_-KzVO#_@!6ZM_|K6#5Zt}`# zQG@S2*nf2Lt$ppv0z?b#S#}J_Q|20fvK_HC?eIIGJxKPEW5}QQ-YLx6|SO1LA8^OwUP7q);whWMq=*{jMw zVQHylrC5XhVs7%76U0&82%H0=njKsTxPupl5SJgFB%xOL_K2MJS;D=CNaK-txq7ew z{q!PIhFX9gGETM*YQG*(%uyz<8lY0ZX-=AnS?AC@#kth7dQuaG3G-rV8$r?x!(Zo z#GL4>(2h1Wk^a{gToP&ul2urcr@uJ^?bQ?Kgbchb%I~4l9Y9H1ndGAaj;kDgHt;;L zm+Dd8Z~A9P15KLei6G~{S)uiJ;S(y}Zpm-+RS$XH9-y+d@N&LF{;-9bKWsVB1{dk} z@W_D0+;_tt7Li}z5IIOcgK1#px$nsO!%k#9i2pyT#$AkK(!;-lH>?B?SXd=-J(jgb z9)ovh7=LYSY8}dfZ4y23>P5_;X_K;PQ9SGOdO-DgJ)ru$Zi3IN=Ml08kWXrDO=KC( z=wSMKptx9nE5hTHEB*iFbGqHO(-Il+IUP#BgxC!$bHV4-iygnXzhEbGx?)Zcpl@f^N&{UZn)8{~$y zO~(AAO=j{s6jwtJfU|EVPA>+#GLRfWk5NKQL_Y7rBlI-sBgvk<)t{UE;XCN54|zD> z*7!^Tdy7`T9*650p02(za<0qT4fdqO6NqL=-0G8NxntIGmrRt8f5|5 zNua@n|AofqEIhM$wPjat`qH5su{!+UWh~?eEM@Xp;FgY@pCi6HRIWbYyi#pf1^k_W zz_Tt|6)+(eZh^dMxEd#r%&Hsc7xF%I!fHvLR8@gJJvvq(-!n{CJg)8<)}8@BjNBwT zryw^X7(93W_w)+n+ej~Jq~;GU6DF5|8O&+#-6Jf`6!-Ygt6RVH6m z!WhR_mDS*Wo7;Bdv&mm_go(IfIte=rXWnMUV}x>`r=WODcVI*#Ta0+j?Z^te_#SA2 z1)};i``_*-`Ec5)^g@c`+0sh8gCcos^~5`m4(w8vM{V^ys8Rsep{P*b85lu{B41W! z%sm!-#On|@#UI5!*-ZDyO0XH9?tpP;CjB)0bdW7!=o6)SmnkqYK{_ucZ|kFY+g-@9 zV@$;xDX+&rP8s2^9~q+iuPV2ISJ0)**%KCgB}yAkuTwUHw{fZ0_kr#ZS8RZeuY>pl zAy#u`Qhbyl$FsOe^|LkVjs+j1@4?NL^&Iq|7VtT5E5Vg|@--Hw%wyXS2e9?8inZl+ z1zC?ySvy(J)4Dgib=D=oCuL_}xn2KK5WMeY17ffek=8e{+KqV1<68N1_;pywn?|I& zUdL|y6+`B|RE~b9xtLCtr>iOMt+M_gYL9ImCw)kpR&*#Q+$(a<*t>M?yKQ@{=i{+jv39_xzyg$X0cLT z3A7F>>uCj0l#+%Lrp@mQ!*nKGQwy61Pu>e2#SYwU8?zO8V(jeGt8KF}jzNm&CS+)q zgPsa;(8=%5`?^88k9kLH8i9pO^F5T_lu0I>E6-r8Xr#;-ZzcpE<6N}Tc0CfWH_whQ zsjR1Y9YDT0SN*Pf>W}Bg*GVJmK>y6hs1Kyyflv7wp;DXmCd_&ivrzTiN+x-wUle;{ zOW=p|wCA0%Ma4@H+k8zx|B?yFY~P#t8RE+Eh>JB-H2Vx{aUIP(+Py&BwbC|w*D_b= zrNnmfSx>m@;WskDEMGEE71QtV{$NEQT1(}HEZvBh_h-(mdBqHz44P-+8>fbNp5{AD zo{D-7K83$&yasZ30px50H;3F~x{Z8Vzj=liwWInp?%0UC-t`CddTJq2zbze~lU7$&U|sMI+h7s%U; zt0-`fO6optK^giKtZDdG1YZK;R#-(f?pp9Y2j4fb5Mt#DDvOhc5=M!u9Fx>ZV-Pn| zRB202E)&3ytY-!8uao+ZnY$Zump=7n*BJL#c)L4EHJ6r=cf1R|3inkc=$bT0hx$P; z(I=%{%V(_N>Awz+$@=-uv)u@fK_)Uepp-}y+n_!1 z=HOUKi)+_BkC+qM3c*~f`3jeMaCT*IA_-PV>FZfFaO2F-lPLS0m>=R($e(pIv~xN! zPd)+(vXD+)aK~2g+oswAxo}7iemfAJ9j$~uxIW8i7s!ooh4)vX3=JDbdxs*8tazty z&{}7}8;JTB+mwLwo$OVulW)R3XxV1lD34CqTOePDbG!UpTZ+i@9$xOoQX9%S21~vN zV{;+K2DE`8XIW)#QVhFexhjXBQ`Z9R#a890-8`FS#Unk_r4 z13Ra4C4G{ybS!Fl4z*OH7M88Wf?7X}xF$Q8WYrtz^6W?zWE?9b;A%eR=z5!Wq zD1y5HeiG4ur@m=bWv~Sl#NF^Tskn+~7Z1*;Z&{UE1$+VdK^=T8 zbwEtxTJA{QA*bIMH|TyQ=Y5}lLHQl4;=@;H#86mFkm(Y5LDW-a^DPZ0+CeU(H z&`ki6+lV#0K)xHfqyM`#8-5a^KWb%R*7TkJcWoca0}6knconrXvM@ ziE%*kU@kMpA{S%v5PWxq7Ywv71dc6gix&6(N~RL4A(TlK7+i-qCq||{Qanhepl(Pp7b}v;7tQ_ z6PGsUH1)^+6kQv882{ghS*3R9_H&xrl?l#2Mcb8e&WF{%?aKJ7cE#1uu9S7c3%TjB zlTq9D9}T3}f?n+jFKMof9>qKmhWb&gP57e-OV*xREh4Id%i8KX5LLl-TSQ$eSyD0A zH6U{Gz2Ngl_P~h#kg!Oj+1B6jgVrxRvt@M&+W*8bH)*r74ehDsM6~u|PKrW$X9MXK z!x$kG`Hb^h+m(yZ>KRUw)CbaKXe&@e*pg;oh)n$7+6&KJ>{E7@+N*0db(^6t7-?@@gml4AQ1& zBWzUk$y^(i2k44Ll?M?YMsg?i>;Sc!%E+iOjw}=Lq0)_DJEeVkC zN(`CEtnx6tz{eqzBl)f7p=NJiAZ*20&53^Jx8pm{Z--7>(2AZ-N&$#i$p`eFGBwr8>CD z(1nVs*5A@?64iXmb6II7-3R`G=5u82kI4REmA}#l42a+x7s$aF{T};K<75mC1@gFl z!pbALzXNhVNzffO;umINT&O%6cSFElOIfFA++7&;8jN~T(uz^n&XUbasXFF?@I}fV zL{z`3TqblPu9}1Q>lN@1)yDi^`$oq6GL%i_Mgubu)k=O0lNOP7Y9ReBDDkLNYpfmk zR54&+c$(XlYjI^c9>%=|xY8f-;OZ(|@gJ3_+yyeyA;y0C%rDvDXD4bw8BHvK--(CUemAfxYQeeh7DhBwjhHE& z3B3n$$imyBgL7e4ysA`Y=xKwjGmw4^+Phb}Oych#@6k94?K$(A)9L|NFy-pk1%;b$ z*ZaTFyP%n@bJf&9yHMxQSAKJX&KQAd_%;;JGp-I+e^@+3uMo(WXJi;`lqJb8p*8s2 zvpPol@|zt=c4G}PWgoF4W@Ma57RM+ojWdx!5wyHNrxq=BJa<=tY=MoDVjwSsmx1@& zb-rrEv0gT)@o3aWpE@stbGKpt6JKbp$d~(uy^sZr$qN?{W*cmL!l!SLmyCKsR2W>- zfw=!d_?z@qL(#q36ND{AJor~#ZXgueoorh|8Dj%#odBDmz_Na~oZp=^I70!etPJ5j z@WPLi_TwXSG5pp<+7ZhG@0*!yvReABr%$xm6;lV39FpS;9rEff_(ErGF5z*H5CC<+ zf&%WH``;f?N$lrZSaS3?m?=Uc1t6Tzcg zbHO2&K%7RaViIk$iTlw|giV2jqHlq}r1!&9Y?)<%okeCM^<=npK#LyP*hUc|A0j^F zMw~&5i*E3(E?(2k_;H6H9v|%1Gkdqe`tyLdJBPj5!&$wEtO>#s=bQ8;h@<(9fL_#dzSd4av zd(j7=|9Q;&gg{*hS}5-8u@u;50~JN!kG}|9A10Zdgj9q+`JmGP#t&h*&8yi1Z=u$1 ze*vGWE1_%b*N3z?KLg}7l{Y;XKe+JBm*7o%(x>~+kMqk{!S9CO(w+!(|A=s%2wVFC?kS}d zba4@b_UGd#z}1Q-LTT_bh_&8 zjj&b#>*BU#LP@$dK${_eI{X69j>kLC;By>4pUQd|F!|Abow!N4p3~#+4V)K$Z-U}@ zlQNIn4ebEg_BSalO@#h1f)4?!7p|Yc|LxrTZ=;^zPrX9?r=-!pi`^~X$acfB%tH&G zFCWioC=<}8o#??t?x`&8p*61AkPPzYed;_KN3^R8&+w}!Vjc@H zkIp(eg~)3MvIf)DGx4TXMRx>&6n)bjxPwU5Bdc2IyY2{m_q>a~7(`E)o@TH?Q1l7k zK;QiEUc?>s+65l@Rz&BXubr(_xeyNL*0cYM%tB{qR+C<7kRR?t%yJa+A*3V1gD}=# zJi*NvWOQ%uX8Q!R|CK%?gPc3v}R_d6_S>+(tSWS zS`OL8A|?dTea$v0Ef@9~h0vs^^eXYasorehF>s;5d_Tj4*}B&MU282@ZVg<*N%Zx1GwTE8KxP zM}PX(;Y$M-qWynWSkxfD(f?mv?upnv=2Ma1LF-F-@g9RE_IFB7%Q59uu^zO97mRXv z@Hv&a*9FP%nKlQC2t{FOavphI(N%GXT z6#hUD;O(t(nbD5R(2lBeQoji;S&xVfDtkEni~nICY5i+cbYVKZ=GKe~ENVV`%41*g z*t^B<`kI=Xi~K!|J=aX4s!gC}Fsc=318vbQTc@yxUTFVE;9`_kE<%D$YrpOb}}jy5Js3g~?!XyBcQ z2u{`pwqVRXu*&mHFTI8OFQ@CETZ^+%-}8QvLs)#s9bybT@VuBb` z_`mMQOg6#8ZRDP7xT9?|tnuUB?C^NVj=$&3E<^A0wh&Hvi~`!vcD$!N&vE$sB1aiB z1|QO7A67=0bGS+Qz)iduxKMgGf5f8lzl1rGFPHbb6U!XC+g|p60}E0wq8;QeYrEyS z!^o9_9ReKK<$-H%*{C9&Tld#F4z-yozr~YQ@SBFhQKO41XED=!#KS=^at*u&2*D(( zJZj^d#CL8{F^g!eLWf;GHNaIE5rdg8f6-@7ta5y%A|C6fo;l)HVH{=1#&bGCcn;EHf!H8Ye!wSU2=N;uyxX;uw9;@P)qMbCO5Mf#NK*2 z7>s&*IUx=_lw9=;?SLdlF>_EQDD$%vmv-sFegD(`7ur>RyDT4=gc`T4Y1IVi|1;@V z)ppXk!pa~wj7MH+NJ-oYds)8Zj!dizfj<|M8Tc}7RqAvU$JB&R_$DFmNO=EN#b26I z%79As4q}bvf` z>zJ{YkR8!qli`?7?f{~^;6;vgRY#}sJEQ@t({-4}Ckw7*Wg?$1KdHbwK1Fuv4&>|1 zPcCy9ruLrDVI6P5FNUN^F3Sk}$bU_Zz{T3oFvlrAi_T=OzMxd+Dg+(3_5s=9qI`I4 zcpYD-pBWY-t%;?vqreEX)_o0K5(6KcTiX;m1jMYS5S@2TK@Rt{lQ&OA>YmE#q>dGfQ+bAVp~=1KmJZHQqNrZlbF z8L$|EUK-(!mN=Q@3zRHuRSG@tp0?_K9GhP=Vf>mE+}WoaHe3drf-9Du-l79a!AySr zH5OOo_R|}AS2((EDP@1*m)Z@ zakqihK?J zr{zb==z?`C;8)7_;j{_Yc#GpbTg;;reE|c?0+8-R;C>9~S|qe%9lOCJg(E9iW0P4# zw8cg&#!x7}#J$$}Amy)g-hT`TB_n8v$AHlz1&!!0wH^L|>shH6yLIqY==nmvn>kQI3Ql?>OpQGi=4xF+x(k=aP9cZ}$M%E6{>Fpv) z`{RIn?HG8-k5w&`tAu2{Ys*%)Ly z1c&cfR-y7^;H~8a`@GG}-IJuUuoirCSLg#Q$ zt-cVwo<9&=Nx3Lyf`$Z_DWTVTiV(BR=CIVXP^FrIPQj>ln665NFdFlZx!1zmuV8NK z%r#8pqw!#~mlz2nhScKB*?DU5l9IR0GuEUcOrCR-z&M&T%}N1ZrD8jr};7M%5y zQdrY>TpFl>zYI{ZhQ~^OfLC6JzA))oUpU`u;hYyLg2z@n)`iSqPjB!P&DL$j+Tlmu zxOkXG6k|whBE^d!oF_9)Kb&Wx6=Vyibw&GQ4EAsS%@aZKY`@H;j}GsNG{Nr}ExC3^ zU>2xbCVk8B)lvubay@oU+-I3wdns@#K2k37vRK)K4IWr=pd)&BKnj-CiS^_^vP8uM ztw;t#vsBNPDAotjIvpZ7I~#T?9Obj&nxXx0ulHGKKS7WW)3y2Rm@t*jo-)tookcFK zhcnO)v&1>ay0G(|Xxj}VZF>{G`+stob}>;-hx_%dwZw@-CJ((e(nmU{emDk{Yt;JU zn84PPQIi9j{!IFYVZx)}jWvjo^1y~-kl*VIEu)iScwr{(dyA-~7dYr%nZr&Bt~AJf zz>Lv@Q$h|`j5KjD8jr}8tA2K6gsn}O??s7BTFM}^b@?*KtH9Q#GUX;N!b3l&t2Cx4 zzSX~q0p+}Dl`vP+cCm^H3oZ$?1}g4_>|_xxGIh^o`fjgbv@*Sbb5|sFZu1e-8^IL^ zl<7=-BDe+mB+D4-#n|%LR{z-JDe_>`UWv@_Cw!q_RXEx;s;gj4{K53M4>o_T=u6d$Ot{zylkL=5rA#U7= zUkxcYym*!kn29&skLg4IS7vp27%lnqka@uY@H~3?>mjcP5-6s46L_3WN{vqA6ZqGt zJ`>9Hm$oQ1h5j!%pn3f1_M}qgoQJ<|E_VBO`BVt&;@Sn7^xYXDVF%BxY$RLW0VNzg zfLNjfN(BGcMK>wlDCgW2-mR2HdAVvhlWxL}>q6HIFHf`Y4ZIM^#hwyOj$JI-|aOi<*B*04}0Qe7&m_viAjb zI$)1}Ht;?&QF#+$qbET*sg@u%yDk)kr^0;>e)?zdqMiy}h|e5)7#hXXbz*1(Nzil` z(e5(Ge_KTq;x|}VPo$)fxb)~L17{9C1v!9L-DZ5kn8Ju(yK`655$usBq#p>6ej}2i#jBc_u~iDPWH!Guqq*)VU)W!%++SNk7@P^JH5; zn>IZes%HSgu>gB9ldeG4_$|;dkbImcU-pI#yqmqYvOZ6q22TgUCDak`wy)2>(0;5A?Jn8f#zLN@Z0a{y&Fa3)KB0#k zcs9k#Pj}&*T~1ypqDtd0O>xtNl-LO0N}vhn;=D4-i!+FARpTyrc~oB%GZNk}M}i6B z&&CY$)5Me*;t+u_9dRE_&KoR}c;v$vxd&;>X_c5-qMl?=)pK*YB8EU2K=Y`SNtll? zxOiQFEpJO`W!Y1NOH;s^EAxOm%gK7Z-fFe#^FNB%5={R40PF)!@O*d^@)a;|dHIhD zwN0Z_gYZRVjWLv6V6=+4vIDEmo0J-7Eo8=`W3K^|`C>#OGy~1X_jr!QxenR?IOm!c zWrn!Ty!7-#Hs_ipjirG@7HGM6ULNR!JOmuqiOG09Yl%NX*>Rpx=0hu16$oKXn+C#( z-#eTbdtN>a3ylXBA1|{dm~FK9q@G>x6gRj3x2{?weK@V zjQjWi(BG$geWEI1R=G)Vm?}Nz6Qh1AsJaB|i_mVK&qE^8bvLQyke)<;*LJ@yiJaM$ zr_lmI%?+ii>p=X|Q9IY&B6#6_tG#OjT{9;HJj3IExZSlt=X8MznH8}X5qFL}#4YH1 z+@Qy$nebj#LA1J+y|5IB)q|eBpbG|MO-8+~KumqOZk)s$hl)-F&W`wBuz&fRj6h%+D+2pa+@VYmueQ8%k1dfW1F2uKz~`(?i2d{! zy!WlZli|eolxU0U{|Fpa8uKgBr$xZnz`SMc{MZ|?sOJO4!swb8w#?h6l!=670jy-d zKWfDHy3%(}d+mIK8T;e^z;;Tsg7VgBbC?@30b>mMjndnZOA-2wQs(l0Tjx8I{w;jW z=vnPKb8Sw{5%5PJhHj%7xZXf*gp97M&5_^AVqnp8SD=02_R$MUu=j{#b)|;WPYx?U z-IAg?$SCRMKaE`tX~NL$=R4Z2hW7K*Xl10y-*a4wk&mo@`usdN#4OMCl zKz;|Mr1HIL`G{S?*=&`C%%VCvp|&H()%6Wm)qa(JVR(Msg4!IHP<7DrRXQ@9L8huY z+<$U-?t+Qp?A{jFCgl0rj&pCfGTu2*x?34n1ymX5Ze>E%c-L;&v!L-@y&IOR%jU82 z1Ij@>|K*}h%2$hgat?I-b%h5`%`^z|q2Ufh<>}9E0Xp@eVWZ@!ol$46&I!E}Y>siN zEa=lw*6k}5igxoscSLv|K3y*E)ttLWkykz){k{oVw>Bw7+!Z2t9elgunoN4`K=GC4 zAGzU^_4u%mu*%IDrHj7ZKRiR+t^A!|hQG)8yX6bmZslX1>}Nm5o0sWGBaN6H-rM`} zqTPxF8`ctVPM`7UHQFJf&N>~Brvo~O5_j_aOdrS7*b=Ysx3`)fUyQsaLOZpk2AehL*I_I#$!FM(I?}3-bJ

#@ZX1ZqOO$%n4e7A^`2NsZrD+ij8%LJ~{Ok8sE7L^tY-f^Ip@<>96SsD zg}74T80pTuy@o=fEEiw~HX~lY5?Rvb_f=!8^5k!nb^Am3UYGg2Yd20;tNg(5x^sJU z7w$lp2Hw?JDb*8-yuG5&-kMk>{FiXsqkV#*P_$iV#eawfLqYV%lk!b{) zS}`oZ2AlzIj`sT;!G|2nTfpu@F|Ovrpyx>LtBiyk85K8=>y{dVC~FR$^5WMhe$B(m znO#U){U|=cBcxiD&s@tye~k{_%XzY_koUtRPA8s8XE9zM(&qh6rk+2(aSI4RZM!l{ zH#Xn{UWyj8K1-JY?uI#GEiaO`W4#)XRl`(nm&iW!0i+vfq04jCU-aD_z*~p4n|VS$ z<*9;js5VGg7IV33WNA4LicafZs}p>F*>HL~{MU8zXq=DMd1lF4mM1~GeMOz4RF3MH z@}pVXl-Um;$E41g;jlw$Gs?56Z2DG^bquPWXWI&71 zW*7KSXqmS&e=i6yTJco&T%mW#FUmN7OhD&4qAaShCgOA7X(OzPGwFkPN~7cc-U=OM zb~yDmG@~fxR+RkDw~6ZL2D}OSz64p{DjDgYax3yAvf=2beQ|_2^Rb_w93sv3`>6G+bmai8oY_E( zIFp{GwfZ6ATj+cbw~t*gIU>M$CfFZc{d<0}dSZ>rO&!jv0(x8b{5AhP=cFiB&1S${PIxs2qu#<|} zJ+ZqVXcrL+MXWoWVGf!JPKZ8EKCmMAB9b-3n5SD&4sbVM8QO*s{WG!!SY7_!OSv=P z>1+~tCv3odKA;1~VnQ9`he$i(?OnZu{DDE^P|gTl4X9-m{GhB^C~H|?!Fgp-oZ>D7KNIj@|#|3lwCfo%F+-!9hrM)?%bH(x#VjUm=m>)Whs-~Qu!?U@gY2=#3q z+T&2$W6t(%q&>e=+hb7MGw!_h)KNL@+2?LipD~n<3m~(E98;gj zsY@tFVL9BuU(MjZDJJ?3+jA)QXOA{^U0EJ&9^TdV9*uG?-VdR-Iae~wsbG535^af?^~4cA$zP-hJG+vg3T~QZW9P~OshlRS5CjU1d zk3!}`M8~Ogr55qQXVPVAof>V_$#)J~=Rb)yZH0Y^kJLF_a*X%Ovw5amJVjr5_Qc+E zXM_&p`G3`sqj%{{Agmf7jY8K5WXe?T{Jrp^+^Z~Dbbx!_um6aX4Fj3ChUSIKaMy7F^x|>G|Lw zFl*%x`!ne&DmSgs0Fset4(QYI#>hW~z3G;q;(!pN4Tioqi7X((mM1 zD=_QqaSLME=5qKne>+a^x@iLy2JIA@H`MiWC;dJ*mGa5y!nE zWSAwYU4_v-oxT?((_Fw~{SWSRdZ}u!)#l)lSS|9K z+2P>17gRg{<6NNq<{l@^Uo-H}b3$I_;05!5hhhP~6urM*?SW4%fvJ0i&X;LdSpzTN zY@iqjIvvIa{B!ild8ShJgwRPjrV?C{rfgQB7zv{{z!^Lqk8vqaf=Ql4Jhmj(+MSxn z9k-X~0By!9=l9Ylwyo$YyQ9oF)*UGNc(*~=D{w4PmZ zxAibG&X>ipLqS_~@a<4}IXX>pfMenBovyw+74K@g58AWlI#4muyoRLC3BWIeh97vA zw4C~YU*DAlH*1RbD+(;Xz^_l8&kYNM4hw;~teRjM0>|#7C zLEaqc6P~|AGox4l6LK#8`O7hI`5s4c76ok@c-UUuloEAc%FwX?fml^S>REJSv}XMsZTL> zEuItFO|{6`?Cdx-)9HXuv8EHT$QPZb6IqDoh$prpyGk^e3ptB$ess_TD7fO22Ki~? zsY?y8%ZP|{xC?mtr28PBMhh}Z(3}`+ogr2V9g>Y=$Z~AoV84-^es#8Q>#{MH0`#(f zMX6#0F^1~SCfeb~EREzn$>ff+wF|5P=86SP*|XHYHFDloXOa?ipIQe`5Rm zM*QY^1b;aXD}7AiA!u_RyyeNo^E!Ofp$wy-bCO?RA>PfT{{Vay@=MWlMRCkW9a@{T ze>X0BaEgxb1vjJZB!_MT{UZIGcR}7-YX2(aez`MwFu+YWCC5x#m7Msoe%h5u!?cO1 zN@>hA8=_(L(@gj-r1a9*X^5qrmYXt4@#S8~Jo7WKNkw(i%)oTumcI#__3DrhPtC(q zwaKqY=g7R@KIWRV>+5vQV0?LW?+hs(f?k|a77moLHxk;l{5#vR_uEF71J6#wvqdO> zyjs4aRtI7o#h&th`!m<^F73BG^|!|6_#;h-pfDFtMBV}(eIUvE&kB?BzBH`|2F&~zcNy&aF2o9#r6!{0_@>^jRcqsqOb)nb z$2Y>)5iRH(5SLq}5nDf5#G+hhgKr&qt@zfk(5jN(wS99~T&j~Q!G#b$Jgr4Kd#cbz zT*F`C@m6RJ#4$is_5h2)`djWLvTckTjNq(P$21m6Jd5903-?N45a3DonI!iT#W^wg!+}$TTXx%~R#U+KtUmN)V9&a;3G915AFa`L zvZ$Z7^1v$;R@adC#nV+WKRa#?2=M;UTiolJ%V)`mf;_+so*eL{Hojse01 zo(q|b-wy5ZB-76E-4?dkr=Nc{aL{7?=2pyp){mtMmO-rjg}=Y@q1G1zd+K+>Ia+bQ!qT{b0 z%;^*3{M}uv|AJqrozymJSsUUl9`W&qsdb!$Z#no?z&oXe?oKY}?nI0m(Dhth)DR)f z3X?vNsv_g|y%;$JzWT+mt$5F)_rrIXV|z9wx^v7YLp(gAL-oA;>;97=_tIB3qBPi0 zee7h!vybd*|LVHAHX32r%UmgwSg8~N@)%}y6lRrtjb=ptln^nyRt6*+_|E{k8?(J| zo;Kf4DboaakDYF2!KiTN!3U=#cfu0H?G+_g#3dKNpJ{c3oBZ!o;l7t5Z1QJGl*|h= zP;U6MFq`uC)aCPwpxZ8rc9@PPU8ohm2vqZ5k?Uh8EaYq-C;Gl%V)FLwS^MuMd?sSz zqf1U-1w(pkj1V|N^}*n&P+YYK$AjYfPLq)I0aItmdQQHAE3dR1`A9iv|7U0?JZqfw zuK9brxeI`Ss%osD@<2Y<5?GM0V3Rz-d+{VpY$F~_TbG-};Ax)Qx^$;R-hAHNh*Rft6b4`GC%*1M2Udr9}x?_GuMAF)a40ycp?NkipCQ zGN=KAQwI5E5Uql)S3Wdgfc3#!*aY;+ZOHbF-F5^!Qq|*Q?bjFr=Cx0>T7f1rz2LT# z{zVZPTA{r`T<^2MvFbElcWggA<__r><9nH)bG3CZo;d#_W~w_z_L1s+`!RMvF=WGO z5%lEpBz;E)oqiMIdL`9oXHSSt;N?FL+$~%9%|*|`x`^C67e`HbJ%T0o*eA*&*l89C zq<=Jb`w)S31vIib$!gG@8*y4<3|cS-`pNK%w}Q84@>PR7V6)_0u<*C&u*W%(ej`Mw zIl~1sE*ptA;cA(D1UwnhN#Y?$w_>i%m47{GM%0$oN!(FF5y01I{86r~S9#4j*|VJ9 zG2` z=~+LXji1MNS@1mi2VRC`d#)kq@;5X!coA*Mt)?1C)}%AKCR;}i>d3=8SD+3mxj>%R z-vKXOE9|aj5!oi8%i)9|D9_7FK8=b^RP!&gW%y7A$ted`MPXx_!nVeCJ33FBfK7VY zVM}q*jK8)$RCKW^FF? z<`ZR6-*m_&x=~H0!h%sL{^X(F_r`KV3s*Z%b*HdPm=cF6L9-%*`J9~baiSRGR*=(PYAL=vAXz-Mc2~7FyiApEK|(7rVD7fo<_wX zVJFuJMU%LL3>Ke-Wre*vl{Er4U}Xllba zFXqtOOJf5oXc{I6cI;%hsWQXBW~5(#0z9hx8E#% zh*;m*;B7n`^zR2xvgm=!f>C4eIynm8!N6X%#TYpYu)?zPZJ_Wf^?95<9wtmf;z>^@ zpGC}q&KVn8FroMZDlH0|ruwFX@HctzMhkeO9VM7y-Q?o~D-qWOiBQeOwJ|GOQkVhQ zCB9hsEcAdXg)ev#J1S-BFyUV(ywQLngq{*sU2rwk&<7hY+Qe%k|5{qBb@bQ9osSc* zyfEs=Mn-+#$f)D2EgVv_PBBx_5wgP*N4Jk~^efTVU!kuKMx%f3zV{C4{ zxi}~6z{x1EXOoXXh8~%Rxd&E`Mf9W4Spj+}SAB+ZlP1MMA;yVRpWV639I;CrkYh;_ zeJ?2@^8uYx49kDd^~79TX>ZBN(d=&ECyMPJu_LmyCaX5 z?KfKCH>x{AHO1S_&|b)&DPOUOs${E&-=3;D&|Mq2yF&g;{=SvSgMo-;;(ikqRuhkr zPWiv^w;zqQ0gPpwy>CoLVy+HB3Nlxe{QRy1W@WG=Cy&mGEAymxQlH;J(l@QdTNUN} z*k#}Y&eoUvAN4=%Cx2ERoSqXv$LpE2-r~A|x?v&I4Fv|DO`^`qOC1q zRd*ZVZvN*&a4lb;NNH(~dxR3rk_nDO<&NJp~D?k@7`2XNM7ju;g&`zDYXXRwOig-xv zMEnYJ`P5J$a*H?zu2&_@pD6rQblq*Y=HXp-r&6jo3#ncQzFeM=bL% zIpx)C%Xo)8NX*i+s#SpcdyV>zNwwd8JgpI4mJDYGw|jNMN%{7Xb3tuf=$zXQ87U*L z%-RtrY3KB~zB9`=;*5J%AP74Id*G~*rUGEBcAS=6q0?zcDaf&S& zV|OEpv@u(b%(0`8vDOY0BVTqLz7^W@D+tr*>TI6i3O?7-5-Y~tQo9THrXvrlE5^YS zK#Mr}u%A@~BW70tc8;G%e8)ZPgI?sgVxHr_7hFrIHp(9n3WoP_!aw@;LK0(qEn4(C341pltM?#)|x;k>6IeBp@CDp3y^cGRLE~U#qAk1=8n9`u4Llc~IduyepwS zOn3xmm^iuFS8_e80Kfhrd*jC{Jv@;ln$OMGA+=Ru-d#wZSmV&KRhc+C7L(0}$U zw_j;2F9(OKh!+J|#|C#r$($i^^`1w@x{Mz{%7$%#2^GLB+Ox^6My+yE5PMx7@VjTg zm%?)ed9C6jeSaA9>PQ7%TK}$T(?85C!X;T!54Q_C|Q_9V!jx zDqO%B9g^>Z)K0#93ui&vVTQmX&JW!~@~RAt^Ze5rT6sLP;`LsPbBP(2{oRF4h1VTa z4iqM!!Qyk__rACCds93OiyF(!wP!zqt-I)5$Ru2w7n&E>O5eAbbVukrR${Ar-?$JL z{0``TP?aahUaCj5lf{%d!iBtu$>4(IS3+}p9rEQl;+Ez4O_UkV(SUq#@G{d0?>$Tw zRKnTixGiPv$m84C_O7Kp?0`j9XWyn`P-$h@u{QF7&%(jqGbjHU-XXzNtm3&QCFdJD4Rpp|4lG_cNFID36Te<2j;6jbaYG_UXN_3nA7{!?3bS55sm* zohZJ6b5ay|8Zwf!m#(zDd2~X|IpNnR7pDrv!4AUWI|!eL{5U=CO1*mmS0^b>PrsXRY@in^E>eR<= zPB&^iot!B)BEz*++MT9fbEs{defbvR0G((b>*%Hvrxym%L$Muu%xu>c+& z`;}*>dqVpW|4Wf~4m|l;vI~}ELXRmz50?#_K-mpZ{3`Hg`dSYvFF1X{1TuxS2d(g1 zD@Im{wQRJL6Lq3N6#TMW4htXYDO7(3IuZE_(3sC;9QK0?^ZQH&oDW!}WTlg3?C;?D z@cV=0ey(R*GaQ=%?U_Ii$alCsU_d+u$Y^|L}N`a5Yne*|m#cHk$LbINTjAjnM z1MOXrqP~5R-h=jzhJ>^Uh>CxLRDJ*m8GnNGegNng6w$w`jLyq8;c6E6bV|N{WZtOV z)P7pmTJ}Q9Xi?*_N^hnWlu5bB2tg*ik1*_MM{;3RU=LMF#K8!ngnXt$2AAQ`6E59R zLoIjciCV)40yrV9oNp;cQLo%wusk9nZ=IKkt1hfb$SFAAuu4BkYjmMymx5#hOF|Id zRo_;Us$M+?eKu8%MxU#K1vmw_O82D&w2QDd%M#>OMAXNFyMGIMMp1k`uz0PFtdg>$ zb&lXic#yf4&ZzSoj}!#U}v>bQ>h{CH_>O*M$hS19io)#FPaMLpwC&q(f( zb|?HStWs~1@|y7}ueWSqUH!LlY}JBAm}cX^V?1xC$;3j%>6%?Q!@JX9S5kI=%?wEmV|(s#EeK zxpAUSVA2~oo{f!Pg5Gzwu}Yfj&em`wzN&Ksn^3?Ql!7|evO2V|8+5CUTY99On12;Z zzZkPGETI0si70kjvD(Z)-v$lj5GTJ5n4#pwI~A09p^qddIH-ggm3|gjrRP*X1Hvqg z?6rdzi8$vDMnX8t=UvuA)z}q)_k_HXKVmwdrP8uh zczumZheRWktCZ#;n+#zd@-Cu7T8XY$i8^NFQ*|1rLgO$acPMIZ9$`!^aRGgNlKRAl zxi9-^1b&4$`jWWLuRnQhA>zO|0qv58DI+Ff+ynaqZ$E+EP`b}yn zzsdETZ!5Labx}L>)pov|+<|sFE^6l(a6C{byg4=AVTfyOo{u*FqhI4yv;1SxaL4z5Jk4AL7;9nj|%iFRgpx!4~sG|y=Hm;86q3M6r|G2Uqr$2v& z{JaTQI$-1xntodTmGb^Yv`LtQ`TjDMzB`G&gC30Q!ekJ%GUlZHw_}k`XWbaRd*Kg%fiq>nnX=$aMDvdW3s8R|$_68jMPILne&H)=|4+&H z4uAGFS{|*^GVL)n9*y@mCDDx_T7%N^ zWQ7TTAE7^5D;MoyVU6z>D;jp(g}sHc`=WjnV11$WNn3j?oGm9Y&7C?q>&fJ8n(u!04B$<~$$7g3A2_KjLIIK$Q@St%zEPJDhljMAy z>wP*8IBD)}ij!k$o3smvv8dY}?cM0BMV&hLMql+IYS(XovA4rFA%S+_x*yl$fU&WO zb;P(ckKAjAKMFiS98||7j8yeI-{i`s3_l~Sl z$$LQ(wMcVvCOlCMdV3w(KS|1(oc68w#9iF9tK=?10^jNV39=6)(%pRs%xSI2$(~R$St<^^L zx2W=HGZPN<(_W#;nxjV~XN&Y@Rsyw_VU|l1dd%hITpw)aP|4FgIDQey1jrVr;fZxd ziJDUKe+`=&3k8ZEqP%vr?-r`G*Pd1&8=b=^ABB~XHzE}|fMIBnE*qv(w^!j!ke48| z@j^(1+CKAQhR2#9`G88hAXi>!=TljZjfaF^rb_sZ5eZ+*mtic5aMG#<0QSHvy*$G!71EfflJZ15|wJvTO-<4`;k2&>R8Z z0EMiB9#;lS7auRL9i12@63uLZ*6@8tqbdI|?DV*LPL)4*r3~V85mrgIinrEU5@SV8-WyXpHC|eKWxTTXYM_>VpQD(hB{+E@c{ZdXi09y?zmE0yQ|npn znS|E<6C>>(Q14HVu@fR6jMRe97v=uef4mo#HT1-hIR=ZC1MBa%soNvRdkx@~DS04s zuz!h)dw{i=`JeOG*5N-~)IZV{HC@nx_+HAWSr;!KS$p4iSTs~3=u4zck-kgXR7%cI zkv5f2pO!)c`X6PK`mQ+z%cNRb z?rVCXMz`9&vj=Dz7HQTnX+-65J4N076DD8PH!%6CR7^fvVFtAY)XrP6GlchDJg4f6 zf@fPK>+p2{c+BgDG|j7SSfkO>>vIz?a3EdWG%}O0LEywTEl*c-yFgzIQ(v(vI6*35 zgiTK0eI_$-+<<$9@1#M?^215kU{za+EZ>vlF+&#Q_&j``uc-Ug2$fxp)?BT&=JgSM zxNaVs2wYEK?yf_`Lm}ww=q?>1kPI$c-0Zp~am`5UMq%~}T&3|+*Yydn_$YKy0rJ8I zd}_F)v?h#)u_9Vaq1hAl)sD1fY;NYr^W?#)K962)V!&bo&D8?Os+66Tj}ALwff(pb z$$w6jiKRlVUz~BO|53<*-LYECE{}|%N%^B3)dtk%uoY!42KEz;#Rgn4WGqR^1!=-4 z)hPbCi)fL?VC;Fzghje0L;JMObydP5o}c7C#jnms53U006`@fz(G_tHW^>sRv-~EE_eLsVq)kp}>PdMAw4(n#FR$2l z=S#6%UgOe=82mqxW1ttl{SyA2;?qSAPw$Lc?wF@cCpu2dDBwQyjQ8|HpN4Kh`n}PA zTpm4Kgy_Zx5TSZpE+77T?0~W-ctGh}AUqk z3$wq9|@A zjaOIrIbXS@x7~4j_y?-H9Q$Rv>R$!izXG7W=H$IO!}x;uedDjt>-|^QZ1C|wzCm~> z3&GR<)j>Kt1V+5tY6HHd;4iHAQ|tBR&!hFEVOpf8(0)GNu!?$M$5?4OXA#?njE}aF zmd`(Z2AQP3kVh-<8EK-uIVXRg>cI%R&}ym)KCkLn|EqQ{-@x(z&L1y4_y5l?IQ;*z&n0?;KLn#QT$=e)6{B{-=AJt)cc<+E zeaIrhXL{tfBoJYS;44`bVpC2f7^FcnXunq>8}xDcr?361@uc!;E*X#{bn%@0E>@p_ z*|SJBd+9z`0h;2NWKakd!0!1{erFHaG2vkjYqU-@hG3&n-2N_%8oN}FQKZ^1hkLME zfNQ1;aVUeZ0sfAYgNtjDMrvX>1Jj@HpXcQILIZkX$OV^Mq`!~UYLPzKqv9f|KA#uU z@xN~4egD+PynoR~4sHB;-ED4*>+cG(Dm}0dkjG_gD8wq*(A!*5;0t*u7YZ#c!#DPPueZ%I zh49(v)B;FB_j}2^boJj3%{lu$-gu^>na8h=!Ff&FR*pY|fBFEoJg(Td1;_V?8R$Yg$8dPaJ0CGV$mu}wF0YIrCwE1Kw&phS z^HV7u?eLT}w~~*G(AtIj9P4T&dJy21MkC$VMkj+}Yj8PHi$#K7Cj`Nv=r_-DVK4bc z2b<|P5pUCz8XqW_XFv=pklPc-<#{Pi5P(pJRyy(m=7!oB5SN8c(k(!yN3EL ztkQL}&LAR+e>}|Zcw5l}7xQh!%)PDHZls)y11Rimg>gIAba)(%ug^AP71{%wSP<}x zFK9FeUqyN0_Rx=dP>V%6o5~9?oQES{va+Y3@06)x=lu+E`LDp5y$3t7L!HY72#?-& zvYM6Y9iAx+o6_#zuOx5PpQlaV>rt8oR`cem%{-qry{StZD|(cmn?-(q%A))InX=U% zj~yym;w8@jvK0WS2sU_QKo5T>oJ`>FI93A0)!cMx9~bCxEB$MSb2j-?gd!|HgTTL2HDG zL1?#}WX0Gbw<$-n?(q0lScB{*9Z{me@b0{(gG!(XJTrVyX{hWPa$py0t$r?TxZ>Sj zppZASDn6}ul$11k!8!1s!^1TukOek8_Z^i-F?jFs(BNOp&OiNft3EI&d$Polz?;Au z%Fv#9Xjgdmf_a?a3H-H~MY|Gz zH>rOg!378W;X|n#y-w7oeNIJ$vG<| z&y9OdAqVg2XsfyYfWr7Lowo(+v(>w#>iSwdT?UR}=4ykuJ}tItpX>4b9*24@t@qXj zy)ED-c%uaE(ev|9euR?|8$O@GIh~z1gP&NWhtr%;i(b%qKXPZ{GiuBnq0x7EaygdK zGZvlCrg1kfED@pxhi95+-glRU-QMfJ7g|MphvX~>s1G7kF$)#mgy`!eEL#%3dauL_%`#kZ2ax-S0 zXbaItZ^V^ioCBv5aiy-v0UxAP!WXh)8THH$5786cJuqx6D8NPP28!R`|SI)qPCov`B9tD}>#nbDAa3KB8FSr^}d5 zJ-_gtd<8SYVP^*IE-UoV9v!e~pV1}Sry1XAFBp_R%@qbX_^s9zU1)Dyac_((Q-J6- zQ`dKoYc%<@a7uKI&48T=lETo4M}uyT9k;vH~TN<-5+wGqb`r|*h+!blo>>PTF9V3g5KYTEa1{@dvNtLjR(+qrG7l^WXTE(dI$VDX(D2?;1#*# zT(rc`fS7>n^N2We!NwKdccH(lZx7w2$-C&+Tzv@MZe3&ih47Rw2Sx%iYgx?aCF-jS zFGcz9rv5yr=iH_D4sophkWIYsO@HX{px(aal5Vg5;6y*kSW@B&@%dec2YIdsdHh<3 zEd11i73&X~isO%(s*eDJdsVaqQ3NBUl^wcAO0wxCb57*k2T&4~F-F`o#E@4l#raCe zj*OhF@OL%GXNOR#dlyO#BSJ!VP?fwl=lYrSk^-b~?xA4&fMBW%>Vqe-d;FXJ-ZmN- zht`Kpp`-92EAu;s3|8aU`aJ)1$Eq^)d4B3o=(7uXBS0*N#)=od6&(6Adgr@jr`LMO zbIIa4rbAQ~{L~Mc{qHE)uEcNouMM$jpCvB5!)vYm83Q&^-ypxJZ&3e|`c|_$XbM8w z{WtB+c=JPJAXl3FZ^gPp&gGuc9$(SH+V$@uih}fn=aw_+W%wVk_%%Vo%bHQD={=vq z>U%bh@iMT94~;vlOzB(aeI1l(iQ}~54q(DpGG{O(&Lv#kPx}uH@^^GCkB+;?i#afH z!Ut$ic(-X@*Igxh#k;zeGC^GW!d>}$A=PGGp)Oz{hWF80BXT!+09isCBhSM@Cq0?Um#7R~?h#cum z`XFWWn?mtHz0iw%kzL-I2TO)5c?~C+l~czx7sKd}{C4&bM!0YfX6Oe)JexrCGJV%j z9;nXB35Sr&0P7g|ss27>FMDgy@Dh!6v6z#$ed9iJx`SNMBpw^IRjOV=oeXlU0hHq4 zxC%O<81;(F|MBH-e(8#4G(*gdU2a^>(@|qvhJw=!1V6o5k~ zhTz5l9yD&mY)hMOgzXTYb93@pHOCtwJ%4JzD$#THQpE3=S7T(ZJ~Udyowv(|jJCN$ zW>aj)#{Jd5$7{y;On&T%octeZ){XZSbJwv!Lt#CBy-FSF_cLXn7cG7SJ`3azF!v!u zkB#bn8YM<`WMdeVUqP(;>q+wKqOu+v2BPE36mNlO3n$@t-iY!F)$(3Y%QKR!yLqI% z`I}Lmy?cV%Lan?_DDQE#Jkao+z;hhdRp@_#5_?eMjGI8yUX(Zp3(BCp_Mcjqo&Pjw zr(pB3!Th~rV5OiIeitRK7-`{?zyY0@<0?m5xbeGapY3TT?N`fNl$kQJLZEwRhx*BL zm!jD^dN!cc@r#ZPmfgpMjaW0sl)IvX@>C$)n3?dDp|folC!owI(8xS!=Y7WpErkpG zrO)KBW4hqXyA&LO6_q@_z`wQR(K#gH9#e|@-XGN8_r6lnSNc=Xj1~R0Qtnp%iDQFf zgsmm@Uh57-|7Sz+Ho8g#xBWLYY(fp4d%yW>$qdU=rJ&>+y`|4spU%mxc*?xXumhNB zL9}vn=?)$lDwyurV2N`>$#=Y{-HCc}eVtnGSHq!T6c!xb&BP+mF)KveQeJR~w+zaC zX@ZQd6}xqSJ%Y`drfbM4J zp5A|^tQEMckk|r6`&W8Tvm5u{!J&rxpk?RUsm~+>qX%>O#`o^xgYPUQIgsw#cU$IZ z2+lc~OIL)b?G>?ugZ#|C(w$!JAQyl(3~gC^mPrL>j3eMwE|}RFQ;q^$xtUw0+0EJ14(|wXztPB?I!?x%sEpwhI0MWFR)d_ONNG zCKob$V;MW)=C}0n!J^vJADpkhYEXVWm4!t@*lP%Q@3QQLohQcO?vtp2+CuF_9u2RN z75lFYA@eIFEru37RZ+h4IDCAGx9ZQN!rG2>8|_H@!OJUON33KsM!m4K6?>O-=m_>* z+I4Mlk_158+!1x>4PocCW9OwEoA!XzbnFuBE%05-ILgEPO7mN|dwGx(rUmH?>tD+< z8E@tFL8we z08}}&#fmq~YWsxpoh|wAbj&sH&B_h1_~c|uZVJZ#NWv`6rgexs4X;DP%y^k3KqAd} zi9+rmFZuR!>w@wk49b5?ngSf=v7-gjc!I0qMe?VWF^_*wo|{KY6LZ=_oQN3YGUiGr zdeO!XdRiUr>neDR_QNCd@vp|f4qf2CfuvA?ECDvmD;_abH{_vTDq~HcM=+?9<*8wi5Mkd z#%R~@oSaZmh_+obyh$mG9vHOVQhfb^LGyCgU7j-6Qfj|zX)s8m^&aM29se>K|D60# z4)PN`J#+HPWDb6lg8#_BnO~wo!VDcmw6lHQ9e2GS3x#@oW5At)O9iY82gKhz& z^9H|n>1mST3sFv_2nYmg*6#OvkDHheF~3-wZ@hxMX+%lcAR9y31ru>O!&hf!->})n0wVWoGXV{#grCU&SFZ4^|V*R7k3W}2FbT~QPQm1(9CgU zB3eVGlO2sv7%eJlKKZNLRlAve_al+Kj-{t2)c;SU{&CqcLV1wWAuw{BsJ>z?w0m-T^;Bt5I(+>+Ta&L``e-&9DaGJh3;-y z2TU@=?9*va-tdBkjlBY-1LH7iuo)4htShrOZ0Log)K?gQoV1DSxH$TsZ;(pn4%tk| z4bkeMy_BG5Uu!@@)EqPvf zB>bxKV}Z0~+>6+M#Z6im&p+X|y{bImet*z3`~5*n%hKy0zg=bA{__@CP^KIL8cLy+ zPuot;KmO@j#3ADjPd3HMLhG&dhsJ_tE5Fn9^Lq+Ao|sYEkdqIk4h$9}FM&0V%pJ%R zHion9fVsz+51H@B=?)P!F_dy2-dn&b8=E}-o%diYQo^!x&v#M1&N#etm^Dzpe=L=E z*Eim~dgMJNslHc;dXWDJPdawImKEBOCGS<`5yT6k$811;G2Pc|bRwhGNn}lg@6no8 zD);bUab@4QR`2E#?~u;e=>HA&$@`$+a0ln&l$NrPkv`0%XW-RzBrzUV!w8K&P?ZVe zlM^ezy*+22SyBpK(40cQ>|-$ZytVjc{dP#Bh2E1L?pY=N6Ab-jb}DZ%*5`jK)Z${b z#dWdgmCi2GuW|0DAipJA-HBF5dvTvFb?y9M#|SO#JISdz70&S!LgP?vEjSP8=-CR2 zCkY}B{p14$<9caZ{Q5bW_y8i;bbJ?RyL*JThma4etEC6=1n-%O;)B5W*75D@DC6s2 z6qEnL^ETW$qSQ4Q8+`M}idzuNdhS{J<(;oR3w!2B>96CBE9V;2cz4e( z8l!gKWf-IX!#-++#$$#Kr31Aw>vQ+aKRsqGXnA_!kc}sarD%w^dA*YZdYH16<~3jXHh2I<~ZL144bkhl@E``I$^fnl3y!5wSD6%vE6V=)2xrpED0Uoxy&qVLhhj5lIv{sD9eEbEt^7fcXhal|X7;pG3AvzS;%XH#3E?!m*J2>KPOp+z%zC9W<;Uo-qfW4cpbBq7ZK)6_(=S9=b9oCm~o)6iQS3$84Cr&)+}`%ZmKe|5(w()E+!0nIsFIeIJK^OdV?*@^DeRisBr6 za=4aRF^Y_G+XXjPB{%4U-32fBj2{fai?ZISm)=g-W7ZRcWsAOjTyM0-UoQPmuj$}6U1RsXis5em0AqwR{8rO4?4e{g)p*^f+)0+B{ z%iSdb?3&0N=$7T~9LnLqY3;XF`cAb4Oh&Lrydms2Xb7tjSlJ+yo zry=YkD?2Lm-j83v+ih*V!*Wt*FQYUrrsNWea>p!%j?`b=boc` zPgo1?I@F_BqI=*~dgnp->6^`Io3dwUOF{7C9wk58qZIUsb8bCKXAOLuLWe0md>eWs9-61wPf^plVtYnmFs)Nl&%Aga+!U* zGJ`>01hUQy7F;o~MEHs8A-u(mXEwGn7oK3O^NKhpP7|jCp?C(T9cz?7Xk_3FY${Z?@fj zii1ax8S9>ODbPnfFNNOFa>AHkUq(If1)r&-JXo0==~~36Xdc_!D5A1&O`nmCf}9Eo zmgZ2Z-`?{Sw7&^{;QfzcmH8(;Hb`9N@jr7u`{Mz#;}d05pY<_FT)!u;WqsOqdj9dh zlbkgV-y80%&x|!b7A*nC|G{^>P2dTY*#c+*b@dK-Fxhrw<-a4hP(D7zYynQv^L{Z3 zxL3#vE`2^cY6s!uj3y~?W8MyrIj_?l?U#jI-c#o!A?TJ-4q3bzyM8+dTrcF1$Jm*G zB~4s`;*LoEc@mzawC0d~K&n>ka469wNRQu@>Vp@U+Q<37YJ9ARIOD|7=b>xM{}F3$ zL1g3x?!+iv)BWsG>-|7+py+jQ<9|%oOTnCh*?<{@-Odk0yDq)t&h>Nv>F6GP+yuT{ zq)M)o(=LeUf?!Mg8h0DcB$>O_9SX+UI~;gYm!J$f#1}d6!UE1x&b1yM)N$ruBtp7E zB;4FWetAu6+B%k;+Jd0-WQ6kJS;~{)NVpEq6tKE*u!XHteh8q)U~_1XigdImShp^P zs0ohM-5UYc7U35~?tK!NJ_7D-#%G<1l2o_JENoUPSdc6|kVx)ab@g)3=5&NIGLU_YOuLT!d3|NT34f29{9fdkwtl z2LBV&xdv8wL(~1D@k|-eaWpQ}-rM#dt_5%XjOjb?43e~6$%k&L--Rrwp3nxuhOBOd zy!~Uu<$W9ag%@#2sU;grh;p?$OjDpIY^`eo)lM=#epspMo9jm@u8$SHs$1}B^GUR1 z(#No#YS(NMTEsStEAc-u19)#4lIffLkj^_bO~IyW3U*afaDbZIhTW>f&%MMRZy$IN z@f_t%ONE{HfSaaCe%78>+wSy)0`(}*I`*87KqKIBG~EDS{iWF5KiA&4NJl`uLAEzr z?ef3-xu$E;`u(O%$2yAGcfd_Z)+tgWHn|mhV;v7PJz%ddO8n3AU>h?Q9O+sU1!4=Q z`kU&dPNfTeEj;U5)urZS?25X8S+zB*ts0!3N>g%uz2SW%2hfV@mlqFv5qAx)#aKD) zR`3zhH8vcFiVf8FjwQ6d$VN(b+6J84A!a_NdKmT$ZI0x@5dG@}ozf=kk5si5) zVb0mY8F{-hTgX>Anf8ADNbhy7iSQDh{k0Jo3u`K8v(afyA9Qh7p8vuad^zlXO+U?e zkfHx>^uG?X^Kgy1IZM4e9LW34TL}PBI((>{3tM)#8a|f#ZO4g(cg8GH6D;@pREJ zRUbD_9TOinwK`EGvYLBB`C=XP1IhzsNYH5$apI|&p1s$G?khXnd&8Ws4w=QP)ss;A z<+jXi$C=rLJX5^n$mqxOurEJ|(ib1sGi1`)%U97}Ce3A10NxnVX4Piy3V{1d2O{DKc&iE^&BI@dx(J#4hQ@2|~HLALwhI1y-@=EHa9~<6*&0PuZaSLQ1^{Pr4rw zjxltpXO(%78Rpu5gwG~evJ9?gl_mzx20u9tRwNIeY+@eB?l-3NY;t@`kWHKzd{@zX zgtjRav@7(L3$3GG(slRC{|Q8)tMGh&_(#gjFwRbJJ&OGn(h=wwdkcM|T~gQ0OIc*@ z#@IN#b96^JfyXZPb7&2ovuF8g>e2QZ|&w)sI6Y9xG|+ zmuIJemr!9GvKQClbd#4}QMzHT%d>Z5t`_xQ%=Jz2#*)^BJn3742xEHH=?T$b88QtvT@Jjlh*#lWgmEh@K^LOPjrRMv0?a@ z5G~q0MydNX;%{qrkGY=JDW!2XWo-O$#qFLP0|#)jirYh{<;Syv`u3ER z04{e&N|P#gp)8}cDLpl~cHdN-N2cigPE~C-C$(O2z3rmR#_+A=?kE!Pg^Z2N53R*N;dB zJNFu%%M8FPk>U%r*m`QKp@N;f(Gi%?FW;RCQ{)OWIC00Wmo810?B$?mo|Iol^wlZ3 z9R8rxABwSJyKQbB)X<=Ceg-^s+}YPz_8z3^X!%wkgGI|5O=pgH%GkbWS$M7{kwKq& zAZi(rd`I4|!ux$dZu;l;{2X()V9T>pf}Ev#=0Sdup<^D_}1V>U+o|Bn&K{$-i5#)+0e4 znihDNY@y)?LSf{nT{MCyw?IXd(@QbzA5HO|j%St0cG@o*O7mvsrg%T*u$w-C80FcC zNqi-C*O~bKTlh-PjJpIOd`Gx$1*^QH-19(J_-|oO5L%6BnF(!?vOspTHxk}ja-yAy z>z%b>*h(T%3+d9`;i2&4RyVYGNeP9uTK5mx?QizBw4w!U|G4h*e)-q%aW_hjW%7EY zku?jeMnxfVju|C)ve@Ye^vi#Q{K}9ki#Z{SOI+GE4;Z?Y&gFq6*2b;jKZdPQi?e-| zUeHSgY1k{0!g5awaWdpQ|1D#)5noKafY*2qWV;qckk-$kEY1DN>QT5SS&=n0l~+!$QfSl)a}&-9JKdo9QSG}j&kqK#%J(0FtqGVakT zJ{nUoq))C{HEQR8>_m>8F0}dK;W@;gV5jMFVmDEvxVn_6N8o7=Ij2#2^mR`7TmLz} zbupiILmsuS`B9ICd1y&+FWDg-{Skg&dLZB#8PFfGj`Mrm`<_({z}`#7_W>uaPk$!< z*N_luf)?G$H?_70pH)iiO%^)!;c)7sWi1v|*|aIiz04lv{du6UlzdBCSi)R?0@pm; zPiw~D-yb?M$n>ndrp+i7m{^So5wYClIf*i{GQ>~vCQ4P=^qR!GZ7f2TYxrSv6@pcY z4zm+am@bxrM<@F(X&y3iV?}OKb>gr0UwB@VXb6+$oA0C*It_RW2*JXLq_e_@f_|spx1Vt$$E3MRJnUDBfEN?i%tX}j_hAt`<@6MXI60^zl(PhR^MJU?d&+J? zriMyM(A^Y1`H><|&uF#Opq8_+_Y>!`Rh?F4V#0BQ=V4V2`7`X0fe#I{s!CuhASN15 ze}box*>tzb|C65a@JIm_qNl%5D03?^631;SqQs?m@-Ut(z$zwe41v($nQ%YhVjKpI zzK_`Q;Fez^nmdSJc>IKuRrV^hiC+TK@l{|x{t`0Vt3Y}9C9r*81^xa~DZ%Gxe2!r= z6)q3wulUa4yNv~*hXB(OWt5KK(v$D#dgTphOT~?p>xD8Ry=k%~$g`U=A~66Q8KngZ zMOh-p8)6x4)yOTaBDmz_lNrKsFiiR45M>;>hI1o-*lg9hLb1`b@6bF1BIKV*GvPaV znIY%WB{(4%_MI#@h(J@cBkRR{1C32N#%2`iumb0&7Mk3b@)(q*?iGR<{<5Ekm)BJ| z!*b(v(UIZ(U#P1rrrZRSAC;DBY?4Ltkq@_$e^8^N-#PnsKxzBRiC0AOmoR3Tu8WR&HIkRevIn z?edK~`g>Sk0=NIvS4@`H1<(5IN3EBRB0H;_a=};*ez$CO{jQ-03-lkmmHcZx$O)tS zpinSq)~&Wr6sePS66$kZ$b!GOm$UMJOxH;XU~Jr)fG;l_Q1b-LKV7nF26+6mOje$j zCV$}0T?YT`ik)RP_vdocaIwNocn}tC&I!*4dpGQxC1$dTQ9g91RIElZaINjQ!{JnZ zX9WGkRr9Ia`2FC~8-cV>*3jHS{!GV`4bi8R&nr~UElv;xaephFG*EQjtkBjK$SV00 zZbLIpYzpnpE&Dfkus3hb3_RS8wc>iD8!Kyu|2ux&jxXi0n31jhoY2*8syW@S@j%)e ziN??GIU{E};oXIeKoG4`*AkF^-ZWXyuP3tPzLY)B1Jt}NvpJgcF3s}|>xNS^isj^b zL~D<%Az=7SCG?Gnmo^fr)iyts&8i>ndDArWeAyk)`3=$5#vkvJddsHS^+xqeXlQZ-dL2nA0D^6W3(er2`2jysq*}>IY$270g2~ zDp=(rr9x@(}D29z>ErzNN%%k^uZcZDZw*Gw z4b;96axN8MWb&bP?|_|~a>VYyTK1j1lJj8Bj$_BY6DJ=#7>%cd_54q3S@TD@&E~(Q z@iAoY)b_>O&#$#0#_-mo&Pem#=w3Z`Gm<0pLs6~+IoO*ceZB2I`KUmnk^r}b&p>m8 zbo40yXhc8hTL(R5^u*bt40dVu268o9zSa1Y!bj&HH&246Ptdqah}6Yy#GGa2DM=Fx zCH^ot24TJo`Dcpa!PpbZlWd{i0~_l@xbk90=WQWY6Sy#M0;FKPGX&)C&ce;D=-(NxogU45Kjkgm^kEeV3>8lUA09s0I-T@ETHHlGACLsodvLYX*_kY2f%>Fu&h2b@ z=Lb|DXPSGsuRdyOP$}92t2$Bi^2iob3y>=)R&@uvL!>&Fp-xw4utmU$ehFG*%mkN2 z{nTSbO<8}5-B#;0auu=eHOTNT{s^Nmu;xdQHU~oQgMYgqCFZdZ?&P!XwPX{d7T6^d zUmE8pmBw|GbaBHZJ#x)X#JhUCQG`Y12wCy;kSz7c2Ok1GJ^^nu*8|WWoO)3woP_j- zb>{3)M%%ZecVwpkW<$0E@+esWs7FG$2B^QY;8jFEn0)1}{>g&*DTDOih)OVq*JG7o z4(*MxrWPjfG5fkLEnMuKwHE2EY!Db91}PuXV(y~z4-Nayr}5Kj;-?<)(`gs@Y4x37 z{K_MGRcGgPk113|^$_feiC@Xs%ggjHUsbLAyI zmk%n$J&9*_Fyf52Ck^b<#Hq-4chNc7MI5fW0_75i3!mq3GcMwAk7f+a0S?!}PN*EN zgHe0z;BccxI2^~=8$<)Nch`Z(eIZBS*YfNLkK?|^;}qCMXR4#3VTR2>?r4(wv4ScV zoF5T4MsyKI#DH2z^0#3`lzsCc57foP7FVo0lEJtTr={F$GetI$_5eul==aTPzrl$y zFP!uMFc+)P`iIyrF6QbLrQ&hqJU++8g$%Fu@gerozvbduAAKjUg{JWZbV0;@0B>`L z%EeEdmop$A;2hwF$i#rFahspe$~0-|P1A(){98YD)WN&Zm&NEyAm-+y=KbqpaH-98*w?6*s7Zg=R(%OF`n|Jv6gVVtlE=Y+ec;5j!#t^?=kU@WG8S02 zo-AOnzQdI&JYD7E-^)&dmoRr@04;wRrzMH=?Oh981Xh8SBak&=5;QU!R*^CBEbjPD zehbp!7r^xs{KzuKNcJJ@HSkDhUDK@VjXzzeI6d1{{%B25PFVN`6d9x+BHJhBT+u-~ zuvK3kzM%W~s^$LQU_Ji^CtQ>lo~*S*xzyw1{g_$s4HNjr@uaxq=&o5IF1QyyuzTCu zTR)RqfcW*eayfR?DEfOj8%LHOuIu*g${5Gv$Vxz#p3#lSm(Da>4_)a`0DD~eKLr`t z!*$k8ijURVHYw1vR7ry9b6` zgLP((Q#OJ*!*q&C91CM47OK3ys}VBaB$C=Dg|As*09rfkN}41N{8d3crTp0&vE6V}?uuDX@Os2bKrGK z8+ZUGQrwfEAVRVeA}tSe!n@aBV-X8$Orj8(w64>agg&>`XE`>f<|fz}d?x{Dvf~Sx zd>P{X_^Uv>_;wvmn@n*a(+&w+knc`_^6saPvwn}NS^WE;NO6K z&W2r&Brmd#xFSj7el_Efw|YTzF=UPdAt(H&3OKH|I6ixC65c{KcUpcTqy081LRsEz z>@)e#!>-8Aj%axhqrWqHnSUYl%nG#RfD#}b{%05DBFRf_fo>AS(l-|kI)&u-VC{oIQ>^i9pogOLuC*2 zk`2r2hv7$Br!e8;b2=!-oHC+f%~jh`pC9$<<9X`dp^i(X`Fwk7Q4cR|S9E@|XgE>Q zVw8k_wNt5+|F^xLpcE`zytG<07vRi z(tU%IykR!silpAlvR%8XU6&nYg0A8=i8C07;@Ip=I!nZm(w!RTGbP$h*A?(7-3k3r zr*5M%y@+J*YS-~Yg@NfINbP#){*LKwQE)KBkiLdS@`J2^j3pQ=)F~?(QmJ%^RdVpg zEv)pxc2o--<*%^&P>;^HeQrK<(rxE-1?c@xW1cQM{D~5co}(ASMQ`x)pow958Bn!q zSYJpV3ZTxPWlzU0P{%urrKl*IIyqxXkT_v;bs(*(?k zL%ycqm;H>9?O*fPAm2TG%TxZbK&#SAb78|Esep^?U6%uGasy*Ebqz1z6aGBWT2b?A zn2^{53y#O%Sk{ft9XRud?QL#rG!`B4wK>=J4sDw-DuMV8#z_;ncHq3fudq%Re2OZ8 z+Re&!QUtqRTD~S-rTPf`&Ufh0lqEFkz!65fNM~s8$%lRBHR8ULw&dZErYYzRNNJE!gtx8_*H<_=%(ezTYxXW!M@e^oeyp- zT`c}$OUo8$%TEogRV>tXTWlu{YlM=lZ{@Sc&?VtMxBN{rt2|2_b}t9@usaaf&*Ce1NFSM-YQ_ zE9Haeg#8C&6Uj#ZMQ>6Sx1uzkTH17!rl00Wkbi+OZk2L8at8W!h_yYMovCb^zyYH` zh%Uw|?#%oMWhvhn8N-aZD632@D-UJWVGup)x%a(~P12JL6 z(HLnq?<5!F&25?Dug&K(8T##^q|{FytJXN#6TBy{n_X4gwU$hc#d#@4K<1UDmZ)-vqT8qZS80Oz&u=8(BYhm#(7NlV{@ zJxcR+CSE)S+}=Qb$$DsWh#6Ugon^Ud8xz9YaT2-*86ETNd!nw$z^?8{Fx(w^zKpPn zj$j{eQ1p3(L5r+cd6dD&bcC{lX?OES?s|X;IB>rn@&mP4_uNp@_B3Gd_4~BX4aLLYG$9 zm8uC|dNvH7_(ztUx`AuogiPlTPD1?XvQu*$T+r1>o-6NwI~pXClMIp`{dl>}u2f7| za>}T_xg6gF#H-CIi?Pq;(+DN$7tju5CZg9{E}!{&L$OETNx)76~DIYU{f!_sR!*d;ii6@aHFc*5Rb0)-q%X; z0Rr%Th-TXn_k(%CUimO|aaafY3;o1AC>(RdjR!mNolPZB{BUD`o1e{9ne^ z7L0}3>SEn((eX{N>J|z{vh-{ofCjo2QM~8oY&_-+^JTpS-k2M@D4KvIu9SQ@r$!c( zr{vYZbkK31D6eia2U`N4hTaC{j`5pa#o(Mw(%WqK-)4h1JP@5W@bBUiNaN!2h;0Th zy@VBF0H*9qk#ior%OgGNI_QZ?*o$@C35==U^+4P+{%yq6{Xe|D3wTu3xj(%2o_j82 z5^f;`*fU9B!bJzv8m-4pCShj=R4(c%wRo5Skv&`|3D5}_nQ${ftwDu?t?k5G8+uKG z=^w;sP*iN|>4eKEik1yx6G-csaN9eXB=h~=Jqcn@&pF@!dA{d^Co_BYW$kr&*Sp^J zUViVbBhZNJ9BV|s2b$^bUV z9l8!=3VF3mHKbY%hmFDzHTOlUkh=obWN1sH-yO)W>T$BJqb$@+{;~{yv*fw&DZ1So zYCgVLkZvEOUO}VY$zP*hn8a{Q|*KS4v~fKCz0Wlcdy5_s%4suoXO*4iY93s zuu1w~6p0iCV*|p^@g1O{FldM;PlW^pt?n0|@ZF@KU!n~e9kBHvYAjmLPkJ2Glr+fm zh@Oa!;%p#Jv@}FpgER%4l{$FwPn1{}vl_+-Pe0YzA-S@JZKG6EnyEX*lE_zUR3RK< zB&;l0UV!g3<{DQ}K2p6m%?jPJz5N0_?`xU!@Qcv4WFFptthX-Hrqj_NJ)P-{28KaW z8rEA?MQC4D<#ZQwtkn25MGrV}UmCQpPGpxgBfG5eRQX_bS?=Vde9On=uScWpTo)Mh z#SX07i+u~7+llYHRNVxp=8x^%?x+du2%tPY3j};puk!wYjL&}`z&#ckOHa`wUfo1X zx7lQ=v2-UTnTz28kj!p8CK&5lU?JvhIuY7(WNS{`UENHX8F@RMv(h>H+#((x+58lC zX1EA$-3A2l(6gPobofF4oUT7y#N-9=t`RunOZ^I`b{=H6`Omf>w)X%cdRySxdH{L7 zR%OS43$WCATg~#C!fwXxbz48iGdc5-yE8e0a`ILeHD?xe{dL_oMEx6d+zBh$$Y%qA zo@aSuYxH~e-U08O88-M|vs~Nk$G~^K>=zb?p>?6&9RVHJD)9MnG7wuG>?EkYi>2F& zcdPdz(+vIAtEFe`CKEBdrU+;EYLeSBcy0Z?{Z85EXA=GISMKjKh%#aa zF1QheWF>p)yrQ|#QBOp)(}hCt%x-_^{7wmZxhbkD5yktex~Va5m9QeSX(qC^U2x4T ziYXaA6o(tiB9x2S@KE8RM-Wdxiu3tVhcbE>VxK~=h6mIt;?iUb(5z!tGyFbvb>zvb z#^%8L`E}rNQ^fBkh7zscA0riVa*wRY22qC{x**zC^eNqa43UB0s*P0?r~QMkqA0nK zlM$ey6Ll|T6;n3$IhW;1XI2?%wPtn<`S8L|Fvn)lF5WS|LA5f}v5a(bbpW&Lc*6Gt zX*SzTt0FPwfV$NFRHn}liZW9DO?3w8tH|0!BrbAj#p>6j?A}I^+&S#}r~p^I7w@dj z%oKrA#V-NgN;9&fR{~>+J3+C-puj+Cx5NCAYK2r`2(pQ@=70{@ztzQYzAkvaAjY`( zp_F~oYxYhj3fzc@>VkvL8cy8m9LhrfEieCDcvZdhRHvIa{}QF-;O({r#Ti-m%qDNC z6TnfUcv(WsNy@2Tvnx|X`ynY+p2+0EPrfM^$Y_-=26R#16VgHR{-k|LT2w6;{e9mn ztIYcy;=@_}iZeFR`?R|-Xgy)mG)LoYR#++PZi#H(a>Mak#GfWPV4Wi0B#Mkb2%6y` z8>H}jNRR!4usWu!>znw5Z*}l+c(v~dCWN2x`C*mOD3Bpmw@)#sM7xG|+ln!m6E*8? zD?IDxidv+=b0o9VyeaSIc#5Bx&wh7}QD5^ZlhebE2pl+F9y z-#D?7D6>c()AevM%T0$u*Jm<@ev+ue&3V%_T)M zi=Ni>dB4c?f(Dj6c}{&MtnYeP_X1FuHx|8wvm9F!ozDF$cvt+csj$m}ZhlD7-EV*o zv+k|jUMKeWA19$Uym;?F%qc78R1s>kl!ehB;q_;51eAU3Lk6CcH&e9O(XKY@&N1FD zgQ4`v@RNGzXpzkW8u&k;&$_gFzYM-O?b6jbKWN+rN#+GaKkj6Py3Bo`kLXFF3$s1~ zzTpa2k?oxcV>C-=92otN^cvW#hy!a0dHXxce+b`&XVtse%j#stAaSs9&*JE1AefLW zoRpa_CN%)ttf!%B{dkf*8nh=mD-P618z_soF&ekHvUWD}d$>KTW$l>**a;%9ZMcTB zysSRVELo1?KQ$Zcz9a8FV%V4L+}a$U%s!6WDPM191iG>V3ozR2kRu`V?)h`I(GX{5%HG`X=-eYP5pj5w;#2#^856@%zga+Lf>%sNG97Ch?)EQlo9dZ z;mmz5>7Un%YTVgQ*Y&=;Ag7Yww*|Drqn{C>+=DE?r>!Du&5+pSYweI+G;iu>8iAe; z-~CQxkY$cwL@&{pu8rI$him*4KQW5>JcJ%k!@gUBw<^zErX{DtHSpBZQJcvRn4%-h zTxRh_r4dmhWYH#Bk-P-S0|(eSh~QX1{s}FXB@Ei&fXYnIxyH9OKa21BnncEUeI!rA zrEF`TAwP3)=?{)hn=A?LFoz`cI!C4HEJs5i~ zFjo4h`)a!r(F?#(bUxD0m(u#zUhveT(t~jE95eGTlz9#|3RD^R^$A`E-fqh0__Zg^`2U|K0ZzQ zsssro3_WQXd@}Kr_p4vvr`pJYlP1bOx}g(spIhVPV{qPbf^|U47jBYhQT^hj1|!a`o)y` zPujuY36p3`qMknJ*-{#<8s!n~CMcKcxf}M$&G3xophfCYZo{wjkwjgcsOyvMUr21? z4AD`QFAnkYPK_e|8Ld)}Oc|IaWguexPR^mx5OM#1_Jl)gRciN0c2U`{lGOKWHBW01 zwK@NPY4iV1#~uCo|3fd+{7TRUhp|nT<>js_$~K>%kVK!o58ctwY-NZC(u-`x_Zt(v zrPC-zt>OvhaxzSV~3U5{x^w-*JXm1g`3tYvR+wXy`owt_z&S#jnViI z(ZJXFPhy4nU0<&BKbMr?!wob`L0btvto`~2KHRYU=muHi!?2sdJDghjR3CPUgZ2Ec zd@{i$5}aYE{6h5p5MPp@wR#2K=<1xGcth|HDXB)0$pacUc{zqhyZI z0<=+J3(ChznTYkc)V`pKwId zqdxcDY~2(?`}4riqE{OZ*(U#?XUTl42Q%hNqT( zv(LmvL=MA8kNb44Xp}!!gn>L;-5?UyJwZ!1XMq--yGQGdFWTW@2VCHz8`$ox8_ZoE zPLPt}nNEJ`EV^UB#D3SFCrul7U5WK~`tI^N{H0e%Ge@Ze-I19|0Z0RzB=lS@lR}+1 zhrP116KA>24#YBX%z@*!O`YHK`6b{jG)Sda$Fl~Xf3st=E&44a$s}!`e;rBKj&&2f z21I|wl+V=Y;J%;R+(FQP_mx1vaUif#3X2H`9S-Q@UmAlJcARkom!G+ z7j1LvPo99M26-)VpJhzaLxa(y9P1-pM}as;)34lW7xEbs_&gQxouOF^9t&-(10H?5 ztimp$31KVd!)D*6Qq;t^HoS=tBEoAAEZ?=+wt4Z@l62d;;a*tN^ZAo5w1$(ZP2si3 z^L1woqY?gI!}63_Mcmd`7fO;`c23%6sJXc zHma8uJiZMXL6X`TvLf{ccwqg1 z{|gRi04Bx*&seW%lChtFhQI{rh4#s$6Xs{Xpx$@KRpp*HZ`$Z#(;5e>mR{s}BO?E& zLzf$hXV|#F_CQG>tm=F-%ORH*>R^Vmwq%Q34j&D~^#O{B(?vhKdG3ju=T2%FV}Lb} z67?wY4wU%q_#~8A9M~Cn4^Ia0WE-9Y+DJ|oZ?H|q9b&vV#Bfid+@?dCPYdGfksYU| zyr#yz`AqpnQ$7+aZ`9?hXPT;X`Pa{sNY4>~}6;w$; zCn+dT?Ec%FheE>y7JUKQ{vhV5-by-47x+l9Tm?VTGqt>_Dmsou1#qddcB)Hbm3O(P zlFI!L)ns)oZ-burchDCXZcV(aaHFbmV6{B)JA&&yKG&{-tuy6KGM%$S)~A~O=$4xP zvDYX}{@T@NZ@Jp4y0clg4X;{SJPl8XyJi%NXQM0V2 zzN1gus#%bMlZCS7K*GLSkJb?08iR{RpyjwUg1ooE+tLs#s6&(yVhG@|oq;(o!%xci z@gA&ove#DqaWUuTh$A}h?+jL}z3|A~r&&|T8+?7TB9w9 z4yT#N+xTeZ+t$|mTQc&1k2m7k&KVf55$gRoGyIk_$=aC_x18Z|hUTnVWIhlQcXw9v zcJDZ>`-1Cl2W_6Obg-m%-I+PFOI}wX=D;W5Q}rG#t~7+W(sNb*t2<5S%3oRjgUwlF zH{-L)f4=C`b=9ReJ668=j({1QzdH`Z!YSR*UR8Yo1m{- z2(KvNNun8Hy<>&@$rkK+!q6pEBm1%lIg7^kpgad&12)Z*NRoP#@2kl70J@VsYh2%AYd5Y{D1khh*z{{=lky(4J7Ba}Yj z`>H<*dOsMn=?;xC(Q2|+Pb2K=Q38FISs8?wsoOi_1yEL&cyjdCOtwdmW*1U_X7(0f z{{5G}G~eYNjZ7Jd{)C*qA*Qs%rei+tb$&3W7_>1}x~>>|gwko=n`5R?i_0mOH$bYR zu?D@|9BauR_7M%aG>#&y_u-iEvwZ7U`r+N9MG}_6=YwL!X-?ZD3yz_!mJ`2e6@fLN zTmYiAJ~D)ljrjw#lNanM^%s?2$0?$$R~d+>cqjDMM2{~{^b%P}sHH#c`Rh%ZAwP;+ zWxK@OKz27sA1uh_Sy8uPqB&p-&bhohy*$8>y?!VBbY_AVzna|`AdB=Pkkj6Wed|t@ zAN!gL*)xyggA!*ggJ)B%zaB>zPVoF4+g-UTo5L~PKYi=3vyZ|PhmOm)($(qf{+=B& zn&6vb6OGU5f#irkS{EB(IiiSSmPh_RF(tWwRrZas zxzgX8bBZm5w|u6<8fb0R1vtbAPqBtnhtnu? z0dF?_s?7>P^UC2m^~8JrW7zYJkFbfynv7i{YwLP{^hkBI&@yP(hqvGFDT(S z&O+Zi_ptM?{*g zhvwMu>6&v}yIvmSMFeDAFHVx*y_(9bMY)mr*}3gN+zE`OGhBL+0cZ5>KfS(bUi==! z4CbcdiIwpXVmJ8c78l)PCX@o9u`6SZsl5bGZgX=HUQR(BvG<@qHdLL z<&S}VW2CH~qHpJe^DSItB2tjUereC^r#(6F%m)?2?{X(;2 zgy)?gKRGv29XyY`8L47*fN$bzc>6m6l7{{reo{TkH+xeaqU`Q$b+1yc(veLxJTZut zVUHxDz%J<&`%((lmK?nBF+doSBpo%}tkok((yR zb5rHC++_LDT#IaWAXkRKKzFVyHoE~FG^O9Jc{fse@-x~~}#`CPJ9Ujjn9z5H& z+humK#Ha%!h03cb`U)u{Q6A0okq@vuZemCr)yv&@uj@UN{J7L~&lvKoMg+t_Lle$1 zVWHEV8cA?j`pu1jwNNNjx!VuHQdSd^A9ohXkLqNK$Q&{4>`6|z)IqexY=sro71)C; zcKdjr$<9~kW<9UEa`<(H>p+d#I8oLRt38A$osc@)8dhC`*&bHiLI@d;hwdSNnWq~^ z&`3i6cS9AbNPF8huFdRpGMfQ@zOVL1fmymXqK7s30`ymLK~-+V!an+bF(&&`@%?2? zD5W?BRk^iy?j>!_*iErfTEN_72J3g0P zmjewU2_AYO*om@1E5`KquvcwVlQ?PXG+%V3%YPJa-NY?~|J;yAX9h;nHJp=2$(eFU z&9T-?)xHbTkRPbSc60|x2JjRrCmui18eJJuZ?h)+XE@me8J=*OA60v9#$Kd8m`3Q( zx!5fN@d0avwF!vdMnp^A=LC=FD`;Ap{c5v*>X#>p0}@Ba$_N>2ZVJiZ@a3H|40GVy z>O@yayx1fow-1w;tw)*Gcc{tdzXmUteXy*QAnJhpnln|O|EjVINUSc5+IcOTZnTh# zLh7>da$W$kGDWEr^3jur67L}WM%zjTZ~G8DiB)AypS-e7JDQ3k24pf-DZ`OVJ8F)} zD}mtwjlaCq+KTxiKxPxzWJAOSjA6Y)(ON-tMfG>K?1n~_>K&fSC94$s^=HFxez#D|3NZ7-fb z9wh?b;ndCFw^pI4R%xJm73Mn2lQRN)qnK^L|N^$ z`pOfrL5BQ^?FrkfJ>PcHWz0Tpv_Ih0caLWm6g{kVL-?1HpN&(M%>HEY_g9l`!+t}1 zBl5rX`{9d)ecOL3U-nrWF%D1Z4iLiCzrliZBht7!*p$D8Tidi++Ty`y!<4+ju@&goxHRBYJ2yt09SP@5uv_Rd>zL5ZSiHcIg&OE2-RB z+ZnpOLVzr>Bj$h|dKe=u{mZa)K%)v|t-GxWjH_Q%T$^k;L%$8sQFx0lD21^dswJe8 zcc@7rUXUsXxn*>`y5kA(t|Y)KQ4W~l9_Su&DVss{>M>3C+h+x~uO23+32{a2o7<$z znSuHydpP76wLd6sj<^1Ohf`z@83$2@(>lxQEdY|;1AU|=@|03!8_he;#zjZH zeZG0{mmR(w$nZk;bgIkH9wC6ZfN^@{Tf!glfEtktjz|2?hsboyaz{TnQ7#NVwyCKr zV?t7Ub?`7^rH*F9yC?cdZ^Cm0}oR)54GDNV4n?*^*GA#fiT@OTZ; zcVT(!Xs0NtJ?e|dCDC!_bMPHnBPri^`Ye|FJR;?aC~^+#xeI#rt@v%O(K|9uB-7s4 zTHbWDS#RgN;PZ@@G+;e_{t;RQ3dos z**yu?7VJ=_0LRjOfXFL zvODiVco9!=ezS?yme;tl_-1~x?yQ*SmNW8Paz;0wHu^JR%U)IA#$tSTMOAunJ#r4d zs7`LPG%ucs-A=Kk8N0WXXJ)cb#Jsj5pkRDfl9wZoJQA(SERG}QaAsb%yj`6tG*)eg z?GW#>hNUZ2=3-;FnM*scN$VrUc+&bvs}8M+cL4X)ePtW)OD-vUAtQW6 zJJy!r6yYb-23fQoKA-L@-{CTG*F4-s^bR^II;Wlr;hsrPH&RsNZVj^`(Fc>OY+H7@ zO=p0!C%Y%kmZxNXx9VvPXJ{sTcelE4eEQ+I56$}S+ra5IqgOfmFgZWdTcz)6*FhrU zUQlmq<9oU82QG6d+i>j4&abL=|NYa%+I=91tTG&|ZoooyFrU8;Uge6C6n_@ApqeoI z(G|dG5l7Knn0XJ%c|J7rNEL#vM^^a*PkY=r@bI-^8 zpp`%eU2z6{m`5Wz({<(g{E78U_*`j<^V13Gy&n0945u8j7;12!}i6GpQCpRlUh#CH%+h&^;4H|?W#!W<=( z0uR>oe?zv;V;utU1vopC8FpZFUpH`dF#1nX`)=hMq+7t;)Al07J3gu*&Sn4(N-l#1 z3I4Vy+Xu`>csNt+doC+LKimhr08{(rX38{^;7u$#mGF713tC1XmgxDaWRc3@Z4EUG zz#SQ4$>7_DRV4*Tzpb4GuB*s^#9kOKCZPnfB2Vd$c95=zV*Nf^$zh(Sh?4)Dsy4B1 zy}3NN!E*$ZS&P)<=~ljbFXOtHrC|$v&fy*Z4s1_*3nqx3ne0Th*r`!JX=C=O9CXQg zt_G`AV~{yIk&{VP4y&B3Dh(=R0C+ZKGK^gk{M!zHyD3~-P#mrn@F`TwwU9q!CTktM z;zv}}*Ve~O_a((lZCs3pm+q+1k0GX-S%Zapr~hH}yeuE`IwHpjw?dYd-zx@-40X0z zfM==w7=VHZ#bOTM-baN8pJ&kBCd&c#gJi0LlTw7W<7PTaho-wjX1S55mr zQ&ZZ2t2GQdUEBQ3xuR+R16?d-Zq~}KB<|kX6_A+u0f(1W-(y2Z0EI8!OX&>qh z!~V-#IP}OKbs8|KS$JO2W;-9_n0fzw$X&w~es)PWJQI4^B+fB=7Rve*c_oFz4L9Xz zl8s#1JMig{GBI`upH!R;IJP|H{{G2uE&LwQONhA8ddXZYlNsEOt3c3?>&Qvf_p{korl$MZFg;rd&`Xnf1AADf;>yZ`pn3J zGZneoNnhx<^89K15lwjf37RNb5eSxeMwj>hS#)rwJ|5j5|05=EdMp~m1i@mu3S z{Weg)&F3$GMRF6~^p5B#4mF3XZMFHuw(1KQUp{64nkB|}MmVN>581XK2A94IqswP^ z!3PtyezZ_uM{OE@vrWSW+hiJS6RYb{I(vE~_L6?zMdfnbR!iR>#;Z1ScGA#R!6IOT z<<>tS_{VxJT`r!yl;Qteg3Qi5)xNANNw?LRk+q~tt|V#vzL?MNTA2x-(geZ{>L+A$ znawi`i6*JHX#^520Zv*q_292QHtjc{|5js`e}1$7yy!b<$fRN7RLGH|niOQvGERqASex=U)mjS6U&MW| z5@c^D9=zA*x7VJpajjsm2kui<%-ujs+seo#-ONNxa7H^JR+d=pj#QwWw_QETJ!FO~ z&5$_^QDr0rpI538fld2)Wbam%9uE7Z((u!cZJkvjFbPN-pYVpF9T~}LBnOfVUn4%V zqFUTv^E`NcLT`Bc2}@Sy9UnEnpXrdp8``?Baer!Vbx-^l)-TRnd@u9{=ar0sYeKk! z6MPk&!1KPpIIiKOTOlh}A}f?275IEo(1+O%Y3NV|Y#~utm664|Ai$=bf+i*U6r>kO zs^((CDLAiO?hkKp6o)IiJ4}!t^^VjNmRW>M;AzTrBC}9F7c@p_@5cp*zq;{Ph+j%a zLUseb#Uhi)wxs-MocIDT*5N;Til0b)_Rtm}HJTlpsx81Mu@P-Ib=6Ja+7nlyM*{kY zA-XA6EkZvMoekfpyW3N3T$fj8hwPh$_Nv8EOPn83J1`>+nBFnJ7SGNt3khC5BsJex-dr8 zw7x}L^g(d?K43bT(e8x&XArlq7zVo8K2XrK2Wy1Oq&p>Gohazh$**FjFyKWopDzOCVR&UvoUDAsHqEuK?Ts*%UHE(N^-zxoR9)OgI{bVLx0WZ3P3 zhEjl*#PVuYHn%kR3vvIE`ry+>=V^=Sw$pX)sV85=Zn?Ax(v?87(^@>k4!nb2%%q?t zpSADEZUhSDsP-^CZbn6dRXJjtr7>^{F|5#&v)3UX1!5ZQzn-J>z}^f1HBkUsB5P+&F{L|cQf+e*q|pM=QUF|fWIr!J&XhoMsQHJT zp>$+VNjC0&y3?Tl=u%Sfqf068*>)}7l(p~Z)ns59>#Z4<8`U8)1Rz@z?#NbTjYg*9AF$ld)TND|sjl#6>La1J@@=5J=^cg>gokpl$4>~#F3z?K z>(a%8ld$){N2)HZl8%x*khM=J*LUY)Ezb+3@8`-h_9si9FR870Rdrd1 z?=LJLvH$!IKSjS3eW&OTl*4W~)}i5u8W}!n|IzBv`>U%n_j6nGgIvYf{j<$naLLuJ zpm7O4mBv%!1tV-sPSHrc^%IIz&4=%C3RhSJuIi-NCWZ{N#a3cJ!8EcnoiSPaAL3yPc_Lz)uZrI8k8`3E@k4rB2c$mB9Pr`N=k;BnIeIUNU-(rIL3Kx#lHx=(Q|6BZca4Ge6FcuCEbtq78WcH zZYeCPTAaVZYf+R?f5DFAXk2%t*(S1mh_HcoR%2{I(@1#YxK|wM`083*`3?4-QVn_k zBUcQ2#|$}aKNsDmR&{hYLkdF_`t&&IYbrWO{-V7s_!#J3k8#cV?(3=nF?Kpg*lmnr zHg_U^j}wxF&(uKZCGeW0$?OEY&F|gqW+&6d=bFzeFU9;-lqah<;lRA-$fJ}k=F zapl8-1eKE<_)OzCG2_QIWO15gY`Qxj0WJGqPdhX$?)mM1gWqi?yy?co+77y*Wh1S` z$9=RDk(x9Qb(7_ED`Jh#KidY+qZ;=;5qSqB^T05yYR6Zj ztb=|v;crg$`90)$1-^Qeb)9<0`s0_x6t+zS;!nsDAx-+>e!>9P4Pt;(q(vg8<*G6R zx=F(D?p4xy3}SdSd8q{tvPoI?nN9h@9O#91XIpwxx|4z4qnB+}7VLW6@ZpeG`kG!@ z&233v`^xIVE%WeMy=C{>`qgdF%J6di>Z7VP6kg4cZ~7RtGj~Hmp9kCefMOru5YrOx zaA=4rwXnlAsu!6{Z#YHv69ck^Pwx9|2l4xdW8@iakmK+{8s{;*#6{Pu;U&ybAIXEh zqkhE}p&mTHe#P;?$R@`i&UpO_!kzJy*RK$2kB914#04|B`;%_I z3y@@ZlHFA3YT#=zbCl=eO0vst#T_KySXI*m(xL)wfMcp|%upnyZTV4O;pQ?(Ooi*v z+dz!5TW$VApUwY3RdF<=f1uppO_6e=a&d}}?NyZIn5y|5(EerUUDp5hUGPN1yXvJv zU%fP^YEm?0np0ly|LToY;)Pz4VW{q8vnMNz`Ntzgu4W&Q5s=YwIuIT{=EVOa%^Kr@ z?}J)p>eiduu5M>MG95Uj(GKoY_M%A!%_&o`<8}Hbi-@0pkr1w15?%pX*}!G@nrR$? zyZ$`aHbqtXzSw)BoFE!6f zFT$S>UOI@MFlsh_=)$u(O;2ToY7&rBTCQ0K#o|Nmu(p^Hi`eG+6lw`~HzmT-?S7qHmrni<_#?Q}oUvA4lo0!F+wTDA{Y)M7wUiW3@ zGZ$ICW*^n&`^ZcTzm(6Y7i+Lq2|l+tn|wvWI+-#j(-HM(3iar7G*;AJaj?A@w>i~f z7U~C_HH_P>^((=s$?IWb=+-9<^#Zl{ajo4IS}$}dnYX;(qrIO-5pS*2$z-Xgqq%th zAA5%0Z}uLS)&TJ&t^uBBCHLUBrB)hLM>g)hMb8aCvxEn%G5(p zCQbWBrQi(aIqwY8S^ylow29F?W_zh|D=gl%Vy8Gs&QkSGr(nh|)|(yFzIB%k%q_yW zn0--suV?Nfy30mfyQsX4V{i6Ufj$N8)0b~N3&gBCzi0`cSK5HGzcl+z_vy1N-w;8G zIIqL`*W+25UK#bNB>iU!YN*Hg1}%e})dd}D^qE6iT^Z!PmWtmo+wGq7%JKf&pvyN0 z^wFHYX*kkHSHz}zfu0auhVRLqX%CovQy%gGTjMp~d1aI8cyP|O7r*Db%KoQ@V6fX&``eq!*5kRg*j{w{1(?RTtAo z--wyKW{*)`n*9uNZIX|fKKh#@?p4nlub;NIoi}(UKruRCf0mx~*KW$&BN%>NG#;QufEzHFYAE@B`9_gV%fzGs<@$FR;cxq~nq`tFfES;ZAacIw8v5odS){c_q}#a&&T7 zdjFB{X8*8RuHENW&%ip`wSyJ=%t2SSIe?MY?EJZ?FI{o5!e`m{DVB1mG{)#%&ey}; znR;E*PkqOb7uNYE)|w+U2PpCpE46V=q@i1H@YmE|*SQJ`1Pyax&b3_?bL%fCmVr4} z(wG#w9litSm2Ut$wqUoVYbS5%61nI7wa?VeOgfofTsYHo5@*?V|9y}+j4~(urGv6h z>2B*hiLtpdJ>y?c*601XE1qC*PyJ@zsiKJQ42Kverv#Q?V~!{+T=b1W8F$C)brnGlt`i=lbvRt@d?} z`5EjYVax*owrT;{`)1N^wb)TTOrGj1^W9#ZBu~`h`wq4<;V$2MmzeSPYI+7^TykFd z4e95eT2)!OXjK_y;z^7}Tyek6fm0D34$&FQ`(v|7#QtQWW$KU>{sns`YBH;TjE8k? zXT{P`tiuoN890A`zg*j>jWgAIpFI`l?$pj%KNchxbmp~>1DgbTX!u=1hiYgqm7qVx zuhd=x^nXN!j8WazmR7Ey$`K8LgJSlw=$a#h5)&vP+6lBAYlcjj_f^eYSMEkWDOg$h ztp8BAIoEz%VaApJ?2~I7Zr09q z3ZK>}m)6^UUPyVZHR_a%4 zi^0odE}p~6fh_bk9#^6$W%pQ~r?zrlnyHb)4`wH9IC`lL`gUjtCf?UX8d5h_;mpG{ zzBf8H`=7;8#tXP?_njQ8q>K&&<)UC zG)_5o9{u3!6GUsPMi-UKG`euM{2@E_!JMd0Z|Dl?(u)a^-!k?`rMBuH`7s0L88EX; zam;Ks-w*xY@$EKm-A>s6xSh^cYB%w!I#^jz`@9q>T`mNtI#jZtNsv;T5ECjpLA{iZ zMDQ8pbv~V(h)V53q%O6HIKe(~_s!=sWVh)3e^tWeL~HitNd&Kd1azX<8e>VWi6-78Pxmw&lvP&BOja!?2o+22&^Uy*i+}5 zj{(U(Nzg~XP+#xe9&PKMz>YN=Z_bR@>`Caw)|jDdyB_Ne=I+n!Mx1#)=95AtRMzLv zv=I%^xp+XFoQyj>pCb-OFUrc&{XrPht5Ok-MI5#mDa^lMR z0XiR7F1{@_9hFR;HuC0Jb@Xb;#`2BrM^|CRE>u8QV-phcHQQ6NSKf0Iv( z+IYX&Yn-Y-0somi;*g@xq4|OR<9HJtkk?`w`kt^lF&A?&7juo%hB)m)y9J}Wr#I!W z3?!f=$OFHCJdh4~fX@73;B(}o547t4&g6eqHqE_b%{2G^kxP!u7=v>Cy<-Qtt(kJH*#rSH@-#7oXQl_YMCzEESI#;v23jIT=LZMZH3>(QSxK3?ytoSW7hP z^sRJ4yv^E@0sps56@5cdKoQ8r*+j?G_pU2k263TrZ&)?np*`zgRaSx7fm}5#72YtZ zk=HeuWKEP6#}#KkKZfl28jVGDhd5;E(d?Cl!;qh8q&UKB5_#lv8IHOCF*2?g+c}#R zRJtDX>)0i3JtwBlazP4>E3^ASjRnjf2BITk6b49knue%!eFS`{kSKfd+r*J%;ti0G z#*N~6YfD^N)<=8rM5b|+(8Bz_rb4Oyx@*Q0_j2t_a$wCGsU~bw)>c}(5^W3WLo^bg4mHTFBuqiZ1@>WVaR4IfVY%l$8DBnB>-Ivdh#cP${?%Kg0w=_1_igb`r97|6^!~zYY+hk0v!{zjp;PHO zoGcOwv>tZRbm+!DS2nfM_j%<_a1I*bOUi!ap^|se7!&1RQg(yptu3aUv{~bAN#M$p z;N_|Vb*9;fM+@;%R(QG1y1iM8nw!hs_GVYRV`qt@CaF4LJ|b%*Ry=EKo{#5m$DiKo zGVm6&q??`TvKEjns-X{dh;Oo@gLG#avEOff) z!>yc@f%`)oCzIa+=Y!|3c825B4jZ&N*E`r`UP8YWnj-e7!1KO#^*GmNjGczp$Iag% z?KhQM*Q|@)`DPh3%M;{Gj}3qHJx*I!tYVkadxY+aG@J``w8 zT+>B&zg2eiUCxF!=&|bXs1;qI8mGJo@mHX}x%4>CAIE;}kNAU{QN!J_wj@6wVC~nR zrqR_4x@c$L1^6G(IU~-|=%tGWod5JqnxnK9URL_vAo`$Oq)FbCe-%J`X#;spB+~@2 zf{u7g5A0h`sBx8AY8lrp+m5Os1O}eO{*&{#H2GVrlP6Ge243hjr0+-bj1h+M+wa?~|2C-1_F@>WCO)x>@g_G}x%U22l5|L+~^f zWaZxu!8;stZH6P|J9ELUpEg9p{*f1J4ho;mzpl zir;B7XE_(m;R+YKZk%?pk}l=GH*~XqC>5zrs}5K~ZmpIi57#7)@Lt30vqRT)kNG%Q zcEP*fMsMI6=RJP&KC}@vV2t+nL+yR_mg7S>?o!N0v^w%!iq2!vzXOd;QqenD4I1C3 zI_hU-1fR#q?`r0>5nl6VpoGR(=S}k4qb|4mawuRfO|%DNJszvmXDnAQPk-DP#!eu< zH2YU>6`uA1mma_MZwEjhdCnON1XMN&e>IJr%FAkpQXgZs4&_R3C-Aws==>N_8Ygrp zr{iBJ8&x{`OKjMKX%F~CNqWcM;IAuT4z+!VDuH#0(R(>2fy(SLI(r#($=Qe|pO0Pa zz>834s`mi&uzJVX6JJnXG{os+T|nN-;gO*2oYEM7t=b9y+%J0Nt=K!|@lQtnlGpz)inzlODh?a}4%ztBU!!|k~Q|6OSF(atxai(80y z2CzoH3#mIRQeT^jUT7T9cl%iGG6UW{7t*guar*274m5g9 z2(*?IKJtjLWTn4s^;%&qQJev`uhL&xHZq3U}Nj|qU z%ePh9<$Fi^y^r@NmAd`2O1JuVmA1j#;yCPJ9ZDYP<`LABWo&V9pKSr9u8BU$)wp{< zrImrP5No{7=J01JNMUXJ1WE`o%jM`i`7OMMF`_@-Q@sIvyn=q8()vn|NadeF!kpX7i+|7l zWpjOPSR(rQT>1H7Li^ecZQahs1KkF;3!Fcm%ul>mPUOeL!I$Q(l|DW*6&mxXRv6Q`l31)`hBb2FY3Fq**WFifri5d*;FGzC#Q>+ z_J7&2UA;4;-zV=h>=T}%yB&v@ZF{*hjb-1t9iI;soA>Q>A3dA!N+7%BgTZa0V*>5; zK4|9Q^XDA%4OJg*RQWpo_7U_}cn0LFE3{nS3$P--+%vVfcxKnxBk%yxHyXl_2o}jo zeQP!9phHaYr4Gg_$^vUD)-GCBx_0fN%Cd^}e(aQlC)QL5+9X=KW_20%vDh(W9Ma)4 z?T~=altV^*S`H!KSk!pPj87fT{PrpfIU(g6;OI+3k0q;p-~ zJrgn-WiY*lKg0=+ezffBPYRo2(d+o5-`4tM!;jN_GcRv19OH9_q8dIC#ps?>zSA$j z9&%3kUcV134r9D%ZSlA)vzhH!v#!f3WIxV=-t6MbpfsSAT8lqy4mIoYqbKLOtgRam z3y}?pfCDzyf5f?* zIrNR#T}8ifXzC{ifI6KerZ=UeDn~RnE6P+gjsTFG(+QmTg$W;^x-s zT28yZ4)Ij+LcRD@t?{{;&*`FteYTaOkdwtMfUo(G4{2_GG1){78h<0d$=_o=jaN@- z*=w9%_WXxaWL99#ME8yPO)d^pFKc7zTe;)5Qw{R;_tLOOVs%tZ_HUkj@ z-ZvBtvmAPg%gWsHQ@&wq5P~Ixv)m`?aGU84{zaN}2^jjxJ#_Ixhl}F}mM84(f z1BC&1NLOwc+`}xGpbzAz`s^H)pK1l|z}kVhra!;&H}n%}bxh*U#``^<1^JQ?G?s zUPJdI=4x@Dnr1zt-sieatWneEa{1qi@cIAJo>y~^cqi75y|Dtsb+#FjPv0HJjF(s) zuw>@KH#FcE%~g94XB@P# zI3Q40u3J)8wp1uvPYavB^4`2)k|sZ5O=X3}#q(!A{O}@t%z5C^N4#?$TJ-RvMKfm> z&n%uQ_*XA23krElao_!rG4K>YZJ8-M^C z(dTm!BeW`hc#r|JuAeM7^Lr=YowN?ptb`X3IN1isC&q5h7>EcPf3`f^Q69ZCZe_5BAzNQ5MG& zz2RW=;50#$$2&Ge1jm-h?T*JI(;eTs<(boXhVFf{cZM)S7Ha;gZ0Iw=Pl4X^L0>p% z=)Oyr*<|Xr@b`#3Y=Jo9s09mq^o^R{vXF}&IFz{mw|%tA8oIY(m9@s4$hpDEDY991 ztS5Z&Fg$aIL;pGglt`R~lkXFHkZqIR^nBkiShOxE>(%P!JoVUwDPiO=?#Zu_Y6@Kk zLJs`;tY;iz1`>B~9K3tc;N25&{i7a7&4C(hC_>}#>-`?5@P`g28)fPpdP8a71mT?y zL-z&k*JFL1(6HNt!yVz^KI~N(a+XTkw3%AYbm;j&KVgx!jmWElUv~Vmz*CP~&unbByNavX zHtrM5``0wC4@pJ4uETZiYuESUI+e!bx;|39aZJ~k z7e2ahrE4Lq%GP}K?6=SdG*5FMytIMKPm1I`q|48a81fwveWQ(}xk6ca>ri4%neV$VV*NrA~j`<0^P`X|{FhwX;cb z3Un}N&%Jjn9IU0fBmazH?bC^yNS*)AR*|ESSbZ z(We;3fsr(={}oBo`U7;&&iKnJCJU?#FRK#<@0!4*UDF?e|FX#%frN|H8mZk@^PBF` zpGdm|V6F(o(5tJNs^02xVSk1`#Q9?AF{57f9`vDeun)~L?qOVeC>mmkbDy4-Hs)^x zii8_79ykzo_7!GYo2o~8sP-Iyx&(UrH6sjW$~Q3aus7xBt+uWvjJr@~>Hq zeyv=$a_v9sSip1&BfaL9S-a}o>1R1{c=(+1o48F|&rPR=uwGlwX&vXIN3afIK4iJZ z0}JL8vvCOhs({yR#lf`hWr!Ca!xld#0=Nw;!vGd!I)CItZdP;vbBpA zSFJ6(O`zT4nkR(CYu2q^S~*oHT|)L2jP+DuW!Y+N%(Xo|^YOgrDE4DVZ|=u*p0*97 z-3^p*+MbQtPJSh6V$y+8K!6cU9CVLX`*_b^luPmPo{QsHH-Hl;(##ibuJ3m0DO$s~ z^^3*FE~UOSau%}*_u4Acm(E+ddujVp2DDW2ST3#P^0>ogm1$l}&4-4R)5Gd@c8kPz zL$+bQjf6Ls=oM$*;*F)dOz5|a_!kxMIhn&njfek+e(glPs116M&rm;T`{R2Dn>ZC= z9&47Y5SE}1)@n_L{SP)Jz0PwCa@)4WTLa)UT0fGFA5nGDR`>>_!S+Mub1te23dnAnYU_u1Gn*-tH=av8HC*MZwwNxgA z7sFl#Ni^xSCCqD-D+Fo05+n89n5~B5T67qz``#*OrLi$;V{!+VPu&@ zR#@Q8Bsr9J8MF~>f33!eKKd~tM8AxX4!vRfZJ}^gLqM*Q$`2sBsTn)jyHyqUE=KeZ zav~v0(t(yf9Zx@xT!3{RoZEt@{}geee^XCCJ1FTpwElJ6G9Max^EW<)T0Y(H*fyOC3 zae5o{2EFXyhUHnnwDiEz9&Dl#a!*(NlMiO1->LR1fWBJ z7x=~vD6PN_O=Z$HX(Q$3)H`;y?|}d0OL89S_XByT%?7mjt%$Fxp_1M<;`G0T4fY83 zp0xkO$k#P!Eq5R@uZ~eK=m%*nuXpmM0~;Sj{Z0M(8~+X8y8ecZ%&{Ek=xHIx#!-0Z zHylgadB|zW$fzwHre1%uX90X|8TKa*NOp-4cz9r9M0eP4P>dR2MQtA-l_Zr-b9W{2lf>4 z5*FPB+hY7FnpZTBJw;yO+iNOT_*XBx7t6E_Q;ntI?}0~V3-im$*OgVSz4w+Sp6S?H zQ|Y?361H9bC8cYZCT1c{$0S^9Gy%a)`#1CE!Z!Hy5=auu%J2>>9uRnigun}_0kW>P ziAzWt6;r=@+b~?ar5t*yqU;H*lM?3os=&&!wPpXMENjabN+Du7SY#org@n7M7enZ| zk@ZX-RiBBzP4COr_)qHTv4is?!GFS-B}3~)COl6C>@sLyJGV&yO&HtLk=e%Fl#7|1 zgB?df>m3y9%PLovu7@g(ttzctTUG%Wk+Sb;Ydl!hRH0%G^sD3%n6Pb_@SWhD84s8Q zt1Vo9zFeqad0$kNRs5`ic7dHrcTb8(-@TAKcF8(7$>Z^vk)P{8pV4OabSOXV*LN@F zOgKxLD>HCLQ{JNT!beis`MY_3RUyxNzcJ|d0*{xtGNbor%ZU_O)bD}Z&Z28oUwOEE52SZr z;5BGUOE?*sI0V9dtWLCt`ur(P`mR&`@Z%*sj)YYgap3Z{g~^&6K;8wr+)BbDj`7-h zNY?9sCKr)C*arJ!GURkbwXElWzHJ)WPxGqYB{j9R7IM;QFuHMUy9gIoAJ}WBGOsF{GdsS#PxU#ei{{TLb$MERY`( z{t)U^0IB{cj&-?&Hd`D`(Yv&7tKJ4r&~wU{y(!vTEvJ(QS24U%dm9(+f!8PbZ);?Z ziJ~bd25ErDH{{@=rx2^d@}%*)y4ROi%%RogMbz458h+Z)&g|7eG6PvMf?ApvsW(4f~cUN2M}HG26zeWwt(P*sCc2&G(bVY>k6nKD(f9f)4X)Q zU{-2Yub3KE8k(m0S}moeiMg7FX1y-nc3~Ix|9#Fm>!o_%&-;7-htKkznKLtI&YYQN zo_S`TXFwaDb2_Rh~UF=idrLXEoJDXE+f|IOQ_xsmerOS4rCeUb8?O-CGq)(KM&YWi5rnpiQN z?o_V_(#3$@dNUj7t&dzodiRa8*aeZO74N3q4mFp*{G>z6U72{&0sFm^DE|uN-vRl* z+7z=O-()M>W{O#)fMrP3gGupH%`Vu(b14KaJD%QQO;#NjXHaAG^rRRzmY7R?Y$ zd3l9GPHt|YP+V%F8B&jXK@i4EbV0$MR4Uk9C9U@;*b*fP0E%XS%!KTI zMvln)=QdS+lNcCq@L%z6q`@HH0f7d1J*+@7FLgMqr&iB_NF7 z#@VJg);QW20%S>>+kU-CyA!l?&+?s~cs^phQ4XKGan3cVb~5lzEAGb8zUC*!GC00Q zZhm)T9&1t~H`8F#p4J%adt)a_phcoe4?E+)p@RA_t9_4KA>_{$FwUdbixM4^f!X?g zYC=Dvc>|rTsMPnjctJ~#bWVJbPn;#DM5T|lyk&f6s(Tmllzyiw<(7?hZK4sDXVk`} zah9|7Xo)KcD|-pwy>(-F*>Ib}OXBO)KGD&ImY}+bXq^08$HT5lcy#C516Ey03Ak9= zqfVo51ZaOBl`4@D~V0?viyEz2AV^VRy@_-6I?Ut4xo z8P-%*O_yoRqWj*8C>m!w+KiaGQslqg(N{QVjV$^nPVnOOwY4$%S8{j4qDTggI9d)G zN&164^nCSmA(J&%*T;f#c42hZIsDLD;cR;y`HPr-M=kt2x790!SFACxMfyIZdP_M| zNQ?biQyXC&?8m4YibVe}O(fmjP#=wWoc<*|@vy_6?SxFIEuLweqZdlW9G<|Wg%CW=FKHhRXRzUXXV13 z^%DO__r7fOt#6N(;U)HeKd}#InR4gI;*-LAEEH%!?i>O9QjE0bnmIGC#Dqx=W-%Fq zGC?FB6sdrxx}zm}Fey=UT%i3|2d*oX~*42gIXHRO@TTjS&;*tEYVi(4L?5Task{=QVd9_#6KuD@pQSB|7sJ^vaezId!X9Mi0 zYlR-xpr}5U4pC9HEX-BZ~C}Xzkj9ue&dQ&hY$t13QJkgK&L+bj>d_{C~u=EHPg@VFq zq6bZ$#Ej?@zkC1x^a*H8r6dKVhAeeN3c9F9aX*^GlU=g+0}mQwsY}nEPp7~uV4tgU zKCcf$UFa=bSGB&6#fm#aac2l-@2M8pgTjeKM#};#$$2?}w~}l@A+*@z-4`GSha4p0 zE67)MF>S2P_P3!wbQF3&hnhtV$)$%NcQ?kg*fU(s_7~hN;vixk#Qg=>H~gs)R%`8z zu<5oRb-1_r-NLg1q!~<&{~W8F{x!z7-Dp!EfT!2W5{(wSzq_`+1$!gEsaI{gWdGF- zPJY{EyVe2wzM7IUSR1iWxD{`C1J(pEx3RJp2UL`l@)4h4zWpxjdY2U4sDBOOPpf^K zt7Kod=`R}xq>%4t7u!@lpNkk6%EDS;Yb73gW=zf2GV@15X~{=}tZT7uP;X!3#BTLa ztNnG@!WmGq2_+xf9AC1zjLx85k*W?K78@UW4y&;hRh4Dis+JhJ?Zfc?7U%P6+;&Za zH~VGU1$(oz1~Ud>_H<|&(HYM^*0xrKb)J}io^y_fV`01NNNu6$9_7?kDXpAvxt>G( znT_;@1#Z|pc|H|yf62bejki|{Wm~7}^&u8@T^F?NNLbqIs_$Q0ZSAXn#PX0nwswb= z;q)${f{!qzsj;W1uu-TID%4@W+Go4Nt=)vq;{NUtja#Rl#AtWak&N1J%eFdFnRVex z#}HDVvki0Us^aH%EkaL%?-$pL;;6@2qQE&QWomQFL1pTUFR-)L`KvVE|EtNI(s>_^ zBw@(EnpRlDw_+?i?dYL9>d^Y1cEsR`zMQt91E;xNVLE3Y-ux0t0M_A*_!!t{5vZ>v zp|;<0?L!+OPJEc$BkxJqINSS;qAizVI)4W#nYBpF1@b9jZa?9}dMbexZT3Qe!EwBE z*wlpVoM*9}FXUh;w4OOw$tbQVt%2UNwaD|7et+|n(#DHrVGCkVnx|a7gr#Dxdteif z*~Yozg|hmvig@EC^aTah#Ylg-Tg$v(iQW~&@O&`N1$Y@)r((h|%%y2)n>9mZqak{R z_yDtMd6c`$RTGab-C=A$(h`js1G|yA6GchGpCk?su*?{C={7OZvkI{UM_$kuZ;gV5 zXo$uX=1s~gn2T@>w(y7o5n*0IasK^6jK5~d43njK__C?1VReA@=xfoVE#WNgmN6eS z%kx#&zmd;zw$qNNvOB21Po4TQ)-@P1$M$vnKZ5lBA}6Gqs?#-ze~mha&W_)mpKc?F zp75)^LyM%l{Rd{1?XQ+8AZ^l(#-B5q~NyY*|ahO)*H z#Dqm_9Ko=O!o8qJKUBX*@AIL18}Z&UNAlSPlnOnd8TwxRA=Sd{&0k^t-P&ON2InB` zMxB9+xV_B8!Ze^y^Bb{iFN`SFoJKxHy`AQIG&)9A^hv3y_qHk8YBC zM-iH?;e~k9M#wtS`nK3_x;HwSb&aM#Sa9YHrLzMa8sI+Q$Y5&KCmW;hOAq}(lzJ5Q z;W683?3xDm;p_*ln%=KfLolao7==1bXr{O70lM(;-L(Gl8}}2_e$v#Teu&iso0wW_ zoG2#^#R~Rvj1F6xTGi7xYm0AIoThB(#|?ojl)fhmYgezYxMZ(!Z7&JKIw;466)q77u8L7p|F0SV5;BkIHpU(ckS17u6|VIg#xTMG+7G{YP>B1W&ze58V^0G zH?VN)Vol&Fvaw~&(TI1D9%E!M>b@gNcpUk!cS+ycCjzIBYIKOLL~J^5D~R~!MawU$O2+dlVfY;Z#YWSf;io1g{DUN zt;rv5D;aGix`e$>BHuG-X4bvsjC<1qk-vKx>!|UdA2Ik54a%QXkTpFoOI()1Dy(P4 zP$1r4oJv6Vd1x}v)B67da$69uoavM1Oo!Y6yp>3`?oUHX#d)%z zsSP?c!VslZ}d|!yr z^D$vY9!4&4)RJV(9NHIlLxdYTsZaWhPy8*3uk-RA9iDOryF?tAXDx#SmHKTm-gk&j zVcqB$0V^iyj4#zi$DP(h$9x|#EN1?aMEBKCBR9TBX*j77Mc%?nqSdX*X^BklrV=`Fn@zo^1+B}MffP%AF z?E|YxvMfF!EMYFKo?!=ibUV}yZ|lIfQ@&LaU6n9*ODIW6P6~lm->^vRC1~Hm)=6@c z@4(+Cx5V#%tAs_{YOmHO%$33|0*CzvF@_dazSj(l!Hs}dE+0t~*Gt84SQ@QF8hrp@+FPiyOK49h=f4|aH^ z3i-srXT!F%)IWc=|8xK{LZ-xiN741`HN6)OY-^Nak z!{Rd=YEf@uj`?zqwuGPURif4#WB2Fh+5_EJNGiLh=t`apaoIm_R;R?5xa^-cvtAvs zYdrXD#&2p}yOZlftfN)kwH8=3_8Ev(gr4B>1)P+nwz8Lm?ERSga*>s0-uhICy8D^4 zI2jGHOLcgi{SqwfdsZu8i=f0%McOsq)5CAM0$^(+Mw@FIY{aac+6U&Xg2u>|q{?y3 zCHKd|`o8V=eG~_B5>XH3Gt>*8nwHOJd#ze*HVq~}&gb$~q^#Pt#R+XXU&C*l!OQm- zr;>|7U1CrBvs@0dUB78C#&h&m3Yk9As37S?XPdOM@b5jvRvb0l*5x~F zE&!hb>pbnOryMmIH?bd4w45ELMN2-8u{@{14PMiO}L&lH*mt_Ip98yuZ+SQ9ykDW+JerbID`D#)5N9hC)iPUt<9k>M zhlT=nE^xv+tXd&f%!riJnp~Wo#Jbw+u?_ylw)WMDvVC6L*ro4T!_$NmYc3s6c8am}eQ_pbAY!ZM1ba;g9w{f5E-MV%s zPA@obAL%kyiSL)8&mlAeaU!i%Ux052HwTMjopd)bH$QJ5=X%A_i9MNO_|#Eeqv30- zq3Jo@V$w`NK7C!MF<+~mcN0AAQSh=P!QNL;osWHP4g+j_aRSQe54#w%QBME-Z1^}T z7kpfG`RR{hVdVMr9lnOxiq(+1owq;Vg15YhvfFkw(%FqeTUak23uGPZs>`uc zu@jA(3ZpiL&u94FB#nnY7WxOZEA(9?^fzds$4hO@w5Lrv3)?*JLV1`?%UzhKORaST zw)qO@f8$wa)B^0u0GH#~Ar?9OR0zV zdFO}Q{CGYo(PqxjW*g~y8;syxjQHYaLnGQd5B-_6Y%_KSOZ{C$%)T+`(+h@$@IMnNaEE z`ZBUenn3&igE@8zdlL6^Mgz3mqPkjk?7?h-~d(eH( zo{X`M@}}}&T~_=So;+x0CBEV3kPAR!;jFz0{UvWj;%~YU3gePzR|Ro7h5}Eyz?&`g zq?4Yl4DdXgOG||1YS^BT=o)(M^C>#)Ibk?2#h3<*Y~Sg+X$P%?%yzI%t7%uY_x7;z zMQ32ia5K?>8k`CquPHrgNcXfHT4h%2P1Gle28yk_Q&mig!pgdxuOEJEzN!Dv2itxf zbg9td&Fu5jA}w*^?GxS6&|K#74X{rc)CNz|9apzL1xj$sJTf{bx`0kA=Pil1*htPA zj{ng)Ue=S2z;)3Dpabv?R3`qW37?4m(If1!Dzpk7bS#Y0vx#bJ_+3BJPNe)K3IpmF zk%&{uYJk{=ct@DXJ~xD{gHGx(Sg$;c{6WnJgQ{BV?DI%-dL=#$TDsI0@3nc|o;ujO zb=$vgA&$Auo&%jMHT0-05A?2!;{IQ!{b}fG>I^QsRpf$O8O`}@MhvV1P+I>KZ{d>t z;m<;<-1g^SyK27c^P9uh#(e(y%~@+%4{5~5$*Q83CdM~Wr%}@9D~Fw8pES}g*Bqzw zCC}NXHmz~^X0LIy%D}E!gDRa{r-;bSSG?zi9odzG%hApp&}k%I3wzqrz?sPDhBYZR zQf%dYu{-ZqLQk0Dw*2Wi7ehX9@WMHJpC)b{X`Enf*AS7SOpnHjVs1V?sb#$M6kPTh7>mrimM3bz z6R-ndpJ;8=WMEg{C9>@;Y(9{P>6sSqm?)AI^F7IhdSJzv!h*ku%8FI3j_RbZUS4$HpzMB+gp zQ9;;bV20lg>Mq#7_&inAK)+x=@Hw9<>O3-vQ4LzCl>NDMCa=u^4J;{qHqPGhv&^z} z;3{u_X5y|{nU_EP$4Osj&4`r|U!!x>_lP&^ZbM3L8k~dptt~Z-i}u5RcKdx3>J=%) zxUle1!y4;*0L|=ny@5RuW2>)WzVYT=#|+w-8svvD$f_tAAF?@7dv;LC#zeIxXwX+3 zpt0YHMct?)4q4o{lC?M`L#=B4Dt4LrrWkKbVk`n0p7YK*dYFB!v5jqTCW*$v{dA~- z@gF;H+`tU-J6+0CAv+RnXIZ!!-#XS25R;S?hW{f&-h&RI5xc5tH2xMyMy!1?LU;$j zwln8#QeHFjBP#*|(o8rJDX{@N?QL&rp_xni2M;&9>~BJ=WOpO4+ug{R%O2n|Byzi$ z;KJ$8OGJxaF8d897dZgm(`BEBFeU73jext}IU_{d^Tt_xfB2>%7t-z2)k^+}@OxXO zRO9bUbpomOB;Gh%-N0D*Io3^uy$I~5WTpZqx*{?7?2XP*vNq@+u654aHWzx7IYk@k z4Vyjjcus%hOC=Zp_q%dlEZh(E(YG-i1oRpszK{}xO8c0Vk!9#l`MwsTo#a2!j~vgm6$P4cC_Bf8|nLMm+|~Ew0U`NZ@4nG z&fc*xT&4^x>}UJM14BV?bbEYpkA>FRlN;~No){Y;-n(Isa)AeHg}F^kSi#~%<#(H( zg~hHMx4qO!bD6f7%Oq$tCmAGfO!(Q}&TTC>XuMBVmMgIKSZB96>+E&nm{n(Yh&n4Y z?wNP--e2rm6>@A>Fk}&jKQnZ~-huD9@ZkI<2LGhsZ0Z9o#&ggc>b%`7=Hx6p<5U~06({z@k)h8t7&L6KcMg@$w%!XmnK(?>;z_qu)nt1j|&{eV(*sqz0hYy{B7;pcJl_qpkwC!9I^ zzM5rb%uF-NdzTIY%$)UVUziPGC-5Cc2w3aDHyH`s2pk2R4jc_!0L%og13m$)06qz< z0geHt1INn#aX{bYJpUAM8^Xr}Ujj}5RsuN}W0!z^;9myp3oHf>2ikyT!1sZjfpqbR ze**rwg7mz3GL`_xBfM1h&j(WZ76R*li-0GAPXiAFBY||S5U~Fa{^h`G;1VFc?^2)( zxD2R7`PpADCtH{3mafOCLg^}Ral1953;)zgsf?k7D`3OHSGuzRco=?FpcJkWFsFcD z1Ej09AOh3L=np)B`vEe7(lHDCfxy$iwm{0ios8{)b?^rP=?WGYv%=p2cm>!INbvb)bj{`%1 z1|Y>t08;*mz%B?+0`>q70`>(a1L;Z;q;d`hK7w$gjHy7n(gYEhTY|g)6`YclzRma? z{Qf}yI)&f!aIeA7ORG`K7j+l$qHjnJAB6DuqkkNy5c?B)701i2Mx?)u-&Oo5zSjwC z>HCWD3z7e9^lJ*EOJHUcoLuat&4m|Q+XO`~X{qHVyYg%MqU+9@* zQBa`L&>vl9U$NDRo?BcKdx7P$AuNt{VrWo*x{O-Aa$TYn=z^`ax z1Di-n^h4Rr`D(Sa%i#iS*in0>htt*5SD~bOp!l)AR6A0fKE4{Q67CPyFutE}bASr& zgK!&>wu_uL74akG_>+)7X4GQ-WxlYHf;{P23w)JImF(s~n$&VyXqPjM>{h_7mE9`1 zy=1o++_VFnE>$4P?RghLtMx%R<WudZG_gX)$)4<3M!SC9Nres(#YZM;MU4+>NxteaehhvC-C?nm(51LXKb>)OCg*JF4V^+3w!apc)nb{kOsc5qXk38<@Bv%W%m%cqhxnF+`VKsR*{sw;ifVS7eV;dAk<4st&8;O;29VVhYS zBD+fw9xA)%qkh2Iigd3`$Q0{@>SqD+>>$^}Lc!a6fSms#!PmF59DfPgKu0;wQn;1! zJ1&D;CA*gkk3ANGINz>j{0gKEmE&`+PMsp;Jb9N2MkA&6;{+iJUd8wp;8oCBC#M$3 z?}U{M3B6?Wma(;rIvM?C43IHULPclc<8{b~dI{x^=WSWb_$Jm$I3oKy!cXCO&q?^L z?0-?lQAkhs6*Afp?kTU6<9wy^#md-6#(oldak|>)5kCR)M0y`Dg@jt1t3crzFUhYM zD3zCgST6Sv*`Fq%DqTb>$5^=>r{wba(fg^!NbxvMLM1QcQMeaQTM+9}B_X&m(a-xy z=-*yKKh7nUFG%uxg~-@jLREx>To(!XXbCmlW$Ym$l`mEpKs0;=Y2ugQ`rd=O)%h z{GLv2TVWxd+r-+5{wBnizH=L)8`YO@J7EWv3&b-^uD`+XJAJ~1hbcci@A*xXZ_M5I zX^`XXlkqDVz2x^BO6k>e@5axP!(XTTP|nNf1B40Gu7UnQ0Gk1%_iQW2?0el^>XJ-oM*k*wf`Hwkw7*D)M zax^FM4haaSvG%fyiDPR|A5I)smjh|+e7zON)3}-G&52`XqZh~1IHy85je~i<98Y6l zFwhSeX=CE}wOzsSG+sq%IG$*wzl!6DPJRFk1mXD9`ak|1Q8!v~Plz z1MTJ5%SsNk2f8x|C;D|8`Tp5Yv}}!<?R*lkt6kXTmu?6{woY@oB)< zXK;Kv;Vh0H3Jf!G{4n5vMI1kz!hspU*m91CmKB?U`y+v00Y?EBmvQ`PAh&?yGlBig z9RCE}hyO|7_Jtfj26(lEMsg5JBLGmQLt7(njg$4pnik=;0G0A zRqzw(`2*>RPuYz3B!0pR?@7GP_XwW^Jc4rNQaIx00ZWn3 zWZ-$+p8{Nt`_!MC$4T^W%~KNnt3~~VfJP>vee_)f84P}HF%N_dcg%@+rDyK3<=rz?;)>^uY2UP1ulL`;-T=jCSD9!Kk~b{U4=KipGi9&{od5yI=nLO zr-7f$Z&I&F`LgS~lYedZ!V^FA-#hnC>*t1j)9b^T|LXL{(?36UU{MRVIN@N}=9~-u z&yT2$t(x87wJP^`|zh_PR+`}N4ssE zQs4f?Cx3kC<9T+!wZp&d{f}AKJHMHA{_)St-3?c}-73Fx!v3S<&BiWG|7_~*+~Bl3 zo1AH`RjxxWrz@&Cvw3CnuI6*is+MjoLt19EJlFDm%kh>gEedxBcRzQcdxCqm`&suE z_s8zT?$hpTZl_zzf>|_shz(++*m%(Nd2A_L%U)scuz#>>c8DEk-?MY_ zzoki1`*Zje|M$;PaqXCndzBl&y&7CFb;EyMJ{8xV(uMus(;%oPhRj64-|!NPxFf?x(#~JR+R7XEEq`qP$bg-wQ8jhS1At~%-A5v zipJyT3pzo0E5{;Gt(+qMpF{tBCveY4hEI{p>O1WLU+Mim#AbEK>k@u#kRL{Hgz&7v zpWZ`4D%WlJDK1@y5tqh0lFZH7Kzy5u4FR9~JHjcF|L;uXEqo!6AUE+BB)KB@5V$E4 zxryIskBK$8iRWkqewN(Ccc9;hZsI*WZsI>YX^98%LS;~V;zK-c;zd01MSeuihj1p0W`?#IYH&a=8{f$X5m~#91a{to2+M#a^XReMU3Q%jvz^H>C9rzk&Y80x|9& zF=%NA-;fQV9Xh`$bP3-Yp^x0wwVVF!sLtJA?&05SWp7u^%((M?hV}cTe`Nfc0XGLe z`AGGn?H?~Te3Q^Mscg{K$)SU%8h58U(+ug0ht>>p4(~gnVC1W#j*q^R+3CroF}Y)x zjC=j5-Q$l<`0?pWS-)pDiG-jU!Omr?8~y~1*;ZZS}<_o zGYfxM*lAJrqSqJwu*kbSzIfBzKAZae;RUf%EqD%OjLWj;9LVZJ) zc4!Qm+5TeN%)ny-1O0dSg|uGn>-3)Hbw*=U?^SkDtVcJR*;409b5=KYb8Nb!x?Ozp zQbVTg%YViHvEy2&-_~Ez)Gxez>z5f9f3@bEuRAxk?(|P%&Ybyi{0|pSPWk?NZK*~1 z?fS37PV73K^3~a+MPIf$vi%F=p{q5kKaV@`(`U;+?eobm)h~RUzE`!U=A-gmhAP$0 z6Cb|#LEiiQcX+>daohf_uf4nIok?$}Z;5{^YI8_s;G2GLw0_SMl)oH6MpLISn?wJFtx~RF85!)W!b=GKP;WMG-TE<;qZi*XA2YvUE;WxeKW6S`ZfEv3 z^Ja#hH{9J2HWv5ZK%6_~XvD8vd~tC!(to)m1bO|ibl|cr%lwgl)AG41?yM+VsjApm z(QVa%RpXvja(%XyPdF|c(TQ6?&ey{(Iy!T)H;KYZjorbFNT{R!6 z_N4E9;p1Pb`+Tze)1N+zJFxomt2M?$+rMaar0C1DM^nDqbv*3E`mdGWmRhdYPWk@A z$?-p&`Eksd(?5-^t2>u-{#Waai?@DRcv(}w{z|9cc3g}97O9VX@_=JG^Bdgg!5OVY6uvz?nWeGcsRARn?R4PQYn z4F5r6VbYw!g5uI%!sO{WQ;KAL6rm?6%aH|(d*ygQ$?mTzb3N{}caa6v6xk#u_#Aqk zDQD6&n5C1A1VLeDT7k(#S}nMFpGv)uQv}l)g>&)#GiSjtEEzc0dlZSID#2i;Ih;3vQ$Ac)(9_q}$?s zF%4oHW06csgZq>g`A}R5m=QiPpV-(0F`PV!ln!g|xa6=n%Fl>0#K9#4(#6H~6))-8 zNSPqU6EjSpyd{5}ktHOh3n>MKMa4o&Va}8pWR({hMFN^g4k>lZHAV)=rB5iEKLNS{dQZJ34TROf>7MT{$Yv)+RVI3*^eM?k;k?3GXbrMeDYPYzRRvg7 zc=WM*PmvPb&091*^|!f8MydYi{HbtB*gJNwI?z9-=M<6&EEunv2uqr|p3Z#`WnVwj!||NbQRn0<~cPwKuU{Q2UYnXmMhAA~j2Df9Y{a2^m?*Pb3c;ot0!v z7&a_9J!^PI^04GV9#wzQ#GhzBC$i|iMpGh~U|UDL3A>Cr)3YWO$VSKt^JdHfLAvXg zZqF#5BdYkycRk+8)8`cBXL(LU5X}laP^Q#jNyCSx4jY`6G#q71A|uk0Eua6bFk+vg zx{&+VAjv(5#lb}$=zbB+yQ_;w7C~WR6(mQ}KfX^BSu!5tY2ri!Wpg6CVZ#bp3D~#D zCPyzz&7~A?V{)RT-aee})3h6Qh3)}7hLnk9r#49_*C_4;Nj(bEGr5u;8 z9AaA$64fQjcSzkbWmK2oWUui@8se0^Tg8nF;PObvXZ^7b^8*i+w{dfdu9bcrg%AVZ Ii+KD02Wm;xPXGV_ literal 0 HcmV?d00001 diff --git a/bundles/noos_exp/inc/btstack_event.h b/bundles/noos_exp/inc/btstack_event.h index f2d412930..32610c414 100644 --- a/bundles/noos_exp/inc/btstack_event.h +++ b/bundles/noos_exp/inc/btstack_event.h @@ -1013,11 +1013,11 @@ typedef struct le_directed_adv_report } le_directed_adv_report_t; // LE Directed Advertising Report Event -typedef struct le_meta_directed_adv_report +typedef struct le_meta_event_directed_adv_report { uint8_t num_of_reports; le_directed_adv_report_t reports[1]; -} le_meta_directed_adv_report_t; +} le_meta_event_directed_adv_report_t; typedef struct le_meta_event_enh_create_conn_complete { @@ -1045,14 +1045,44 @@ typedef struct le_meta_event_enh_create_conn_complete uint8_t clk_accuracy; } le_meta_event_enh_create_conn_complete_t; +typedef struct le_meta_event_enh_create_conn_complete_v2 +{ + //Status of received command + uint8_t status; + //Connection handle + uint16_t handle; + //Device role - 0=Master/ 1=Slave + uint8_t role; + //Peer address type - 0=public/1=random + bd_addr_type_t peer_addr_type; + //Peer address + bd_addr_t peer_addr; + //Local_Resolvable_Private_Address + bd_addr_t local_resolv_priv_addr; + //Peer_Resolvable_Private_Address + bd_addr_t peer_resolv_priv_addr; + //Connection interval + uint16_t interval; + //Connection latency + uint16_t latency; + //Link supervision timeout + uint16_t sup_timeout; + //Master clock accuracy + uint8_t clk_accuracy; + //the advertising set + uint8_t adv_handle; + //the periodic advertising train + uint16_t sync_Handle; +} le_meta_event_enh_create_conn_complete_v2_t; + // LE PHY Update Complete Event -typedef struct le_meta_phy_update_complete +typedef struct le_meta_event_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; +} le_meta_event_phy_update_complete_t; // evt_type #define HCI_EXT_ADV_PROP_CONNECTABLE (1 << 0) @@ -1106,6 +1136,24 @@ typedef struct le_meta_event_periodic_adv_sync_established uint8_t clk_accuracy; } le_meta_event_periodic_adv_sync_established_t; +typedef struct le_meta_event_periodic_adv_sync_established_v2 +{ + 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; + + // [V2] additional fields + uint8_t num_subevents; + uint8_t subevent_interval; + uint8_t rsp_slot_delay; + uint8_t rsp_slot_spacing; +} le_meta_event_periodic_adv_sync_established_v2_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) @@ -1116,12 +1164,25 @@ typedef struct le_meta_event_periodic_adv_report uint16_t handle; int8_t tx_power; int8_t rssi; - uint8_t unused; + uint8_t cte_type; uint8_t data_status; uint8_t data_length; uint8_t data[0]; } le_meta_event_periodic_adv_report_t; +typedef struct le_meta_event_periodic_adv_report_v2 +{ + uint16_t handle; + int8_t tx_power; + int8_t rssi; + uint8_t cte_type; + uint16_t periodic_event_counter; + uint8_t subevent; + uint8_t data_status; + uint8_t data_length; + uint8_t data[0]; +} le_meta_event_periodic_adv_report_v2_t; + // LE Periodic Advertising Sync Lost Event typedef struct le_meta_event_periodic_adv_sync_lost { @@ -1132,21 +1193,21 @@ typedef struct le_meta_event_periodic_adv_sync_lost // {} // LE Advertising Set Terminated Event -typedef struct le_meta_adv_set_terminated +typedef struct le_meta_event_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_meta_event_adv_set_terminated_t; // LE Scan Request Received Event -typedef struct le_meta_scan_req_received +typedef struct le_meta_event_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; +} le_meta_event_scan_req_received_t; typedef enum ble_ch_sel_algo { @@ -1156,11 +1217,11 @@ typedef enum ble_ch_sel_algo } ble_ch_sel_algo_t; // LE Channel Selection Algorithm Event -typedef struct le_meta_ch_sel_algo +typedef struct le_meta_event_ch_sel_algo { uint16_t conn_handle; ble_ch_sel_algo_t algo; -} le_meta_ch_sel_algo_t; +} le_meta_event_ch_sel_algo_t; typedef struct le_iq_sample { @@ -1168,7 +1229,7 @@ typedef struct le_iq_sample int8_t q; } le_iq_sample_t; -typedef struct le_meta_connless_iq_report +typedef struct le_meta_event_connless_iq_report { uint16_t sync_handle; uint8_t channel_index; @@ -1180,9 +1241,9 @@ typedef struct le_meta_connless_iq_report uint16_t event_counter; uint8_t sample_count; le_iq_sample_t samples[0]; -} le_meta_connless_iq_report_t; +} le_meta_event_connless_iq_report_t; -typedef struct le_meta_pro_connless_iq_report +typedef struct le_meta_event_pro_connless_iq_report { bd_addr_type_t addr_type; bd_addr_t addr; @@ -1195,9 +1256,9 @@ typedef struct le_meta_pro_connless_iq_report uint8_t packet_status; uint8_t sample_count; le_iq_sample_t samples[0]; -} le_meta_pro_connless_iq_report_t; +} le_meta_event_pro_connless_iq_report_t; -typedef struct le_meta_conn_iq_report +typedef struct le_meta_event_conn_iq_report { uint16_t conn_handle; phy_type_t rx_phy; @@ -1210,15 +1271,29 @@ typedef struct le_meta_conn_iq_report uint16_t event_counter; uint8_t sample_count; le_iq_sample_t samples[0]; -} le_meta_conn_iq_report_t; +} le_meta_event_conn_iq_report_t; + +typedef struct le_meta_event_cte_req_failed +{ + uint8_t status; + uint16_t conn_handle; +} le_meta_event_cte_req_failed_t; -typedef struct le_meta_cte_req_failed +typedef struct le_meta_event_prd_adv_sync_transfer_recv { uint8_t status; uint16_t conn_handle; -} le_meta_cte_req_failed_t; + 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 prd_adv_interval; + uint8_t clk_acc; +} le_meta_event_prd_adv_sync_transfer_recv_t; -typedef struct le_meta_prd_adv_sync_transfer_recv +typedef struct le_meta_event_prd_adv_sync_transfer_recv_v2 { uint8_t status; uint16_t conn_handle; @@ -1230,7 +1305,13 @@ typedef struct le_meta_prd_adv_sync_transfer_recv phy_type_t phy; uint16_t prd_adv_interval; uint8_t clk_acc; -} le_meta_prd_adv_sync_transfer_recv_t; + + // [V2] additional fields + uint8_t num_subevents; + uint8_t subevent_interval; + uint8_t rsp_slot_delay; + uint8_t rsp_slot_spacing; +} le_meta_event_prd_adv_sync_transfer_recv_v2_t; typedef enum le_clock_accuracy { @@ -1244,12 +1325,12 @@ typedef enum le_clock_accuracy LE_CLOCK_ACCURACY_20_PPM, } le_clock_accuracy_t; -typedef struct le_meta_request_peer_sca_complete +typedef struct le_meta_event_request_peer_sca_complete { uint8_t status; uint16_t conn_handle; le_clock_accuracy_t peer_clock_accuracy; -} le_meta_request_peer_sca_complete_t; +} le_meta_event_request_peer_sca_complete_t; typedef enum le_path_loss_zone_event { @@ -1258,12 +1339,12 @@ typedef enum le_path_loss_zone_event PATH_LOSS_ZONE_ENTER_HIGH = 2, } le_path_loss_zone_event_t; -typedef struct le_meta_path_loss_threshold +typedef struct le_meta_event_path_loss_threshold { uint16_t conn_handle; uint8_t current_path_loss; // Current path loss (always zero or positive) Units: dB le_path_loss_zone_event_t zone_entered; -} le_meta_path_loss_threshold_t; +} le_meta_event_path_loss_threshold_t; typedef enum le_tx_power_reporting_reason { @@ -1272,7 +1353,7 @@ typedef enum le_tx_power_reporting_reason TX_POWER_REPORTING_REASON_HCI_COMPLETE = 2, } le_tx_power_reporting_reason_t; -typedef struct le_meta_tx_power_reporting +typedef struct le_meta_event_tx_power_reporting { uint8_t status; uint16_t conn_handle; @@ -1285,7 +1366,7 @@ typedef struct le_meta_tx_power_reporting // negative indicates decreased power, zero indicates unchanged) // Units: dB // 0x7F: Change is not available or is out of range -} le_meta_tx_power_reporting_t; +} le_meta_event_tx_power_reporting_t; typedef struct le_meta_subrate_change { @@ -1305,6 +1386,83 @@ typedef struct le_meta_subrate_change // Time Range: 100 ms to 32 s } le_meta_subrate_change_t; +typedef struct le_mete_event_prd_adv_subevent_data_req +{ + uint8_t adv_handle; // Used to identify a periodic advertising train + // Range: 0x00 to 0xEF + uint8_t subevent_start; // The first subevent that data is requested for. + // Range: 0x00 to 0x7F + uint8_t subevent_data_count; // The number of subevents that data is requested for. + // Range: 0x01 to 0x80 +} le_mete_event_prd_adv_subevent_data_req_t; + +typedef struct le_prd_adv_rsp_report +{ + int8_t tx_power; // Range: -127 to +20. Unit dBm + // 0x7F: Tx Power information not available + int8_t rssi; // Range: -127 to +20. Unit dBm + // 0x7F: RSSI not available + uint8_t cte_type; // 0x00: AoA; 0x01: AoD (1us); 0x02: AoD (2us) + // 0xFF: no CTE + uint8_t response_slot; // The response slot the data was received in. + // Range: 0x00 to 0xFF + uint8_t data_status; // 0x00: Data complete; + // 0x01: Data incomplete, more data to come; + // 0xFF: Failed to receive an AUX_SYNC_SUBEVENT_RSP PDU + uint8_t data_length; // Length of the Data field +#ifdef __ICCARM__ + uint8_t data[1]; +#else + uint8_t data[0]; +#endif +} le_prd_adv_rsp_report_t; + +typedef struct le_mete_event_prd_adv_rsp_report +{ + uint8_t adv_handle; // Used to identify a periodic advertising train + // Range: 0x00 to 0xEF + uint8_t subevent; // The subevent number. + // Range: 0x00 to 0x7F + uint8_t tx_status; // 0x00: AUX_SYNC_SUBEVENT_IND packet was transmitted + // 0x01: AUX_SYNC_SUBEVENT_IND packet was not transmitted. + // Others: reserved + uint8_t num_responses; // Number of responses in event. + // This is always <= 1 + le_prd_adv_rsp_report_t reports[1]; +} le_mete_event_prd_adv_rsp_report_t; + +// for naming compatibility +#define le_meta_tx_power_reporting_t le_meta_event_tx_power_reporting_t +#define le_meta_tx_power_reporting le_meta_event_tx_power_reporting +#define le_meta_path_loss_threshold_t le_meta_event_path_loss_threshold_t +#define le_meta_path_loss_threshold le_meta_event_path_loss_threshold +#define le_meta_request_peer_sca_complete_t le_meta_event_request_peer_sca_complete_t +#define le_meta_request_peer_sca_complete le_meta_event_request_peer_sca_complete +#define le_meta_prd_adv_sync_transfer_recv_v2_t le_meta_event_prd_adv_sync_transfer_recv_v2_t +#define le_meta_prd_adv_sync_transfer_recv_v2 le_meta_event_prd_adv_sync_transfer_recv_v2 +#define le_meta_prd_adv_sync_transfer_recv_t le_meta_event_prd_adv_sync_transfer_recv_t +#define le_meta_prd_adv_sync_transfer_recv le_meta_event_prd_adv_sync_transfer_recv +#define le_meta_conn_iq_report_t le_meta_event_conn_iq_report_t +#define le_meta_conn_iq_report le_meta_event_conn_iq_report +#define le_meta_cte_req_failed_t le_meta_event_cte_req_failed_t +#define le_meta_cte_req_failed le_meta_event_cte_req_failed +#define le_meta_pro_connless_iq_report le_meta_event_pro_connless_iq_report +#define le_meta_pro_connless_iq_report le_meta_event_pro_connless_iq_report +#define le_meta_connless_iq_report_t le_meta_event_connless_iq_report_t +#define le_meta_connless_iq_report le_meta_event_connless_iq_report +#define le_meta_ch_sel_algo_t le_meta_event_ch_sel_algo_t +#define le_meta_ch_sel_algo le_meta_event_ch_sel_algo +#define le_meta_scan_req_received_t le_meta_event_scan_req_received_t +#define le_meta_scan_req_received le_meta_event_scan_req_received +#define le_meta_phy_update_complete_t le_meta_event_phy_update_complete_t +#define le_meta_phy_update_complete le_meta_event_phy_update_complete +#define le_meta_directed_adv_report_t le_meta_event_directed_adv_report_t +#define le_meta_directed_adv_report le_meta_event_directed_adv_report +#define le_mete_prd_adv_subevent_data_req_t le_mete_event_prd_adv_subevent_data_req_t +#define le_mete_prd_adv_subevent_data_req le_mete_event_prd_adv_subevent_data_req +#define le_meta_adv_set_terminated_t le_meta_event_adv_set_terminated_t +#define le_meta_adv_set_terminated le_meta_event_adv_set_terminated + typedef enum btstack_l2cap_msg_def { BTSTACK_L2CAP_MSG_CAN_SEND_NOW = 0, diff --git a/bundles/noos_exp/inc/gap.h b/bundles/noos_exp/inc/gap.h index 69180228e..7d2699db2 100644 --- a/bundles/noos_exp/inc/gap.h +++ b/bundles/noos_exp/inc/gap.h @@ -539,6 +539,51 @@ uint8_t gap_set_periodic_adv_para(const uint8_t adv_handle, const uint16_t interval_max, const periodic_adv_properties_t properties); +/** + * @brief LE Set Periodic Advertising Parameters command + * + * @param adv_handle handle of advertising set + * + * @param interval_min 0xXXXX Range: 0x0006 to 0xFFFF + * Time = N * 1.25 ms + * Time Range: 7.5ms to 81.91875 s + * + * @param interval_max refer to interval_min + * + * @param properties BIT(6): Include TxPower in the advertising PDU + * + * @param num_subevents Number of subevents. Range: 0x00 to 0x80 + * + * @param subevent_interval Interval between subevents. Range: 0x06 to 0xFF + * Time = N × 1.25 ms + * Time Range: 7.5 ms to 318.75 ms + * + * @param response_slot_delay 0x00: No response slots + * 0xXX: Time between the advertising packet in a subevent and the first + * response slot. Range: 0x01 to 0xFE + * Time = N × 1.25 ms + * Time Range: 1.25 ms to 317.5 ms + * + * @param response_slot_spacing 0x00: No response slots + * 0xXX: Time between response slots. Range: 0x02 to 0xFF + * Time = N × 0.125 ms + * Time Range: 0.25 ms to 31.875 ms + * + * @param num_response_slots 0x00: No response slots + * 0xXX: Number of subevent response slots. Range: 0x01 to 0xFF + * + * @return 0: message sent to controller + */ +uint8_t gap_set_periodic_adv_para_v2(const uint8_t adv_handle, + const uint16_t interval_min, + const uint16_t interval_max, + const periodic_adv_properties_t properties, + const uint8_t num_subevents, + const uint8_t subevent_interval, + const uint8_t response_slot_delay, + const uint8_t response_slot_spacing, + const uint8_t num_response_slots); + /** * @brief LE Clear Advertising Sets command * @@ -728,6 +773,46 @@ uint8_t gap_ext_create_connection(const initiating_filter_policy_t filter_policy const uint8_t initiating_phy_num, const initiating_phy_config_t *phy_configs); +/** + * @brief LE Extended Create Connection command [V2] + * + * @ref `gap_ext_create_connection` + * + * When creating connection through PAwR, the `adv_handle` parameter is used to identify + * the periodic advertising train, and the `subevent` parameter is used to identify the + * subevent where a connection request shall be initiated from a periodic advertising train. + * Otherwise, these two parameters shall be set to 0xFF, in which case, the behavior of + * this function is exactly the same as [V1]. + * + * @param adv_handle Advertising_Handle identifying the periodic advertising train + * Range: 0x00 to 0xEF or 0xFF + * + * @param subevent Subevent where the connection request is to be sent. + * Range: 0x00 to 0x7F or 0xFF + * + * @param filter_policy @ref `gap_ext_create_connection` + * + * @param own_addr_type @ref `gap_ext_create_connection` + * + * @param peer_addr_type @ref `gap_ext_create_connection` + * + * @param peer_addr @ref `gap_ext_create_connection` + * + * @param initiating_phy_num @ref `gap_ext_create_connection` + * + * @param phy_configs @ref `gap_ext_create_connection` + * + * @return 0: message sent to controller + */ +uint8_t gap_ext_create_connection_v2(const uint8_t adv_handle, + const uint8_t subevent, + 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 * @@ -1319,6 +1404,72 @@ uint8_t gap_tx_test_v4(uint8_t tx_channel, uint8_t test_data_length, */ uint8_t gap_test_end(void); +#pragma pack (push, 1) + +typedef struct +{ + uint8_t subevent; // The subevent index of the data contained in this command. Range: 0x00 to 0x7F + uint8_t rsp_slot_start; // The first response slots to be used in this subevent + uint8_t rsp_slot_count; // The number of response slots to be used. + uint8_t data_len; // The number of octets in the `data`. [0..251] + uint8_t data[0]; // Advertising data +} gap_prd_adv_subevent_data_t; + +#pragma pack (pop) + +/** + * @brief Set the data for one or more subevents of PAwR + * + * The data for a subevent will be transmitted only once. Total length of the packed + * HCI command should not exceed maximum length. + * + * @param[in] adv_handle Used to identify a periodic advertising train. Range: 0x00 to 0xEF + * @param[in] num_subevents Number of subevent data in the command. (0x01..0x0f) + * @param[in] data data for each subevents + * @return 0: Message is sent out; Other: Message is not sent out + */ +uint8_t gap_set_periodic_adv_subevent_data(uint8_t adv_handle, + uint8_t num_subevents, + const gap_prd_adv_subevent_data_t *data); + +/** + * @brief Set the data for a response slot in a specific subevent of the PAwR + * + * The data for a subevent will be transmitted only once. + * + * @param[in] sync_handle Identify the PAwR train. Range: 0x0000 to 0x0EFF + * @param[in] request_event The value of `paEventCounter` for the periodic advertising + * packet that the Host is responding to. + * @param[in] request_subevent The subevent for the periodic advertising packet that the Host is responding to. + * @param[in] rsp_subevent Identify the subevent of the PAwR train. Range: 0x00 to 0x7F + * @param[in] rsp_slot Identify the response slot of the PAwR train. Range: 0x00 to 0xFF + * @param[in] rsp_data_len The number of octets in the `rsp_data` parameter. (0..251) + * @param[in] rsp_data Response data. + * @return 0: Message is sent out; Other: Message is not sent out + */ +uint8_t gap_set_periodic_adv_rsp_data(uint16_t sync_handle, + uint8_t request_event, + uint8_t request_subevent, + uint8_t rsp_subevent, + uint8_t rsp_slot, + uint8_t rsp_data_len, + const uint8_t *rsp_data); + +/** + * @brief Instruct the Controller to synchronize with a subset of the subevents within a PAwR train + * + * @param[in] sync_handle Identify the PAwR train. Range: 0x0000 to 0x0EFF + * @param[in] periodic_adv_properties Properties (bit combination of \ref `adv_event_property_t`). + * Only 0 or (1 << ADV_INC_TX_POWER) is allowed. + * @param[in] num_subevents Number of subevents. Range: 0x01 to 0x80 + * @param[in] subevents Each subevent to synchronize with. Range 0x00 to 0x7F + * @return 0: Message is sent out; Other: Message is not sent out + */ +uint8_t gap_set_periodic_sync_subevent(uint16_t sync_handle, + uint16_t periodic_adv_properties, + uint8_t num_subevents, + const uint8_t *subevents); + /** * @brief Start/Stop transmission of continuouswave. * diff --git a/bundles/noos_exp/inc/ll_api.h b/bundles/noos_exp/inc/ll_api.h index bd6d44875..6908bc35d 100644 --- a/bundles/noos_exp/inc/ll_api.h +++ b/bundles/noos_exp/inc/ll_api.h @@ -272,12 +272,10 @@ void ll_legacy_adv_set_interval(uint16_t for_hdc, uint16_t not_hdc); * @return 0 if successful else error code **************************************************************************************** */ -// int ll_attach_cte_to_adv_set(uint8_t adv_handle, uint8_t cte_type, -// uint8_t cte_len, -// uint8_t switching_pattern_len, -// const uint8_t *switching_pattern); -// WARNING: ^^^ this API is not available in this release - +int ll_attach_cte_to_adv_set(uint8_t adv_handle, uint8_t cte_type, + uint8_t cte_len, + uint8_t switching_pattern_len, + const uint8_t *switching_pattern); /** **************************************************************************************** @@ -340,17 +338,15 @@ int ll_scanner_enable_iq_sampling(uint8_t cte_type, * (slot_sampling_offset + slot_sample_count) should be <= 24 **************************************************************************************** */ -// int ll_scanner_enable_iq_sampling_on_legacy( -// uint16_t sampling_offset, -// uint8_t cte_type, -// uint8_t cte_time, -// uint8_t slot_len, -// uint8_t switching_pattern_len, -// const uint8_t *switching_pattern, -// uint8_t slot_sampling_offset, -// uint8_t slot_sample_count); -// WARNING: ^^^ this API is not available in this release - +int ll_scanner_enable_iq_sampling_on_legacy( + uint16_t sampling_offset, + uint8_t cte_type, + uint8_t cte_time, + uint8_t slot_len, + uint8_t switching_pattern_len, + const uint8_t *switching_pattern, + uint8_t slot_sampling_offset, + uint8_t slot_sample_count); struct ll_raw_packet; @@ -911,9 +907,7 @@ void ll_register_hci_acl_previewer(f_ll_hci_acl_data_preview preview); * For example, standard value for channel 37 is 0x53. **************************************************************************************** */ -// void ll_override_whitening_init_value(uint8_t override, uint8_t value); -// WARNING: ^^^ this API is not available in this release - +void ll_override_whitening_init_value(uint8_t override, uint8_t value); /** **************************************************************************************** @@ -923,9 +917,7 @@ void ll_register_hci_acl_previewer(f_ll_hci_acl_data_preview preview); * @param[in] type nonstandard ADV TYPE **************************************************************************************** */ -// void ll_allow_nonstandard_adv_type(uint8_t allowed, uint8_t type); -// WARNING: ^^^ this API is not available in this release - +void ll_allow_nonstandard_adv_type(uint8_t allowed, uint8_t type); /** **************************************************************************************** @@ -934,9 +926,7 @@ void ll_register_hci_acl_previewer(f_ll_hci_acl_data_preview preview); * @param[in] bit CTE bit: 0/1 (default: 1) **************************************************************************************** */ -// void ll_set_cte_bit(uint8_t bit); -// WARNING: ^^^ this API is not available in this release - +void ll_set_cte_bit(uint8_t bit); /** **************************************************************************************** From 5e99f238d2b09e17667519581cab4c64ff59f50f Mon Sep 17 00:00:00 2001 From: zjli2019 Date: Thu, 2 Nov 2023 12:17:40 +0800 Subject: [PATCH 08/10] fix typo (issue #221) --- examples/peripheral_console/src/key_detector.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/peripheral_console/src/key_detector.c b/examples/peripheral_console/src/key_detector.c index acfc41658..2fd2fc237 100644 --- a/examples/peripheral_console/src/key_detector.c +++ b/examples/peripheral_console/src/key_detector.c @@ -13,15 +13,15 @@ static SemaphoreHandle_t sem_wakeup = NULL; static f_key_event_cb key_event_cb; static int last_value = 0; static int pressed_evt_cnt = 0; -static int durtion = 0; +static int duration = 0; static int sampling_timer_cb(void) { int value = GIO_ReadValue(KEY_PIN); if (value == last_value) { - durtion++; - if ((durtion > 20) && (value != VALUE_PRESSED)) + duration++; + if ((duration > 20) && (value != VALUE_PRESSED)) { if (pressed_evt_cnt > 0) key_event_cb((key_press_event_t)pressed_evt_cnt); @@ -29,20 +29,20 @@ static int sampling_timer_cb(void) } return 1; } - + if (value != VALUE_PRESSED) { - if (durtion > 40) + if (duration > 40) { key_event_cb(KEY_LONG_PRESSED); pressed_evt_cnt = 0; - durtion = 0; + duration = 0; } else pressed_evt_cnt++; } else - durtion = 0; + duration = 0; last_value = value; return 1; @@ -59,7 +59,7 @@ static void timer_wakeup_task(void *pdata) last_value = VALUE_PRESSED; pressed_evt_cnt = 0; - durtion = 0; + duration = 0; while (sampling_timer_cb()) { @@ -91,6 +91,6 @@ void key_detector_start_on_demand(void) void test_key_detector(void) { platform_printf("wait\n"); - while (GIO_ReadValue(KEY_PIN) != VALUE_PRESSED) ; + while (GIO_ReadValue(KEY_PIN) != VALUE_PRESSED) ; key_detector_start_on_demand(); } From bbd6309ef1b612c70dc1fc8c71a8443559dafc19 Mon Sep 17 00:00:00 2001 From: zjli2019 Date: Thu, 2 Nov 2023 16:47:35 +0800 Subject: [PATCH 09/10] fix params --- examples/ble_rpc/data/brpc_handlers_weak.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/ble_rpc/data/brpc_handlers_weak.inc b/examples/ble_rpc/data/brpc_handlers_weak.inc index 163b87c60..fb844af67 100644 --- a/examples/ble_rpc/data/brpc_handlers_weak.inc +++ b/examples/ble_rpc/data/brpc_handlers_weak.inc @@ -72,9 +72,9 @@ __attribute((weak)) uint8_t gap_set_default_subrate(uint16_t subrate_min,uint16_ __attribute((weak)) uint8_t gap_subrate_request(hci_con_handle_t con_handle,uint16_t subrate_min,uint16_t subrate_max,uint16_t max_latency,uint16_t continuation_number,uint16_t supervision_timeout) {UNDEF_FUN(1072); return (uint8_t)0; } __attribute((weak)) uint8_t gap_aes_encrypt(const uint8_t * key,const uint8_t * plaintext,gap_hci_cmd_complete_cb_t cb,void * user_data) {UNDEF_FUN(1073); return (uint8_t)0; } __attribute((weak)) uint8_t gap_rx_test_v2(uint8_t rx_channel,uint8_t phy,uint8_t modulation_index) {UNDEF_FUN(1074); return (uint8_t)0; } -__attribute((weak)) uint8_t gap_rx_test_v3(uint8_t rx_channel,uint8_t phy,uint8_t modulation_index,uint8_t expected_cte_length,uint8_t expected_cte_type,uint8_t slot_durations,uint8_t switching_pattern_length,uint8_t * antenna_ids) {UNDEF_FUN(1075); return (uint8_t)0; } +__attribute((weak)) uint8_t gap_rx_test_v3(uint8_t rx_channel,uint8_t phy,uint8_t modulation_index,uint8_t expected_cte_length,uint8_t expected_cte_type,uint8_t slot_durations,uint8_t switching_pattern_length,const uint8_t * antenna_ids) {UNDEF_FUN(1075); return (uint8_t)0; } __attribute((weak)) uint8_t gap_tx_test_v2(uint8_t tx_channel,uint8_t test_data_length,uint8_t packet_payload,uint8_t phy) {UNDEF_FUN(1076); return (uint8_t)0; } -__attribute((weak)) uint8_t gap_tx_test_v4(uint8_t tx_channel,uint8_t test_data_length,uint8_t packet_payload,uint8_t phy,uint8_t cte_length,uint8_t cte_type,uint8_t switching_pattern_length,uint8_t * antenna_ids,int8_t tx_power_level) {UNDEF_FUN(1077); return (uint8_t)0; } +__attribute((weak)) uint8_t gap_tx_test_v4(uint8_t tx_channel,uint8_t test_data_length,uint8_t packet_payload,uint8_t phy,uint8_t cte_length,uint8_t cte_type,uint8_t switching_pattern_length,const uint8_t * antenna_ids,int8_t tx_power_level) {UNDEF_FUN(1077); return (uint8_t)0; } __attribute((weak)) uint8_t gap_test_end() {UNDEF_FUN(1078); return (uint8_t)0; } __attribute((weak)) uint8_t gap_vendor_tx_continuous_wave(uint8_t enable,uint8_t power_level_index,uint16_t freq) {UNDEF_FUN(1079); return (uint8_t)0; } __attribute((weak)) int att_server_deferred_read_response(hci_con_handle_t con_handle,uint16_t attribute_handle,const uint8_t * value,uint16_t value_len) {UNDEF_FUN(1080); return (int)0; } From c19c2f356221d36418935dc4f7b86b7c6bc887b5 Mon Sep 17 00:00:00 2001 From: zjli2019 Date: Thu, 2 Nov 2023 16:54:48 +0800 Subject: [PATCH 10/10] fix direct_conn --- examples/direct_conn/src/profile.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/direct_conn/src/profile.c b/examples/direct_conn/src/profile.c index f92b2d371..55a01f670 100644 --- a/examples/direct_conn/src/profile.c +++ b/examples/direct_conn/src/profile.c @@ -9,7 +9,7 @@ // GATT characteristic handles #include "../data/gatt.const" -#if (CONN_ROLE != HCI_ROLE_SLAVE) +#if (CONN_ROLE != HCI_ROLE_MASTER) const static uint8_t profile_data[] = { #include "../data/gatt.profile" }; @@ -165,7 +165,7 @@ void on_access_rx(struct ll_raw_packet *packet, void *user_data) uint8_t header; int len = 0; int rssi; - + if ((ll_raw_packet_get_rx_data(packet, &air_time, &header, pkt_data, &len, &rssi) != 0) || (len != sizeof(adv_addr)) || memcmp(pkt_data, adv_addr, sizeof(adv_addr))) @@ -183,7 +183,7 @@ void on_paging_rx(struct ll_raw_packet *packet, void *user_data) uint8_t header; int len = 0; int rssi; - + if ((ll_raw_packet_get_rx_data(packet, &paging_time, &header, pkt_data, &len, &rssi) != 0) || (len != sizeof(struct paging_pkt))) { @@ -256,7 +256,7 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin att_set_db(decode_hci_le_meta_event(packet, le_meta_event_enh_create_conn_complete_t)->handle, profile_data); #endif - + break; default: break;