From b9d20b590e51b410c6f6faa0b3c886aa303cf248 Mon Sep 17 00:00:00 2001 From: Seth Rickard Date: Tue, 4 Jun 2019 17:04:46 -0500 Subject: [PATCH] [cc13x2,cc26x2] update CC13X2 CC26X2 driverlib (#3888) --- examples/platforms/cc1352/radio.c | 40 +- examples/platforms/cc2652/radio.c | 41 +- third_party/ti/README.md | 11 +- .../ti/devices/cc13x2_cc26x2/driverlib/aes.c | 5 +- .../ti/devices/cc13x2_cc26x2/driverlib/aes.h | 17 +- .../driverlib/bin/ccs/driverlib.lib | Bin 1658276 -> 1713930 bytes .../cc13x2_cc26x2/driverlib/bin/ccs/makefile | 4 +- .../driverlib/bin/gcc/driverlib.a | Bin 384530 -> 402288 bytes .../cc13x2_cc26x2/driverlib/bin/gcc/makefile | 4 +- .../driverlib/bin/iar/driverlib.lib | Bin 873144 -> 914248 bytes .../cc13x2_cc26x2/driverlib/bin/iar/makefile | 5 +- .../driverlib/bin/keil/driverlib.lib | Bin 167772 -> 171862 bytes .../cc13x2_cc26x2/driverlib/bin/keil/makefile | 4 +- .../cc13x2_cc26x2/driverlib/chipinfo.c | 20 +- .../cc13x2_cc26x2/driverlib/chipinfo.h | 16 +- .../ti/devices/cc13x2_cc26x2/driverlib/cpu.h | 8 +- .../ti/devices/cc13x2_cc26x2/driverlib/ddi.c | 6 +- .../ti/devices/cc13x2_cc26x2/driverlib/ddi.h | 60 +- .../driverlib/driverlib_release.c | 2 +- .../driverlib/driverlib_release.h | 6 +- .../ti/devices/cc13x2_cc26x2/driverlib/i2s.h | 551 ++- .../devices/cc13x2_cc26x2/driverlib/i2s_doc.h | 141 + .../ti/devices/cc13x2_cc26x2/driverlib/osc.c | 199 +- .../ti/devices/cc13x2_cc26x2/driverlib/osc.h | 187 +- .../ti/devices/cc13x2_cc26x2/driverlib/pka.c | 31 +- .../ti/devices/cc13x2_cc26x2/driverlib/pka.h | 18 +- .../ti/devices/cc13x2_cc26x2/driverlib/prcm.c | 66 +- .../ti/devices/cc13x2_cc26x2/driverlib/prcm.h | 82 +- .../cc13x2_cc26x2/driverlib/rf_ble_cmd.h | 164 +- .../cc13x2_cc26x2/driverlib/rf_ble_mailbox.h | 5 +- .../cc13x2_cc26x2/driverlib/rf_common_cmd.h | 30 +- .../cc13x2_cc26x2/driverlib/rf_data_entry.h | 4 +- .../cc13x2_cc26x2/driverlib/rf_hs_cmd.h | 4 +- .../cc13x2_cc26x2/driverlib/rf_hs_mailbox.h | 4 +- .../cc13x2_cc26x2/driverlib/rf_ieee_cmd.h | 4 +- .../cc13x2_cc26x2/driverlib/rf_mailbox.h | 25 +- .../cc13x2_cc26x2/driverlib/rf_prop_cmd.h | 4 +- .../cc13x2_cc26x2/driverlib/rf_prop_mailbox.h | 4 +- .../ti/devices/cc13x2_cc26x2/driverlib/rfc.c | 75 +- .../ti/devices/cc13x2_cc26x2/driverlib/rfc.h | 36 +- .../ti/devices/cc13x2_cc26x2/driverlib/rom.h | 264 +- .../cc13x2_cc26x2/driverlib/rom_crypto.c | 159 + .../cc13x2_cc26x2/driverlib/rom_crypto.h | 212 ++ .../devices/cc13x2_cc26x2/driverlib/setup.c | 198 +- .../devices/cc13x2_cc26x2/driverlib/setup.h | 25 +- .../cc13x2_cc26x2/driverlib/setup_rom.h | 59 +- .../cc13x2_cc26x2/driverlib/sys_ctrl.c | 13 +- .../cc13x2_cc26x2/driverlib/sys_ctrl.h | 4 +- .../cc13x2_cc26x2/inc/hw_adi_2_refsys.h | 4 +- .../cc13x2_cc26x2/inc/hw_adi_3_refsys.h | 22 +- .../devices/cc13x2_cc26x2/inc/hw_adi_4_aux.h | 35 +- .../devices/cc13x2_cc26x2/inc/hw_aon_batmon.h | 4 +- .../devices/cc13x2_cc26x2/inc/hw_aon_event.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_aon_ioc.h | 4 +- .../devices/cc13x2_cc26x2/inc/hw_aon_pmctl.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_aon_rtc.h | 4 +- .../devices/cc13x2_cc26x2/inc/hw_aux_aiodio.h | 4 +- .../devices/cc13x2_cc26x2/inc/hw_aux_anaif.h | 4 +- .../devices/cc13x2_cc26x2/inc/hw_aux_evctl.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_aux_mac.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_aux_ram.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_aux_sce.h | 4 +- .../devices/cc13x2_cc26x2/inc/hw_aux_smph.h | 4 +- .../devices/cc13x2_cc26x2/inc/hw_aux_spim.h | 4 +- .../devices/cc13x2_cc26x2/inc/hw_aux_sysif.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_aux_tdc.h | 4 +- .../cc13x2_cc26x2/inc/hw_aux_timer01.h | 4 +- .../devices/cc13x2_cc26x2/inc/hw_aux_timer2.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_ccfg.h | 8 +- .../cc13x2_cc26x2/inc/hw_ccfg_simple_struct.h | 4 +- .../devices/cc13x2_cc26x2/inc/hw_chip_def.h | 2 +- .../ti/devices/cc13x2_cc26x2/inc/hw_cpu_dwt.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_cpu_fpb.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_cpu_itm.h | 4 +- .../cc13x2_cc26x2/inc/hw_cpu_rom_table.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_cpu_scs.h | 4 +- .../devices/cc13x2_cc26x2/inc/hw_cpu_tiprop.h | 4 +- .../devices/cc13x2_cc26x2/inc/hw_cpu_tpiu.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_crypto.h | 4 +- .../devices/cc13x2_cc26x2/inc/hw_ddi_0_osc.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_event.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_fcfg1.h | 495 +-- .../ti/devices/cc13x2_cc26x2/inc/hw_flash.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_gpio.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_gpram.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_gpt.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_i2c.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_i2s.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_ints.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_ioc.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_memmap.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_pka.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_pka_int.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_pka_ram.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_prcm.h | 4 +- .../devices/cc13x2_cc26x2/inc/hw_rfc_dbell.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_rfc_pwr.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_rfc_rat.h | 4 +- .../devices/cc13x2_cc26x2/inc/hw_rfc_ullram.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_smph.h | 4 +- .../devices/cc13x2_cc26x2/inc/hw_sram_mmr.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_ssi.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_trng.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_uart.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_udma.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_vims.h | 4 +- .../ti/devices/cc13x2_cc26x2/inc/hw_wdt.h | 4 +- .../cc13x2_cc26x2/linker_files/cc26x2r1f.cmd | 6 +- .../cc13x2_cc26x2/linker_files/cc26x2r1f.icf | 6 +- .../cc13x2_cc26x2/linker_files/cc26x2r1f.lds | 6 +- .../cc13x2_cc26x2/linker_files/cc26x2r1f.sct | 6 +- .../linker_files/cc26x2r1f_ram.icf | 143 - .../rf_patches/rf_patch_cpe_ble.h | 321 -- .../rf_patches/rf_patch_cpe_bt5.h | 555 +-- .../rf_patches/rf_patch_cpe_ieee_802_15_4.h | 163 +- .../rf_patches/rf_patch_cpe_multi_protocol.h | 724 +--- .../rf_patch_cpe_multi_protocol_rtls.h | 1452 ++++++++ .../rf_patches/rf_patch_cpe_prop.h | 405 +-- .../rf_patches/rf_patch_mce_bt5.h | 623 ---- .../rf_patches/rf_patch_mce_genfsk.h | 591 ---- .../rf_patches/rf_patch_mce_ieee_802_15_4.h | 479 --- .../rf_patches/rf_patch_mce_iqdump.h | 438 +++ .../rf_patches/rf_patch_mce_sl_longrange.h | 335 -- .../rf_patches/rf_patch_mce_slr.h | 365 -- .../rf_patches/rf_patch_mce_tof.h | 609 ++++ .../rf_patches/rf_patch_rfe_bt5.h | 610 ---- .../rf_patches/rf_patch_rfe_genfsk.h | 611 ---- .../rf_patches/rf_patch_rfe_ieee_802_15_4.h | 438 --- .../rf_patches/rf_patch_rfe_tof.h | 571 ++++ .../ti/devices/cc13x2_cc26x2/rom/driverlib.c | 3025 ++++++++++++----- .../devices/cc13x2_cc26x2/rom/driverlib.elf | Bin 343036 -> 372940 bytes .../cc13x2_cc26x2/startup_files/ccfg.c | 8 +- .../cc13x2_cc26x2/startup_files/startup_ccs.c | 2 +- .../cc13x2_cc26x2/startup_files/startup_gcc.c | 2 +- .../cc13x2_cc26x2/startup_files/startup_iar.c | 2 +- .../startup_files/startup_keil.s | 2 +- ...release_notes_driverlib_cc13xx_cc26xx.html | 1454 +++++++- 137 files changed, 9449 insertions(+), 8098 deletions(-) create mode 100644 third_party/ti/devices/cc13x2_cc26x2/driverlib/i2s_doc.h create mode 100644 third_party/ti/devices/cc13x2_cc26x2/driverlib/rom_crypto.c create mode 100644 third_party/ti/devices/cc13x2_cc26x2/driverlib/rom_crypto.h delete mode 100644 third_party/ti/devices/cc13x2_cc26x2/linker_files/cc26x2r1f_ram.icf delete mode 100644 third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_ble.h create mode 100644 third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_multi_protocol_rtls.h delete mode 100644 third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_bt5.h delete mode 100644 third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_genfsk.h delete mode 100644 third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_ieee_802_15_4.h create mode 100644 third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_iqdump.h delete mode 100644 third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_sl_longrange.h delete mode 100644 third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_slr.h create mode 100644 third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_tof.h delete mode 100644 third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_rfe_bt5.h delete mode 100644 third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_rfe_genfsk.h delete mode 100644 third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_rfe_ieee_802_15_4.h create mode 100644 third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_rfe_tof.h diff --git a/examples/platforms/cc1352/radio.c b/examples/platforms/cc1352/radio.c index 00ee63156..6b4d8965d 100644 --- a/examples/platforms/cc1352/radio.c +++ b/examples/platforms/cc1352/radio.c @@ -58,8 +58,6 @@ #include #include #include -#include -#include enum { @@ -81,38 +79,10 @@ static output_config_t const *sCurrentOutputPower = &(rgOutputPower[0]); /* Overrides from SmartRF Studio 7 2.10.0#94 */ static uint32_t sIEEEOverrides[] = { // override_ieee_802_15_4.xml - // PHY: Use MCE RAM patch, RFE ROM bank 1 - MCE_RFE_OVERRIDE(1, 0, 0, 0, 1, 0), - // Synth: Use 48 MHz crystal, enable extra PLL filtering - (uint32_t)0x02400403, - // Synth: Configure extra PLL filtering - (uint32_t)0x001C8473, - // Synth: Configure synth hardware - (uint32_t)0x00088433, - // Synth: Set minimum RTRIM to 3 - (uint32_t)0x00038793, - // Synth: Configure faster calibration - HW32_ARRAY_OVERRIDE(0x4004, 1), - // Synth: Configure faster calibration - (uint32_t)0x1C0C0618, - // Synth: Configure faster calibration - (uint32_t)0xC00401A1, - // Synth: Configure faster calibration - (uint32_t)0x00010101, - // Synth: Configure faster calibration - (uint32_t)0xC0040141, - // Synth: Configure faster calibration - (uint32_t)0x00214AD3, - // Synth: Decrease synth programming time-out (0x0298 RAT ticks = 166 us) - (uint32_t)0x02980243, - // DC/DC regulator: In Tx, use DCDCCTL5[3:0]=0xC (DITHER_EN=1 and IPEAK=4). In Rx, use DCDCCTL5[3:0]=0xC - // (DITHER_EN=1 and IPEAK=4). - (uint32_t)0xFCFC08C3, + // DC/DC regulator: In Tx, use DCDCCTL5[3:0]=0x3 (DITHER_EN=0 and IPEAK=3). + (uint32_t)0x00F388D3, // Rx: Set LNA bias current offset to +15 to saturate trim to max (default: 0) - (uint32_t)0x000F8883, - // override_frontend_id.xml - (uint32_t)0xFFFFFFFF, -}; + (uint32_t)0x000F8883, (uint32_t)0xFFFFFFFF}; /* * Number of retry counts left to the currently transmitting frame. @@ -919,13 +889,11 @@ static void rfCorePowerOff(void) } /** - * Applies CPE, RFE, and MCE patches to the radio. + * Applies CPE patche to the radio. */ static void rfCoreApplyPatch(void) { rf_patch_cpe_ieee_802_15_4(); - rf_patch_mce_ieee_802_15_4(); - rf_patch_rfe_ieee_802_15_4(); /* disable ram bus clocks */ RFCDoorbellSendTo(CMDR_DIR_CMD_2BYTE(CC1352_RF_CMD0, 0)); diff --git a/examples/platforms/cc2652/radio.c b/examples/platforms/cc2652/radio.c index 71805ded6..08aabefa0 100644 --- a/examples/platforms/cc2652/radio.c +++ b/examples/platforms/cc2652/radio.c @@ -57,8 +57,6 @@ #include #include #include -#include -#include enum { @@ -80,38 +78,10 @@ static output_config_t const *sCurrentOutputPower = &(rgOutputPower[0]); /* Overrides from SmartRF Studio 7 2.10.0#94 */ static uint32_t sIEEEOverrides[] = { // override_ieee_802_15_4.xml - // PHY: Use MCE RAM patch, RFE ROM bank 1 - MCE_RFE_OVERRIDE(1, 0, 0, 0, 1, 0), - // Synth: Use 48 MHz crystal, enable extra PLL filtering - (uint32_t)0x02400403, - // Synth: Configure extra PLL filtering - (uint32_t)0x001C8473, - // Synth: Configure synth hardware - (uint32_t)0x00088433, - // Synth: Set minimum RTRIM to 3 - (uint32_t)0x00038793, - // Synth: Configure faster calibration - HW32_ARRAY_OVERRIDE(0x4004, 1), - // Synth: Configure faster calibration - (uint32_t)0x1C0C0618, - // Synth: Configure faster calibration - (uint32_t)0xC00401A1, - // Synth: Configure faster calibration - (uint32_t)0x00010101, - // Synth: Configure faster calibration - (uint32_t)0xC0040141, - // Synth: Configure faster calibration - (uint32_t)0x00214AD3, - // Synth: Decrease synth programming time-out (0x0298 RAT ticks = 166 us) - (uint32_t)0x02980243, - // DC/DC regulator: In Tx, use DCDCCTL5[3:0]=0xC (DITHER_EN=1 and IPEAK=4). In Rx, use DCDCCTL5[3:0]=0xC - // (DITHER_EN=1 and IPEAK=4). - (uint32_t)0xFCFC08C3, + // DC/DC regulator: In Tx, use DCDCCTL5[3:0]=0x3 (DITHER_EN=0 and IPEAK=3). + (uint32_t)0x00F388D3, // Rx: Set LNA bias current offset to +15 to saturate trim to max (default: 0) - (uint32_t)0x000F8883, - // override_frontend_id.xml - (uint32_t)0xFFFFFFFF, -}; + (uint32_t)0x000F8883, (uint32_t)0xFFFFFFFF}; /* * Number of retry counts left to the currently transmitting frame. @@ -918,13 +888,11 @@ static void rfCorePowerOff(void) } /** - * Applies CPE, RFE, and MCE patches to the radio. + * Applies CPE patche to the radio. */ static void rfCoreApplyPatch(void) { rf_patch_cpe_ieee_802_15_4(); - rf_patch_mce_ieee_802_15_4(); - rf_patch_rfe_ieee_802_15_4(); /* disable ram bus clocks */ RFCDoorbellSendTo(CMDR_DIR_CMD_2BYTE(CC2652_RF_CMD0, 0)); @@ -1415,6 +1383,7 @@ otError otPlatRadioSleep(otInstance *aInstance) else { sState = cc2652_stateSleep; + error = OT_ERROR_NONE; } } diff --git a/third_party/ti/README.md b/third_party/ti/README.md index 461935802..a5ad0a0ee 100644 --- a/third_party/ti/README.md +++ b/third_party/ti/README.md @@ -1,11 +1,10 @@ #CC26XXware ## URL - -http://www.ti.com/tool/simplelink-cc26x2-sdk +http://www.ti.com/tool/simplelink-cc13x2-26x2-sdk ## Version -`driverlib_cc13xx_cc26xx_3_30_03_00` +`driverlib_cc13xx_cc26xx_3_05_06_18894` ## License @@ -18,7 +17,7 @@ BSD-3-Clause ## Documentation This version of cc26xxware is copied from the [SimpleLink CC26x2 Software -Development Kit](http://www.ti.com/tool/simplelink-cc26x2-sdk). Modifications +Development Kit](http://www.ti.com/tool/simplelink-cc13x2-26x2-sdk). Modifications were made to the software package to support the GCC Automake pedantic build. Also see: release_notes_driverlib_cc13xx_cc26xx.html @@ -31,9 +30,7 @@ Also see: release_notes_driverlib_cc13xx_cc26xx.html | `device/cc13x52_cc26x2/linker_files/cc26x2r1f.lds` | `end` symbol added for GCC stdlib | Documentation can be found within the [SimpleLink CC26x2 Software Development -Kit](http://www.ti.com/tool/simplelink-cc26x2-sdk). - -**TODO** Update above link +Kit](http://www.ti.com/tool/simplelink-cc13x2-26x2-sdk). ## Description diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/aes.c b/third_party/ti/devices/cc13x2_cc26x2/driverlib/aes.c index 43c030c92..c480bf7c6 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/aes.c +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/aes.c @@ -1,7 +1,8 @@ + /****************************************************************************** * Filename: crypto.c -* Revised: 2018-05-08 10:29:36 +0200 (Tue, 08 May 2018) -* Revision: 51973 +* Revised: 2019-01-25 13:11:50 +0100 (Fri, 25 Jan 2019) +* Revision: 54285 * * Description: Driver for the aes functions of the crypto module * diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/aes.h b/third_party/ti/devices/cc13x2_cc26x2/driverlib/aes.h index 636337895..f1ac452f5 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/aes.h +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/aes.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: aes.h -* Revised: 2018-04-17 14:54:06 +0200 (Tue, 17 Apr 2018) -* Revision: 51890 +* Revised: 2019-01-25 14:45:16 +0100 (Fri, 25 Jan 2019) +* Revision: 54287 * * Description: AES header file. * @@ -583,6 +583,19 @@ __STATIC_INLINE void AESSetAuthLength(uint32_t length) HWREG(CRYPTO_BASE + CRYPTO_O_AESAUTHLEN) = length; } +//***************************************************************************** +// +//! \brief Reset the accelerator and cancel ongoing operations +//! +//! +//! \return None +// +//***************************************************************************** +__STATIC_INLINE void AESReset(void) +{ + HWREG(CRYPTO_BASE + CRYPTO_O_SWRESET) = 0x00000001; +} + //***************************************************************************** // //! \brief Enable individual crypto interrupt sources. diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/bin/ccs/driverlib.lib b/third_party/ti/devices/cc13x2_cc26x2/driverlib/bin/ccs/driverlib.lib index 0f663e6ce4978c8e81210bad8153175354c20abc..004e8f7fd0c31c766904f5892d9f6aafa2a528dc 100644 GIT binary patch delta 400705 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

gL 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 C6l3}T delta 361274 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�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 delta 60956 zcmb@v31AdO*DhSuJu^v2$iA-=_MH$G*-aoofFP?Zib8-ukR5`eA_ItmiU^L<_!<-x z6*oXof{F@?3yKTwz6t{FiU_EQYyK1qhW-@W&{|Mxd^KlPk*>eSXtb#>L`WrE}i`TJU_S4qu<{dn-TlR*HcQjRjTDR|M&gkV@geGa{hkvMM|xM zk2-sxuHZlT8;g|sEZW_FzE7$DV%N!?)PL+v?^F8!z6Z`Xnwqb4-TnGxrEgoL^u~Ap z-}Xa0l@8s1zDDW)*aPPat<)3hzr7b;qOAYv9;oZ!-mc2}@9yuPQP%%(5ByIZ{14*? z{zoOSS07XVpZ0w|WgqN?J;1|%v7cC^JmCZW|J_IVl&9_y<2+>U@9H{wvrvz0%oS-xK3ZOYx*TzZ7_qckIu2A|hPw zuzAi~AL|J_zHGeE((QJXHf!gt)nsQ{sXMl}e$DcIZYkxrgNyST4){bXWm(?mY(iLT zC@hcn12B6i!gk^1ijpu*MY#7)nuUk$0rPmgQ)gCCcPkA)vVuS6wQe&;e~AcT2_D?X z$C%(@MA2hbQra77=`jy5IL`!w#qF|tmDBZSnieWzDM^fFH-x_4k4!DbGMdO;j4_Z# zsn~U8U+}2SbUrY+x!pY9CDbnr=H{mc7Ba?K?1_EhPA?*T61$53liV>5L3d%-l~+QR z(4DazX81kq3G-|0PLVQ;ZnPNKC2phfL-f*sv=!-o(n8X{qiFpB`3Uf&pAd+}&Q0%( zJ`0!&IdYRg!|$te)1CUtdm(evGm0B%nYdk2Ww5aN~hyLKr$QzY?Zv8_U+t?h6ImJq&FOqQYuQPP{ZQCU*p-eJPn?iK+o+N zGoWJO(M_tGW@Ky4c$K~cF(-nUq+(RoH%w|M4oY>#t}EY#GIcDXLdtx#K`?cQYeim2 z-pJ*&9RZ%H$%h;JDd5==8tF6J<_s98W0H*l@}Mn0&bXX^!AehoP^moZx-zxEm9S)$ z2)bFAVq880?vK?|b!$Y;WgLBlsl41*kpVr;luo6YQ*649gb|9m$g0YxHQ_ z*77Q3(F;GQ-%o<;yEW2hgD-Y#nC@sj+GE-8SlvC^e)qcW2ya0S5f1*-t(*Qn*sXgb zeMfM7_e}jn@Vf5Vtq)o{Ik#0_tGu3#GV@{mq-M+mi~J_+x57da`ew&#-3RI&^Ll=% zgD)=XtJ?)jo2Bg-Rd9bw&7~fkxiTe~HhP)$wGQ4px`ox(3cfLVfOV-AOc|4H4Y77y zFlM-?HgfRh%d&#Qme098nCTQW_jq=!yZphhP-n@(v6D}RZDth>P{F;2ld_JWk}Vzn zFM{Q*Ko#Kb@g|wa`)u%rDfv;`L2Q39;&>MYUz(Diw;2N6>q-dNgkk$gdy@_zorZ%h zBAtO`1)zyU^PHdrkA; zjQ6kE9&8X6>T*ZHzfR}?t5SEs;RsGb)?W2y{R4k?2G46-`^M7wF^02x8Ak0-F>D|gkJWtLj1_O-bpNgQj38a=~*}Q0dZ5Z3Kc!Tv}uL)o38r=s`*bT^?>vvl(*umU;5@HX*g`UUA+~S4@i|*Op zyAOqTQZO33u6zv%x|Vm+G68$6GB%_{v)X98fF@-GyWG27-xxf8?|?u!Rj)v5 z?(DiUZ8qHLcdOG(g#yCkgrn8MC?iZSA)I&|M{cg=GTdC;%$%V04(u7`7J8C)dWg!r zm;SYuXje$Q7Z5MY6jz&yV2-jsWfWWUrvD{&m3b$Nl~^5DB~oAcC!7H@1(W~|#9DIe$VP2c7Bf#;ZvxLglY{vD9%qMB?Z zn{2pAy3(f@$rRh=dMI4%_-NzlFnip%`N1KNC+;YCWQ83}=qcB?lXt+gddKK3*(o8{ zQChI)!T~#uyu8G{es9z}Rxe(ttA^zI*6W~t^Ue^{l;D$Zt`7Xlj7&#^GU?C_m-2Vu z_DmeCEOYAX@S8|1FRvZk@jfK;csBs-)(ltom->)|dvRociPuVPf5{JKFX17vl~U2l zW>eYz;W&Ex1rNTJ*t#=*<-S?D?K%wDUjYs&wo*XMK^=t&Cxy~ZCr^j_qS8Sg(Gab8^%9S-Pv!F`AQ z`idQ29q#L`eLlp^E1xyD!q4vB{Hg8phm}onN?Tj=cEo&jOL&M2x8^-3{>z$g{Ofr& z@9BI&m;B)P$<3_S5`w-nn|1x*)-!2=h=aPd_YPjY{$Pl5q_4 zy#$+ZUq@&o@XTaAjl(h0Hw`I7`C39--xv50E}~U9`>58X`Ue1#ovv?#rLQ|o0=|3% z;S*u)D?r%tO@zSqeS@P%g*T>Xo-PF-=3)H-0zURg1HKF-RL|EK$4H-pbP|2LaZK_J z#4*`-F^(xSeB%JADm;vCzR`CBBCbGHS_PVqeLG?y>m%7E^_~UMMfX9$Ef%}3j9g6^ zd;~{s?)|k3G7xnbR1ZBuDYwXZ!NNb92A*X}%2~iZM!FFh(ATn_xedXtD~~h!pHy5& z#XJb3OuR*m7X+<8j#&vXkI{eA<6;K&u&94gzLbQ|-{_|)U1oGcV~!$nfaeL?2a#3m zCKy}Iq;N| z@>jey0k<%`TtxhHF9U68tA-FdRLdDKxiz&3qEtHe7TCp>S+k zcP}qJC@1%7Ds;-`7Hgj~WuV7jzjS&<|H&h#&YE6YQ8uY+sijBQPP$K@bl(5j z?&Eg0on~QrS+M@>1ZVX--dJaKg(oVwZA+|^*T(WV$HR0Z-Q9@`*BLsxs&%*?udCKa z=-;$Xb?%JRErW?4B|7g%>R8L4={*0XC)qg*;`N}uqn)@Y-Oy^5=|q18`SGtjvEF#d zpLa^5bb^!kwI{Z9UZzs)Z1Cn^A3M*TaO_>#Ucl<@9Vq$)^@N0^k~*3soN^V^ICpIF z#(Fp8;52u1eIzipEfTybOsV2v?)U^}8K`yA?_5-0CnwFU!ws+YDvk)ALB#pnLU;$~3GGV^L@LEM1X^51#Mxqch2ZQ>lFt?WLLzQew+O#e z^c=5X{7u3i7XGB*Ucom+|BmpZzyKZoD1vi>kvO60Fo}pOppo!4L}aMF@ScJL1^M)) z{&FJXO(5bfJwx~$;R^(p*s7(8a1#YcaGl_K!TX7cN^Lh-H6d9K(>`9!R`&wuP{i;87el_Rm}sgUpCKE2_ohHhplWJl{UchCd%L(XFzblagEmeDITyGQltZVv+B%s>{o z$@NXfeP8lFnX=1SzNqVP&^H_VrR39{RvmRtoJsW-Bj%YBb)7R7Vm-%M*imO;jKsOS zqi&@qJFj)ro%96fpN={$V4AC|86Ibws7T&1^+!i*ptWMsVmGYac zG=MT=per?*!;sPdYBq!zWelv^(pi^8JA=mRC@1SO9a(irKRwEF?is7&oHxhnu&N{d z_4^^C&K!VQ=2Xt}L{$})=wyG*U;uBh3#RM+fkjBubZ`LG8}4`TSU8grk>-9&G#dA zcNnR~ES+vuX{YZjo$sojW~`v7ZX9wj#}D05ksOOfMe^QXzE;w1F_wRrGk1nJZ6NUuSqw zx3tdcs>MNl(#?l+F3K0}9A2yAYpWp5d1tMT2=0C*!tvh%#fHNkkJHl8nQ4>ePQ9{h z?)0e>#?398URFApm1f5CN) zORDld(brWEHU?KO-WFWf;y~55!@A9R9-XsC^mlkM{Q9W&>q;l=m|m?PtXg+WpYqj? zv?ZQD($+t}ckk)bobk8lfV0i7Gpp8puj|!*#n}66YSrE|x~Ub|f+|K!W8@2Wtk4au zvOpJX4vcF9m;bJZG65P828%y5DxcU$xJL{ILbHRJ}RywiS_Xb?ODWdqO$jq z1kCsuKN#!55X&dYVc_BBkvW*gW(&L1$@^0$wl?A`DCW%};!7N~p?YXIADDU?bxp9V zu))q8L>X(Mm}L32Ae_A)ZDc>h!R1R0S$zS+aFJUa5smajnHP4xJ}NaHyRPKRNPXi+ zYdRVOU47$9Yx=qhJbHrj%wM{RTb5?Vj5l%DteG+6dsuxl+~D#UM2+6XOtdie4Zu~* z?-cYk0#MZoyRLi|LN^DlW)Mv4oBpcH`PhhV#e*(3QRgxInsR2G)!ES*NEjWx`{*z3 znyS0b>hFA2$877HI-eZo1!KR;tQs9|J)cm0FK`aF(5Y1&Gp!3efdcqMR`FJd+=Onp z7AHV#{|sTxwKxJ2T#JR2Sz#|wpO1Lfg`+6(c)thOcq>*l*CH=3T#M|D;aX%x)n1Dm zwCbVk7Z}IA7T=}A9G-%>&q7eaC8{s{aqTqAwOYq^XXV~)Dgugn zL8mO&${&-$f*qiFrZH#xMvS280h;17RpbQXr_~V~8M9kq7G?S#hg`F$AmuI@uEJkc z&dFS>L2fj2b7m!Ue0ta8jYc! znX?<`=l5_F`#BPjTIIgryy!S*Ra+~(YHmBRxSsqtFrb{ixRV zw-WQ&Gtv{UgtM?19CR6jDm<3w&*$1c0unJAnFOIG;tO@m$)A%@-v>c(0{?Omj2aL~7r z?!>O*ULt>p!DNOi*;hcqPO|}4%YZR{gvNe|RoqaPa34ad0d`%Y5--X!oUsUEK4DycjQVn(EOS1gEn+4 zLaxIvsC|*tIQ)|Ib5NCFp2S`TrF?(FWg^PgYM_-JFu4gct>K3}$;1vfya%{S&^Y3~ zuQvKnR4$?$DN`w>y9sDiSdmxIjd7c6_;PaNwt?ZBz*WLz9Cc@1j<95FbB*85#*RZw ziG{8i{T@cp_1o3xPmvqH-3*ULe3j4$IhA=n$>6$@FG4JByAmrq-ehaIF~1aYM0ZL{ za1}zoqQuJVe~3}08U0r3jr|P6Uv%xEpK18#;40xRmiwlV+IbcNCif$fb1U~2W6rOE zZf;i^-WOaY^kMXkCOU?PkXv3%Zsl$?W>Xo>M6 zZ_-JT(z}cmbLo0{#_-2#ygXauh0jg>w(;UOUJkfkoVNy9vr?C^9gc=*hvNN><-GVJ zYev7fsr}h#Cz-h0F&3X_UNU|*3H*cv6R&Zt*p?j3O#G0huD$_z^Qwr!R=VzdBXhzo zx>CDoQrWs*wYOx8u@^9HoBX4)%ONuQQvG*ZDdlNS|4Yo@p7~AqK71!=dsIP!mTLra+b*DAA&d7qn&XV zTh}JGqc3xwON*eUs!m*Ny_i}RJIlf+nc5jaA-DGp^Q;%!RNvms^V`$DQ z!TewCA98yQ+&-;$dGATvtsm}hIKH?2!-j%9#9xi?=CJsA&ky$xQQK$tb4EO54G9dx zIfHt`=FtT>A2j=*ze9*D*KByAEyRUq^8=`-`t5;Z#`ZCs1fJ&XsNy+yJHTe=-qVuf zdU)hDgKPUq+FUq;5|8&5xUm00*i*>IVgQf7dPo+Jzdq35@yAcXwU57dn82>=t zE8x(Z))O)9Q&4%+`Nm>TqBLg$gPaTC^;aP1^?Z(_&+GXb5OxZO@cVF3_EA{-dY(nl z>j_x!9q|^zJj=q(fh?Q{=o!Pl0oCE_)rz_Bq z;JUGYLC{xhOgVV#8^FYE_P+zZL7y<3ii2u{E3 z82-Gm-&bw_F-^@ua&PiE9QEoONmHBsIo}u)Y{3M_KF^1t-2@Hb8)x#t2f42_2~oTr ze(wltf`gRea~60abv8c&`^t{M*nXbUDJD3E(y1m`36*aegOMe^iUCkW#Zh}D+d)M= z!AMu-@{Q3G#eS}D!3E5G)blu3d{_5EI4bHLhOc2Y#zuLOs_)tv2q#AE#nHEL0gkCr zO&Rw(zHDSh4W|8~9SHlQ?x20(Fv5+Z&M>@~uNTdtVwvy~wnwX|I55O#V~}6mHhz8 zO_za0ChAfDLiDJf@T5nZHi^0zYCVQwPt-D`ukxDw(R7DRTne1&RWw9*K6Wi?O+Qi{jcuzdmoU~gCTA3bA&fV3BOaq2ul9H|`}=Vg zV=?J*9P}1yAHtsS0FtnH58$S^spvOZ1D}#LqNMUcI8UTiG$_JKA5-l1RMj}(<{h7P|Gw~VF z1_;7R>Ay@ydAaZ!)#p?)du%!$@z~x7R&vru3L}}Tn4(;r%8awp^T^RZN}j{wwK35O zD63qHXo0j+dTXOuOSm3X`cUfHX=bhijWhVltP6|*s0>>4L*CM^02NI?m}YiE7IbeD zRS(TP$wupA;(6z&f+qK7)`OAmXCz^eG%9X#Zy=Ke(fzB1#T2G`k1*|FU!h--uEwrgZJZ_~8?34Zj4qJyzhlVf8r!HeR^ z{s~qJ&O)bjt4=M6>rgAji4`A0VU&=i+9eFr7pIJl90Ny*q;Wdl=hCFwgqTcnFt1Z` zkCYG_)Lm+b2hcRhgxAePx+Etw!zsMXlbV)1eV|Tg}e6*R^sl@g^W)szRA_FjPV7kjX&lpd7Q*>f&lE zifGkJ@l1Em?b#~3eUk=rjJx?NyK9pM6)K#*L1sH~&tjd;ea~8(ozkatqI2bL%b&{| z1~-<0TY)*cmmGsp&fB}K3}^hc+T)yj(GGW_pR=NJd27I()XaI}#a_Mf;`d{3;4JyK zC*l7k1*^MV_1SY)d!0BDg;b@pW{#U%F|kcK$*g(KUazOQQ}TipH~1S&@U5rqEB$`E zUYmvww7dVj1p+HIv~98*tQc(hl&)Ez@Q9fKb+gxxl?8uY!<7X$NZ6UQ$7&a-UdZsN z)(xQi$TJy+k6+uyiU@IXT3OFK@4wcc+asqz zUQS+vhE`07m)kAfUo9n;31 z^T30=N0-JOWV165I&65R>U2)wxj*IIk`xDjqO*M3g&C$ z(FX0)3ymPRN4u;J=asw)J=~Obt=jj%+mzPs$N#~@F+M+Q;8<(>88K|!us*~43>(>}sKdAs zs$%MlveC2VO&mOPT8RCY)bv?1r})i*la)>ML4~7DTd0YpvkT|WEh=L!hU5Fu#EQbA z-o0ndnBA-Y%-QoR)Ff(HWymAE(7~Y61+MeJ8&*@UB5}4Hvzi3l>SVbFm6gsk7UyTR z9kSYc?!@-_X1;XDDWdvLFGG8k&4mi?dY4a~-G7qgvrpkgZbs+NoHupK%(6-TiRGnp zT_tlmc+iku{V#&&mTvBu^+Gr6|6xz#LK-`#igoJ1n(80T9Lbr0b}OFTZ~CkWrPJrB znlxGL;vqP(#|)of7~ZA5uH+L$wPT(4QPrYl@RH5o?T z7Z(mI8do@^KWc=oFP>R3b^55mrPIph&+b2S5Q>DU>ci(w#0NALl7?I`=G5pttT(QS z5pp*0GMigASz4pN+Zc{+>Pc+Cl9)5YM8owr_~K!``wTDa+h_Qw{v&!9v!46wpPk)r zSXpUxTJXXuMoLS(-_Bl?yM?|(@jL>NRCHd}#>5O~J@;a4oS*@HW!>vY6_}kX3;B8xd&Y`!h z-<&-Mtt4ml8<-k4|De^+`Qo5;RdCs!#=rn)M z8ZY56`2^KikP| z>q+E0d}!{%+bcC5G3g;K#KWa^JhZ`h6l;D}{` zna4e0Y8@8~Fw8g_QRyNp#KqO(qPlaLoB%sEjcjz!eOVp5nHj-*)+Q&dsgr{v$X=$i zahOi%dTX5=yn`HUgD2)77khOh-2*$E2eTnE+u2MrMY*oSX# z=170mT&a!D&{29`FmGTYCOjR*=i5^{Gk6k~ zCBe9-(}LM0y}Z1h@`6u1o#8Z#w-R-S;K8Reg0o9vo!h2bJ|}yLm2OO$Ijxsi1G8vd zyCs-e@#H+)@Sgaow_WgD$!pGx7zyQ&6lp`Lui8A4h3=dZe zg_j#%Pu(ND*zhRzlJEkijsqT0`6A#KHyZGELF9lbksr&5a|IU(@^b~{ zT>eGmq!S`P`4OKHd`0kG!NY>z8^p*L2PPT8!i7WRw=`n9U=u+z5dd;CTN}ucciNd* z+Q2J>Un#g$aFyWQf)5JrAO;ZeX$HKQ7AuN(i7k}+Ncd6V-w5ZByA_Tq#f^a(F!MxV zA0s?VuqhF@>rTQ8h_K@@9ODfJ1}GRIg3HBVqVO5QuO!0JHAK8*FBLsM190m1-GZDv zO2<0|`8|-F!=c2th;d3C68?<`?avGx7r_}K_&;J8jap%ZEWunNGSHj|hj~QYS$Yc& z7aT=|-FPDGrV#N=x>EQOBGS2$lLBb4Mg)!++(*Pc>IvbyMZZ`0+k!_0e-(^CCx`wL ziAW$#cq8G>g?A9%i!07($l0ijIGl(Z`UK%KL_b$J*Wl3pdf}^xIZCY;zFG8-3x8S= zKR#pP?HB&O@XHS|00%z`{wW4t^d_tZC9RSDyYMx3Qnj&5zXl`xb=KBU#-ZBsh#%2n9!OX;3D}(N~@r9PA~U$%sIH>mldpD{-sA;LR_N zia_k~tk4F|$RF$mPWM#Z*ctSMH#Q2FZg(nx#ZKuKZ(?xHON#?Azk^cXIui}=6@rUc zN?dE43c}NgpPAVHJ|-3|r9?BaQ%A4tU$c3hCbIU3sFmM|@ZW~F(gtqt#L9C&9R!#_ z2POys`wL8{MEDRQ5-b-!orr`N3tvV=2292g-((ya*(UlYiOA3a;qMTUF>@lq9w%Z? zH-}Ov;lxolM!_`~3KyZeHX8@-0bim&s)x?# za$e-sU!tqfmB;62emlfB=O3ZRhi1-$w?C(*dX-EbNx1hB-r~c<&Y?K9--F@_iFDmLE7j)AA^?==rb@EPMr? zkGIrVeqw^g^50I62w48fOnrJAEsH#dey_1SY=Xw}b7wg$1G`aUo+F>YqMkxVI(xon zwMQ;co*zykODghec7+3Ddx{}Hs*gE1J(#x3 zki>Y;FPvyazrXUXV{FeX(*b@Yv-hJyJ-=N`hL;0n*VU&Z#HR0LEMGORR%MXLTOwu090fkn?jHuUXg!H1rM1Y>T2rvM}lV#PcL z6NJ|@Tv=-w8;45KcbHhQOAtZd>4rO@F7#Rxj>Gy3$CZ9ZFYAmK6@4eoKQjvbL3M%< z)TZ~D6{tJNQ2>LaEpGn{D_kHoYO37bN> zhA{`3GZPLd=04lRk3GP0=h)0r>>M1l-wl7jvgR6_`0+?1_5|Y>8bRC@O82stz*;4^ z^2=)Em%DP6n2e^=JB?hw$4v6a4j_2XgZ7Vkv{oB)E0d)Ha{825Zj0JIVIbCcYh_}oM2(p?`A*Y%k2e%JNs zn!N9KUEcye>C+y#-P?ugi@kUusiKR$b2Ka5L-j zec&of3|Kb`vN(@%dn^z|1k8uf*eXI~%Wu5o`z ztuI!3y<9JJ(FV6 z6#gayRJ=lNz@EYag7bn{2cC&b;0D7U1xx!BEv9cYH(34x6uKoA$F-YX%4F9gs(dG} zY=aZq^}XKsJ`C$r<9j{4A$?32f$MvX>r+r>n2ACg4aek>{KogHEIwJdm0;JERdAVo zGfi>LX0Jt{3j_Bdz<1zmPKv*U0nUqg0fC0EAfVD?ap2`?_dKy$il zPUkh|IgH&FI&4k(PNqLGnImWYV@)y&ox;aCG`vAgM=-_Q1s* z1N!S4U+&dCI7%#*Uy*OZX)1bl^in>?LG%}p^Hc`s4RRX!C2oB3 zTfo!I&Hr1ZjQW2R0@ZXTDnTc?_iS*K80Gr7rd&zpe$96Rw_Hi)mYqay(sE-q16NJQ zA%{Arj;n@IFf~<_V_bD}U9tUhjIWDoe7R9e=_`w83pc)z=*pFFlKm4z6;NjXg~06$ zaBb`>2sBJUz->3Si;;VIWz(_^0?irMv@7*FFb}8__fp8>6PsHr?7DIrQu4QhC^rw> zgix~USgq4)N>*Y_Th>R(Oow8cd0bw>i^=pUT+0>YreEReA0$Ui&{?tzHjPw}D*CjpW9)%lFV#7JC-lkblep zto#Q~vIj$U7~1Sh5je{LhmX>60%Xra;35VB2rNaQAuq1l>%++JtG3+90OP)oKy!L) zPT#dx6Coif|T>C+a~pB;lhF9tFYxEKMI#a<6LN%WxM~vvZzAw91D_xeg;F;B3W3_JK#uxv#p2VnfB{Cn9D(L^*PPC4bI#Zc zp~Kd+7n|dFO>?;U#{?5;j^m~|o`!LX>DeDQEqj36G>04W^ZIQ6rZ)WQGc~?SAk&rC z(HCc4Lc@FVX~td8`+{p3i^8Y83WexdcPXzjs;i$sZqhnq(q0Sho>jk_ly-uvtN^=Y z+}r{@hD5WwKorS99|W=)7>YnU1XR0)8-{0K5_U!*27qd^9*~!DS1m zH92t;UPo?ndaJ30UEppl+-5TNF}P~_71MvFCZ|XR=S{cxn)-jn)WQwurMR`=@^$3K zw;T0Qa+9{pp9fb>TjK$y_tp63=!vd8%WRo*aGxpE!5Y^t|A~A(uYW{ksp}`XrF2;* zGMs}h8v&NWKA`Xla+41?**n0~zTgG$ipj>4;2CFm?Y?R_el;P(+y-6~I<_ST>GghZ zfQ_#vSp_YJ;2P7fn`*$)fzM#O zfc8ngx2qF)on}nn5CcqrqiL!Q6KH|9SWWxRK9l)+c<{NIX8^wOB@7|l@cH9C`lb44 z6)!?~rRFeD+XPDAYFH~hNn3X5^n10^wy#t0afqNB&w)cB0^aQOchhSfapb7&D!%{g zUzXO2IeOIA+<^b6m9`zl*ym~mc@3B^TZc&g;Pn%u->h}T@us}Tcy4CvFKfjdeaib7 zwWJ$EjP%{|=6yj?s}RdPA0_QWB|DjHFWnBOm(&u+p7M6_%p9eQYsGwx%4@@1mxhS* z9%cM#p_0G^8qE(CUBkLtu50TmuZY!qduVBcd<;0Dk_RZM43%*B5G&n6>Zl!)e>|j) z^4>G=|GPuW*ovioDOA#vlGj5eA2ZVjLnQ;4*yp-G&OE6Zj^O3ZVfCNZ<7>qn#mnPs zhW?9U%;!X=Ai9Jik5y}#_dQEpKU9)HZ&_AI&9G;pn^_@ce1ekJp^`StT7Ia+%<8_t zNGzGA?fAFqh^n8n?VE5QH0*<#>J8iF+86dKVVz zaOe5Xw!iA@&h|R(;JD8^27z|d!4o2?fwbNy}Ci$^QNEP?wsy!_tc*` z?RwbV@JkRgdf2Vo{o>OJL(ZGIdVQE~fbneI7zewpU2lMeq0O4fyz8A~J+Sm)r<2mt zZk+r{nD$?iH|D%#z7BJS^|U)Syfa)UoTs?AuHX^pk)C!=+NeY$yfb-&oc31tO z^Y?{zhxqFw>!@#adKcLF@z2zi@2gr~V25j`*AhFSs;bZ)sGaEE_FW+>{;D48Z8!2% zwJf$T^O~P*TsO#G7yNQdCVsKeQ#Jh}yTJBVlr5-eI2WR*7I2D)LvCjLK+KEXY z@*=^G6VhzEa6zPUK33e%;Gvp#oZPW?N>Tz(RH&*WcyMKum`Pua!o0DqHzP50pfJlF z4@>O0V9e~aj&-69L9}e9lf^M5+!kuKT_GM~oS|(!3H7Vf;z(wNNsGVunDiPfIlRNP z(4BG9a@xIbCwRYvrHAf&EUe@H2qNJv&_u$+sV0NwT@1WBEsnmp9v-UW;oA@oxS7^? z_^3`1kHbS}liTSZqh?Nql#5TZ>YDkZPP9f)v|_a8oF5Va%bM-x+N_7p0n2eteP|`< z5~p1oOcM0=^~SUghiP>)giiM2^AcWbN?D1-Of&Q-fF?At)DRC@h*6#0>gi(D^|Tub z)BZj9VKLN0vk(tCAs+ZOG&B$V@oBfF`MosML+6kJ=Z1KAwvLA=cqnlWUi+WZ<_bdc z&@jZqp*kK$*W}@oI(Zlpl84429ys(DT8gpE1DmbKKXp8e4#`8)5D$&(c-Sm?NaP~O z&}t|T$wKoG2j(LTcy&`e1_vul7W&okFdH87V96_`Wr&Aab+W*@7qiVNTl|R?+j;|{ z`6XKGkZ2sa3oZL5L~~p4t~v?t3CVif5Dzcc@vs>lmN{$g_a>&+@$g!8)}8&Oc8<3d zo~~|EN9q{<9+Fi1kfg$Jf`(=`4<7C?vkQChSEoZOnm?h%z9XxtV~C3`;sOn8wtcvP zn2D}&oE}8y)f$hZC*meKvyQj}QgI`!tfQ%Lh9W}T{dL5tXPfnmCSLg=T4)a|$WMa}9H-I4UwYb9{1KZXI!Vr*IMq(4mfaG~PlBoQ+R<5@YLV z);VhsLC)4z{>>}rhU7p0aI+}tglZ(geh-W)T;WU0v9r2UKI_aZ2 z;x93JGv1W_k2;zn=U^E!7w_CvW;aD&X>S?wSm5O5TZyqa<3j6WpKChGiJMFt<8DqJ zn?}x@$!IJylorzHlUy<96@_}-R|Wvpqma9jnUxjEpRf^}R@9r3ruNm*AByH^k%WO!nq;VYnQ z^u(_V@}lei{V;8DhFay)jN-RAk-w~oJaO_f^C$=79^d0g!c#_EO^c)vC8k7TvF z5p_~pfC(u_(4SyR6R}sPG^LKew+o@<1n?dc>v$ObRPFtvEX2b#bv^XL*AjXNTv^9M z@lMQ#!Oetum=fY)WgQPwij?96yXvjFyesPX`+b)?e}?|1Vy`aKI@e!&^HiXd;sJQk z$7Nc*(INNyC1E~2xShS2Q?@5;tCOGEBk}PFH{|M#>2Q0jPJWKyYw$bp%lyp1UY(!k zV29|l8Hd}lF=qbub7Pcx)6t7O3Bi*sW9u)gz^5ym^K)VG6z6dJ-oIX{{a)w9zpb0A zHcYomw2sB(>hb(wTk8@;j9SJkidULsq=baP}Uu+8P7DGia9G7C+In_mG|DTz=S!cXrLP{o?S= zS%@4yyM|}Y1|MC^5BB$_IXBL>GgTuo4ogyA{DgG3Wc2@D2^`VmBjSg9!czlBI zbRJJqqlI@i`V=)=cq_xxPVS*2R^L>W2zT|(Rk`pLh!c;#*HYm;)8jF_{lW9>+p2xSm+`AhylSV| zAFWNWy*e$N1DNsXrSMBVH$V0`HBz-bkB?RCOmg#MkHgx5{^#-jir?cNZ$AuRe z-c|99hFicD^i}+R!p-GHijzBPd2huTZ`|0%ahRj{i*UEZ{S?34aC3P##i`r1ybl+) zhwuv(e-Hv&KuSD9brSY?A@ zCt@HVidf|wUSju4yUm?wP@{&KsCzE8zX?3&{_!go}u<=aL!9d4Hn)WFiW1g~;a;Q80A%l!e@|{MJ@hCYqgrBoU+$AIBGF z;ug+Qbq!k!vLC|E2wSdcYCeW_r%;4H!G1X)wGyOozc1FR|{(l+>v;LC!i1U)DT z?aUAR0y(Hoevu%5>W=&d!F7W73-YJMs6Qt7BPSbCkY>5qNYMQH668aK&kxRPHh`zn>p2B;F$@PDc2!@Nn z<-*H}cvZYs_%gv;1^GirEZMz+n+10Ya-t>gC;NoIDfpq_r(wMQdC`Xh&5Z+h#rNSo>(L|g&!{r8nYeaAZF$;r5!tW&_flb1<3V%-UMUlTL z`~%^fxx)mG5_9l|DEu!X{PE*0^(n+h(f*ktXiv<=kB7Pn^M{5QVYKj4!7Bvk6Jftp z_$`8W2;MLHZNhgEk?>2zMtJ%ej`lw!2FJv}ELcFor-lD5dOOl}5KU}?i6X+A5g)}3 zOn7JEJ%kqvA0(WkOSHd?$m_pc1T%=>3xr=Me1&jMU!?vnVsk9S5WYk7yM(_a{59e4 z3I9a+m&BI1B?Ha%e~yAj@sfiFGZTm=f+q;i7T%258c#jpMS_C_M~l8p_)NhCBELcS z8Y23K4@B|$$7S>c1xR=|5yP2p2>+0XjC?BmYvDf#KO_7v;lBE=eIyb7l7(joZz7!Y zo2b8llZ~uSIO#+%R18K6FBLvn_#ENa644)ACEO9*Ao#H0cERU}uzy|ndxD<@B=Cb6 z{4U&syPnkzmkALy;1_Hz*q+z}85cfSaI|2l;1z=NiLhTP{1(B$9TK=-47Lg1MMM?7 zL@dDNBK(l(j|u-#_-WyP3%6t3_|e2(xLSmBe2)cc?ec)?EP@_lP%M0q@X^9A6J9QS zhVTW#mlFG6g`n_z1RoN7oVXQ#U7Xkt{R6|%{_iq?9DQU2=$i@uM)+yrzX`X{^QC>P zV76dG;#PFug|`>pQ+RLT7YQFhM2@epDVmMj&8sZTwzYu;u@pCkl@TY(Q>o9&HK?JW74`EHJ z@K1=C-*#B|55!N=rxX4+@!#0d0cD9|h@U7dE^~P<@nc*~!rK!+!j~W6eK^_3`Vfo3 zMKG550R|9+&m+E%lTi2##P^iqd^{%T5Z}e(THy~958|gEgg;AsN2xu+-z2_`TfXqm zIdWsYg|krvr-*L`PaIFFdh-r@u_u5Y@lAYT1aid(k+TShT=PLRFP=cI`5=Eu@D0JY z1vzh@J>p}6oN-0|tKi>)8gEvV^941)06+K>xwL~l-W);xPB3{3!7hS51UW~I`eH%z zV+i1!fKK@Y!O4O%1m_4Y;93A0E))T$sgrZ@8*!~5|C%oOM!^RJ`H7zLZGxPnNdA)G z8-i~OelGZh;Lqk)84%$&5u6jmj4b0QPLS(#=-9j|1O39eLWT17g67Q`oYUth=M+t1 ze?d+-B_AO;-TW#;BYdi%0C<()wSrv5Lb>_%1t8a#lJnJ?$W<*w^D7L%Cx!14Ey$%d)Nd865;U*wO#&D;5y2~h z<{cgp4hrWwA3FF<@C(6j1WyQ_7UY5*zCHN_xnPGpO|Y4udG!xK!DTsoUAj<^t8&PP z3362qd6^&=;_xkLfuMQC2fto8*XK~bR&c%GM#0U3{F)e`;SLd0336Qz<*y4K6#PK& zGr=Q*-w6I7cv|p`pf|$x7a9w99|>iMAV-kvhA7V$>>}7hkn4x2A0jwP&Go*-8>@x^ty;3~n}1-Z(J`UeCb6EveCkna(`Pw)-Fw*|TG2`{VxWkyBt=K7s0 zP-b)l{H$>PLIK}w!vrG*xlD@kY{ABY%?0xWI|z0Y7$gRG48C z;3VN@^aOmC@Ogq(3ZJRxnjCQ?Qj8o`FH02nqy?1P2NZ7UU{5I-DTLzg|K&@^CB5V`^SFdq2#Ej@`3T6oA z2nM)>jRyIGT?Bgw76}#$nsFf54;MZ`aI)YG!8w8p1Q!ZkFSy*rfZ`fCX5e3f_X$2I z$Tf4+KO^{};46Y}3LX^vSnxB!F9g34{7vvLgSh^=?2h9)F@juuN8Uh?i}1)h3UZ|# z$9K#)5^%8a;euRwNBv|$GmZp4N4ObJ0$)fTK;U{&EEnWbJv#W8;6}j*1i4_4`fY+$ zg3k(aWgqo#34S2>iQu<_$AJMF{vv|k1;aU919_BSqF}0EGr?AZ9RxcI77LaLnt>?z z8!fzCaC$7C|4>wjV1Zyj@Or_U1Q0V5nh`W0S9g+673AtpYY^Ihp$NFVlLlr84ahZ|9BjN#@L@qSk_I`~bW*=Z@KwP# z1kFeq^dAa8Bxpv~AU7jx0R(;##b1K|2>KG-1nLRK2_^|P5;Q|`@Y7a!dqFcK2YFB7 zeFXapa%3*R5{wnWB*Ah)Gc*VNLgC8<%}^cW>x5SdZW1&@br+ngtriE$F+cTV8;4@-9=F# z*iX=m`9VKS_(;La1WN_y2+kM0fjA69Jc3+YOI|7XXg~s61-ZJG1}_S72`xu8KM?#( z(2NB_&Ly?f|19{Y;5k9Au%$juFjX*9Fwjr}O$E6Kml3)O77F$e9_>$o3f^P|aAZW%C5$}lbF9pq* zBIG{_KO^|3L9{;?_cFoyf?VTEZUz^D`NBI1a&a&97YTBWFL|lpT)`^^%~&GztAulj zFYPxH0|;yv!A?Og?xn$7f?VTEepK+ZAm@8i&IP{2Xu&MOTtTk(rM{D(Pk}#-s|D!n zd))5QE(fpD6k=p*G!X+yp+?wmn32o?avNa~5sEly+Q4-;&}qKS>^W@>T5S@efSSf*GBXwtqGUFz1 zK>Rla880|Vuv~DupvfbQ7Ybi2xJ+=h;2nbN1S?&1Zrf^KnT9&~k{oDqi@G^Zp6g_9 zvr{5aHD^hiI6XnrP%}{)6li`wv9)r4Ke4qlbDMoZ1Zt`S)t#L!jEsun)HbV!^A;)U zX#{C6=L9MG9g|4=InhtpO(RfUTyo#I8 zo;pOdqxtb+WR^dv#CFUlB9~@57IHa}994e}u|3X8Vkb-pCnDRQ64Ah1e#Zum_W%pf zlOguP{o72VLJMC?0kY2D@?lTIj85Y*`WZRO5aR`+$^AqWB9XPX-JRUbxjsnC@b1J& zX>{meYNqIzMg}*H9FLC>#y;TA6Xgej$Hc)lB4(cK7QTmw8ag2S9b$Fs!eMpmnyGi- z;jG<8_(=vLcrzkukdqL}ONgjRPDZo>5R7F2Ra!0v(}}3s6~aw(p^D91J=j-Lj;h`z z`rSlS`NzUPBceKf7k-wACJ1MfB7PJRP0yYoOGtucQ=P#G^R4 zR1dB94|TUwmrZ444hv%bA~9(Jc3qhcn{X4$DA1^?-WrYc^=piHDY@~ppL7j&74{vj zMEqGgY~!)(O8#bCxS831jz&EF!$(nL=t~GiVOLsds=pwgOs)<0A$Am|)GBQm-WWU( z^$d>qtp!FHf?)k62vl!6POE5MM4I=o>XPusL1RoVicGX?p^Gu;xO^44NvDs|KTd9v zarpsoH=q4joimiR;mfcO?WYZI1Lue|5B1)G)Adt`!KtxbU z2!S9iBtcPu4Ty@03Pu^!D7I&RD(GXe0*Zi$3iju-pz^`iL!~p~;ib!Vxhy?JHJ5cabLI90Vt|ZW=p@LsFIjWiwmP&9O`f<@&%KN1-VS-F zjog#@^bvfg9+ii6mCd&4NI$hJM9)Agz2GJbQ4|mX#3sim3Uo)6m8u1Jt{()_!Y{sT z^)cmB+pSK`w}8yM7{~d1yWJXw(=gPg68W!KLAm%9t4^-@*tVtbRTob5dXNgHF)Um< zz={&`!5vniSR=pRfpT)EjC#$=?RY{R?e-|{!uoJoG0ru6R0LsO9a;nPQA3$!>1$RN zjt0U`8`hVK^_0BgH7h&BGt#0&`_cN(Y<*JOO*ktpV%Kp>drV1c*@I%UCDPV*%jtH? zwiP@77xRPv#r#?``<~+d*Z(DYt^GfIS|{(`X${KWYKvqXC3nx#$%yc`W)Pp%g`=hBR*o;PtCYKUS)1goyRGx(&u5xZa@8-8>-xGiLSF2c z!SK_sTaJ)Nio_AQ=MC%1hF6vqwj6g<+u;9iwj8;^@ymmIt-cKdt7F46-n8x(azmW$ z2`_ou`lqS(irDgwRTou)76RS@qlY}_U2IRGjsi;g77XTT7H7QJB2cT`Q)2j5gA=hi z2+)PAW(Rp;ic-?$leyGXEc;rg@UG=J(_Il|~qb4WLy=FiGz4XhNRAQ`zjn&Rry=UM3$;WG+oqebK7ZdW+*?nES>Rc?N5EgMy~nL z^zqrLs}bxoC4k}2hqkw6Hw`H4@D@F)tkxvky`8aqh4Rd)ERX6G!1?PYcX6gbRAl0@FB#lHLQn* z^-2TxM`<0uRdC7<7d3Qhr6Kb)4gA0pt&U+DlzN(q^*!C*Emg3Fk3^%BRzW_m{(ej> zX(-(sNK$($ffKR$J6RpPblz!xR^#2X-Gi6SqjHSDrozUt^RAovBuHZf0Dxj@C{r^@e+G=gFospKNUV;{#Y07e- z9J2yvsgC~CN*3v|91DM^Whjdl!3=fqGjTS4LLJQ2VrvTX} z>}Ag>A}|OEtuEII6}Ma#maH;STCO&#aZjv*AQP{#1MN-~X{#2mHj5Z-<&8y7ce&>? z)Y^X(IsTrJK)6~h<4olTULJk%dAD4a(N)HLZnYD6a?a;gksA9*!YlqOM3@CePs=$bj5$Vk*_>RGuR`d113b0 zkuI+~V0|uo?Xpr>ucpgGUs!(^GH@nRxP-K~?yH~c=4JL+nWvj+UyUQQyT;w+Jztsq zLx6@k45L(O=6?nF`pRXKX`IW}YG`?QrTS?*3I?|z7yrk_PBE?tFe`&mp6#8Ey zckf)zE0ztNs-;vqC_ZEixOe4PT&Im7wy|%8J3oRn-uo%Yy1gm&@jH&SS??X>ZkEAZC|W0_l)J35UXyw=dy3QuhTfB@k)(v z)s$QRQ0^ZVMo;MQF>SGt6eYzDO~2B7?xRJyqol}T-0Pf}8)b6LD47&ENZOr;BJ~Qd z`o?n15Rz9t7f|(FkeodjeNcAXn0y7AjwcP`)0w91Ych4XB^4<0#(lo^f@iCO;h#!z-Ql*^6XTTvQ2BAC*L|`)yT=;Tj%gpt`6jZ zvH)YYWU)%hN||pziX%{Y;$|m}A6bzm>YW@(ig!>IU7)JyLYg4`)p0qKNs%TOX<9~# zw3(r46=_fpLxNTlBTecwT};Zf(X<{klW|x{2IwkM1a`Hea`O+?ndonWhrskEMPQ0Z z5r|7j;dw1-5N=7~naT(7WD_xTvK2<1P+^#bEn})Gjext5@6%}lj2A_vkxGO@y!$E@ zkb_n1ATXB#NHrB3U=J)dG2>8o?2fR zDEyQqmhdemF`Xh)cKF#E7hfQ(yCCT4gPU0pUjDOnfoc6MX3G7Woj^nPFN5LuBi0L| zr5os|6T0QT|A@s8d>tsKdt9N zMzDH>SsbWJ&wsTbP*y#{=eP5pvkb#l^4#|k^)B~t&B8-%eIXi6khAcZ3@dUJ5{JzY zBlZBS^>ARFr5>f}9Zn0|d4m=&&|=7JxHIjL_b_cZ_nX9<3V&M-gHqCFXp)iGhV>+k znZs%1@eg+J61uXzZ0aICPg49Ln4JOlQ|3z;Jwx}y=)4D`-*aUrc;<;E`zi^x;R)S9 z&JqIC!(%HvA=X#6=UeFV)V~0}&y!BcRdgHcVHxgOJqPAE!z(*=R&C%wO+Sqn!aJvYj?PgtoTo*!X8 zY;6WB=5vI=e3%h5Vt3L!NLbMi(D1CqT?$=+XO%$Q0x(3eGDDs(foSXi*?4Mcu}H{+ z2VxB6M2Vk6xE>h!4v3P(#{_yS7^5`e?x(hk<-(Izdgx*bvlkp-sF0go@p1*3^Ql2p zVQ~aiF9J{>^F-rI@HvHh*onn7PAs$YQ`9EsR}hvFR?zlJ!pVd@GDKWOXbiFQjnw;L zn3Xn}fnhU>^**8%$J$J6VEXaugr8{S_oeua5D*(^Bs2Xg1*uMyrn4#(8x$CyzFOJz zC2K;)m(+j%?F;ObkVSqtqFE(NV=XnWrA(MluY#KIRFK0cqSVOzi+Xn44+~yy+Pmql zn3sX+ru#0+AlS6u~PZjpnLLPe1PLgNt#;{^n%bqB+FT}vzam!AS z{zvWPhJAng9N}mdKJLEdTzhqP`^1{rvu0J+sH4r3>Rd2(fl*yv zTSqHd`l3j+YGzi*ZI_8unXt$5$ig@~QEpAOvt~j=-699FDw|gU_s6F%DHnVRL-94htDrBn1_RK zFRQGnnLVQt$EMGyTr6|iih%3&6rUXy_&Nh3Ln`Jp%Tz3wKVx>?>;=?) zcCRtzwR7C_?$s&ri{{tPo;AO6Mlb^&7%KSmsxQ=3ESNX1eEy8FvMJThOsCtTnX`=Q zvDkrjT(wb)Q`zefcX?-&-Oru}tumNqXY^6kO_0iJ%IoIUKu_zS7gSd^hpT4M+)5+z zK;;~t-6mFtMFm5?6lZ736c6DY`;v8wFic0#M((h-Wg{P zmOH)|TV?fPbG^(@upe>1oFH2;tMK|kZoE>YC4LDba!fP3N%l;zaqJ9p5yc`Gz)SAX z3trb#MsL=mpkIURk_}Nb*;GDc!IpHIikFZ<*Q(Jeew4+3^EDP>x?YV81y9r6CCf1C zAxGV;GMUGzJ2FlRqq;tXh7zUW^l{QhpdlYJ)WE_dqM`7#Fm%S)Sw1z$-eKDx_br@N zYiCJv#pAC#wachQ)Xr*r3PJXv9nTcg2@V8GssP19WWofP&N*J;d1 zaTsNT#;$&Z0p(Wn;o2;*u9lC)p+ujPX19^Sm+X>IAzZNOIziJZnoiSnuBNq`Ua9FS zO>fe4y`~Rn`n0BDO<&Y>m!|KyG~|vmAOMH7#jlz&^DtoXnr3Rs*OvVAG##TUhx5s= z)AVXh)o=j#k82#(bep0jXq;=tN1C!;W=~5s9O3X!;tYn$^&pWH_8m3uPKvBHk~Bl+ zW!Pz4=2%0BT&_CzzFua;>bo;Jp#D$}>s_ybm+d6sFg~eG_ul`~cT(q^IsmTgd zPa4&x$}a3uc=ERsCnrKGSU9!njKcLJ#utqTie2^KruNa({qs zTfG(g^dCOit7p}LP2h|CLn7z;P5tVB4t)dFIr#M&dPpPz6tj-bzN2?3&KVH>q$f$RZ8}|;V%5C!da*rOb9Z)uCRA!aalwY&yaDC{G!mND{ z95W_l59o&g2b#=;#%Z}Xt7zIZc7X<2a7h6psE4Mm#aY0i(=$>Cfc0S`# z{EHKvySQi7e>N5T;+VG%Z@>TSsW-uG+hjU{t#Lb<8B^rN$IhGJyr4z=uvxz$^EY4S1VK>AQW+1`D z2*u{Kp11~zjdaB(`yT;17e8iZ%vX_ck@zgk1L41sL~dX!ZsTZRw5#w#5x|%p#gBPh zY!E45l1@n?3~;#lDjI&r?E(C7rLqnP!jNzyZsIZJ{dQutzvbf!zXyy-2pez{C=^hH ztf#S&p)f=ZBie*t1`8BXySm}i`?4CEZt5V<7-V-21##j6(o@faz=Q^*f6MF!Bx%cB z2&8D9aHmUj&PWtVp8RyW#iH`&ITUCn#I-o!+=%!Xaef-b5?b*g=5Hf<2F8ow=ci4M zxzM2i=3?{=a8N9XPLK}0HBNR#T}kwCl^j&3#$bk05(?lnnHcR!_NTXmn`$x|dL9Ub z*j^Au3CVfNI1zVs;ZYga;wOv=jUaq1!eApnU4^*+jGr(#5~41$ZotorF~I1PCo`Gg z>MF*)4nJXxcNy-+hs+-rc#K-Z2U$)kWWPFsBZ4Pjpdj2*WQ%Kz*d_y}E7pWlSu${* zJt#zJUVPq>i*F_0nuxa6{JsE;_E7v7o4NQ!F2oXYc59JLW-2JSM;I25^x-!pd zGtjCCT5&-uD$lw+uVC7F=XLAYYxWW=W?_YW@s*d&u4O-NLS1F` zwDASwCKQY;oK`S#e9;)AVo^;^<@~w{sxxO)Kz!Pm1v4rO7R;Z?$t7!s+R34ot{M8o z^M=esf3sl0+!^C5QNKnM(57`?6207cP+%;mnWf|k>gF15zgYE^DLxFrs;G=87+~wioK1LqCI1>$x>?iI14b_jw$#Dy8Z){z8&8$ite!0d%3*^Fl zJE`HRwpg`~-XuDO&!)FbGI~9!eD0!3 zxpBUoW#&~hY+p7)PmS>}Fdg5_MYWZ~%InHyc{lTFiL+K>#TI#ZsgoMsT3~0G0QZeY zk9~Bh@H-!&ACWFap`GjefH!MBdnxjhuD0K7N|9p=?M}{0l-=#wUy`c}ZETUBijiV@ zA00e|8f+4Kg7OpE{Do(0DQJ%X{0RB`fXooC)f%lU60y!phl) zLSl`4jz(@8a9Dmp2W1)3GZKRJ=quI8#2z^9XV^%D=}0X5S8^`Q&J1){M$6?RAzqy! zAA-2~be!rXeFvK)_L7|5D6_W7oFZsHnvD6D4QpksymvRA!M-Bfj%S`RkwtpqrJO4o z;{TJm?segpvBmbjo->%K^yLR#76G8dci;!-Dqkm|$aqTrSZo)`wCn71P8n*O0FXDrd3>ZsrWwb8f>DQZ%Fx~BaAQpAhXNP$DfI4v+y z3(O>i0&eq4!7H_WNaIx+b5M|qIW>^-_iFp6G*xL1`|VopbuIS}DFULt4#cAr{8BSe zh$)3fHU5JX?}dZ+k`59`p)grteq|dk`@Z7%L#)pk0+yhpthh--nzFhkzC}~k=fn?d z`lP0tG~KT0Ynr~N=|`G2ks@HKl#Vjwh%xrqZ0PHt?Yn5&Rnxxm@NHI_XPAPr?JZ8) zM7X|)5Ogr33D>Xa=;HNNT?V{0ijNdhm~{o^RaatK&4S3B?^Ajb8DVp*9qkF-X5*#h zoLQdaMNN?lP0d6!rqI;YaSu~F($q|Yz4b0^?MPE|1(c$x`7HzL z^R|JDmZs()y5~084qKW%468TIZc|gOZs?@if!1~?^yJacPO81+?M0<$$`>Zu9TJ{| z|6+%^8rFvI3rqeq(a!37Etwx`=CANue5-(9!f|WB2*dj_ycCDDH zcxsGToY3|+A$p>lMZW|)<*p`|;ax;;x+_c9RS#u0d>=XT$@A^3&?vedr28ps1~SD<@tK2P9>wJdnNiQ+HSPh9;a6{Q zxk?*;kcbUZ=n7&WBd$tLon%*wGvwY$_Sn!EdbCBQ@a?co;SMz7IfdC;PB}pQyu!Z{ zt8l!a@Fj==H^DRVY4H~Y_p4{ep$vGYrmFp^M2Y!wiN*~GoU7z-+Q>UDusfK$h1`09 zoqmZ@-c?2N1L#Omf$OI5Z`2uh1a~pUO$A`)0DRLx6kL_#lnv(*x=u?JJ`30gZ1l); zCfi*~l^-?Af)gEF!CHl{A>Kuubqe!~T?%*26^j(+*QJyKCfH>PA0^HXKRMYRE6m>v zdE!DlUEC5*n_`;+$B<-BwR?$cnq)u(FFcptJ`%JcLqq#il<%Q3PV z=oxc?`%zdl?gl&gE%*a2pCEUgtw* z&j}xfV`tkFtnk*k_Jy8Sr?1H#d+n9s##-Avqxt)&_=iXjztm`-VTKy%-%NPqLtI&^ zL@tyG9LTgd0NnhIb3Ooyhf)Zkc=(#gcK!mgrt%gk6RMyTWx_`k^Lbe}w3G=f(X92b zQQtK!!`dLLHrTl#e!Dbxxo?nX3>7?OTCCr^+4SZq^%M+`Di{w6>o9Fp?Q~GPd7EOR zO)Cb}bu-#^<3lZvjv^eW5gO4r6%tXM6;qOnE6V)clCk&NXAby;;pl5xo+%8&AHuqg z`hKVKKg8V-^*XM3In1%MkpQkQaa%39@Lr6stpH!_JqFiIrl_}}Pwb^X93YM2A_=jV zdYA@LPb*tK?d^mtaK&E2Lxk+hxG)NSMh#bxBg3r6qxhv+>?Q087|&pdx0a(aFoqLP zmHzweH$$ArkgoF59O~uO13%F?7!IRY-wI_>4!QVjhHf6^ZidN7zn7Bg^DPW&mY-<6 zo$gjB3r3Rli5shH7^`iBD%{H1yD7wU?5a5eXrx~$7v68DyD7DfO1OT&RkDss)KOVV z$vTFG8<OD7M6#U&X z!q+`uw~vwwM~GnfjDOlUSuL|0m}%9gA)NDqx$VO?+V`Y1=U&ckShvfbB_5MiyX>GD zZOR*V*~MnE8UA3G{aGtDSuI^7-MJZ4GIB`8!bP)dD%m}#ZHTW);qiQN8yogA-Z)axutd^gFj zKCs)*QoJXWcO^cyBgGT<@Lp=fGB{!zJ>!LTFZ|*lzw6gFy5V4<>uQ^J4J%g%#|K0Sr#oQ7qu zWrVLzavY!7FR#yZI%IO{gtOX;od$0`PXkzST^R(=XL47j(>98OpSJKJCO>65L*p>} z1?#g|HxBg7lY_FHwql69D9h;(tKQb^Rj`S^QLfH%dWu!@*xg_YMhx*dhh;C?NxNExFPJx^` zmU{(iMkyK7N3<|HQ(x8S7KV?E1>8kYJ7MF>tee!rm_WwTsV$6JDqUITm4O^5yvqoz z{hgEY*->I4=ZBRHbf$D{{cxv;lcziNrs(-hd6z!sGx^JBoAR95&h5=Ia{gCNn$@?@ zxtv2Lw#k%Bofp~-7&UOrz|rHH4BxBx?2ub^R+XpluGyV~*B7SY<4Pa-^QF$&p|grb zZlKIOTsG7^wyEZov78%*uHHJXDSv3&;>59fd5R08DznJHo z(}zWfb*ZqN&P*YnuwvLE7MD`GOiA;jYr^~Ve=ZfXgOxB(j+yVQEaP-1GtG>HrG!43Z_+sydkT^l596m}pA2-ZdBK{1& zRJxsnU&>6}@C|1<2op1946#=%=g0}$;whX9j#q;MeDo=g6GtgL6d1$(s&RIvGQ$pW zz77H4mTv~;Q_@FKVx$F0Sq-_9TSen%5K8$L4AEB!&4Dq6zKVXt1*#%)!`)vAaI`6f zGjqiNg&(A{3{GVh3lxL8gZPO?3^{`=4DYFS&J~gG5RSX#wB<7e7o^I(8kDR*$uDZ0 zHp#3Ig>eDy>e_?*2l8vn&IzAg>*Na2RsLM(oF#j_=-BewI;ToAM7wa-BIgDX-0cmb zZ?Is!$_DK1-?aA$!;s0&f%-CjHEJAtHQat8+g$B*cDNzy z#)cuqogHrLb4X3DS&vymO^8!lBxGk!t`V!kW3F+sggDx;d`nh%<+aW#Jo#|kD(6)z z6hPceh_cVZdD^VR&GwiCulYSS9;opUjk!>f?l?|F`HM8>{7>RbNfD+iG+w2tI+Q6D zOTt}zfjjpBik{R0oWV@R9QdN5*EN1iV~)qs{&S64ymHRPF^yTKm~GWuitz5$&T%t? zjU7hq15yM@74ZmyU;g_R=Z@wYvtj<~)bN@$&T$digN!J;ApJgulhzk%7S&x4K8`D( zW??Ccn&mPg+xY;zA7(XMLHIGXF$w1Tu!;oX){@+(ou5R4=`fy!%a}YF!E_^yL`nLB?-!vMx_ZG#N+m_+cY|NpWbV6=U#@fj65^Y@)F}Y4e_Og5t99xM!TZotA!r zyYir6L#MPbCU9OF)#8-zf72_@FcFGp^4^FH#i5JV7vBF15Cg2d#H$clIWUC4bjCsu zS>d0wk78yV%m<5H@jHm6nqWiNSiq$Jzv#l}d`{%^vbo%nE70}{8P-<1aaRt!Lxt@| zlfln6R`3!S9s3#FJ&t`pi1&Kj1SNDg)(1IXU);oK+VhIyTPQ~JB^ISon@GkeFh07T zU>pURo3TBx?DZOQg>oMv8#zZ+>k4!N!`G4Adb;n2U(}DyP)uMm%@8Y;yYr)2b+|wU z&%2G596Hnah9d=0%BS_NPlmTGMW(AATiks7D;REUrc-7ber|XaWH-aduBNDqK{HzC2jZOXT(mH!JX_Yk-d@ZuM`_qt${8X&A3oo;T=^iTqXEA1%IVY>>3Jw zy38a%-oQ^Z61jo=l!APD=ST#M9pegBFs`8Z;fUIj&I9GAq1gS2~aEN*cu<;6iddxda5 z(?h|Z>2wus|4V6et(~BP@C}0?CdI4ZeM>7Qc>Eqi?*GPVC)&xw-#96kZUiE$ zs=2k{?|hydPfI-{qZ2&YUQP+&Oc;#j-Xbx|VTXf$&(N6WQMknS?6h!wmgh}(sN-7k P%$oWoB3zQ=37Y>0A)8la diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/bin/gcc/makefile b/third_party/ti/devices/cc13x2_cc26x2/driverlib/bin/gcc/makefile index 73ea2dcf0..16a99765a 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/bin/gcc/makefile +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/bin/gcc/makefile @@ -73,6 +73,8 @@ all : @ $(COMPILER_TOOL) -mthumb -march=armv7e-m -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Os -Wall -fno-strict-aliasing -gstrict-dwarf -pedantic -ffunction-sections -fdata-sections -std=c99 -c --asm -g -o "pwr_ctrl.o" $(MAKEFILE_DIR)../../../driverlib/pwr_ctrl.c @ echo GCC: Compile rfc.c @ $(COMPILER_TOOL) -mthumb -march=armv7e-m -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Os -Wall -fno-strict-aliasing -gstrict-dwarf -pedantic -ffunction-sections -fdata-sections -std=c99 -c --asm -g -o "rfc.o" $(MAKEFILE_DIR)../../../driverlib/rfc.c + @ echo GCC: Compile rom_crypto.c + @ $(COMPILER_TOOL) -mthumb -march=armv7e-m -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Os -Wall -fno-strict-aliasing -gstrict-dwarf -pedantic -ffunction-sections -fdata-sections -std=c99 -c --asm -g -o "rom_crypto.o" $(MAKEFILE_DIR)../../../driverlib/rom_crypto.c @ echo GCC: Compile setup.c @ $(COMPILER_TOOL) -mthumb -march=armv7e-m -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Os -Wall -fno-strict-aliasing -gstrict-dwarf -pedantic -ffunction-sections -fdata-sections -std=c99 -c --asm -g -o "setup.o" $(MAKEFILE_DIR)../../../driverlib/setup.c @ echo GCC: Compile setup_rom.c @@ -104,7 +106,7 @@ all : @ echo GCC: Compile watchdog.c @ $(COMPILER_TOOL) -mthumb -march=armv7e-m -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Os -Wall -fno-strict-aliasing -gstrict-dwarf -pedantic -ffunction-sections -fdata-sections -std=c99 -c --asm -g -o "watchdog.o" $(MAKEFILE_DIR)../../../driverlib/watchdog.c @ echo GCC: Archive driverlib.lib - @ $(ARCHIVER_TOOL) rcs $(MAKEFILE_DIR)driverlib.lib $(MAKEFILE_DIR)adi.o $(MAKEFILE_DIR)aes.o $(MAKEFILE_DIR)aon_batmon.o $(MAKEFILE_DIR)aon_event.o $(MAKEFILE_DIR)aon_ioc.o $(MAKEFILE_DIR)aon_pmctl.o $(MAKEFILE_DIR)aon_rtc.o $(MAKEFILE_DIR)aux_adc.o $(MAKEFILE_DIR)aux_smph.o $(MAKEFILE_DIR)aux_sysif.o $(MAKEFILE_DIR)aux_tdc.o $(MAKEFILE_DIR)ccfgread.o $(MAKEFILE_DIR)chipinfo.o $(MAKEFILE_DIR)cpu.o $(MAKEFILE_DIR)crypto.o $(MAKEFILE_DIR)ddi.o $(MAKEFILE_DIR)debug.o $(MAKEFILE_DIR)driverlib_release.o $(MAKEFILE_DIR)event.o $(MAKEFILE_DIR)flash.o $(MAKEFILE_DIR)gpio.o $(MAKEFILE_DIR)i2c.o $(MAKEFILE_DIR)i2s.o $(MAKEFILE_DIR)interrupt.o $(MAKEFILE_DIR)ioc.o $(MAKEFILE_DIR)osc.o $(MAKEFILE_DIR)pka.o $(MAKEFILE_DIR)prcm.o $(MAKEFILE_DIR)pwr_ctrl.o $(MAKEFILE_DIR)rfc.o $(MAKEFILE_DIR)setup.o $(MAKEFILE_DIR)setup_rom.o $(MAKEFILE_DIR)sha2.o $(MAKEFILE_DIR)smph.o $(MAKEFILE_DIR)ssi.o $(MAKEFILE_DIR)sw_chacha.o $(MAKEFILE_DIR)sw_poly1305-donna.o $(MAKEFILE_DIR)systick.o $(MAKEFILE_DIR)sys_ctrl.o $(MAKEFILE_DIR)timer.o $(MAKEFILE_DIR)trng.o $(MAKEFILE_DIR)uart.o $(MAKEFILE_DIR)udma.o $(MAKEFILE_DIR)vims.o $(MAKEFILE_DIR)watchdog.o + @ $(ARCHIVER_TOOL) rcs $(MAKEFILE_DIR)driverlib.lib $(MAKEFILE_DIR)adi.o $(MAKEFILE_DIR)aes.o $(MAKEFILE_DIR)aon_batmon.o $(MAKEFILE_DIR)aon_event.o $(MAKEFILE_DIR)aon_ioc.o $(MAKEFILE_DIR)aon_pmctl.o $(MAKEFILE_DIR)aon_rtc.o $(MAKEFILE_DIR)aux_adc.o $(MAKEFILE_DIR)aux_smph.o $(MAKEFILE_DIR)aux_sysif.o $(MAKEFILE_DIR)aux_tdc.o $(MAKEFILE_DIR)ccfgread.o $(MAKEFILE_DIR)chipinfo.o $(MAKEFILE_DIR)cpu.o $(MAKEFILE_DIR)crypto.o $(MAKEFILE_DIR)ddi.o $(MAKEFILE_DIR)debug.o $(MAKEFILE_DIR)driverlib_release.o $(MAKEFILE_DIR)event.o $(MAKEFILE_DIR)flash.o $(MAKEFILE_DIR)gpio.o $(MAKEFILE_DIR)i2c.o $(MAKEFILE_DIR)i2s.o $(MAKEFILE_DIR)interrupt.o $(MAKEFILE_DIR)ioc.o $(MAKEFILE_DIR)osc.o $(MAKEFILE_DIR)pka.o $(MAKEFILE_DIR)prcm.o $(MAKEFILE_DIR)pwr_ctrl.o $(MAKEFILE_DIR)rfc.o $(MAKEFILE_DIR)rom_crypto.o $(MAKEFILE_DIR)setup.o $(MAKEFILE_DIR)setup_rom.o $(MAKEFILE_DIR)sha2.o $(MAKEFILE_DIR)smph.o $(MAKEFILE_DIR)ssi.o $(MAKEFILE_DIR)sw_chacha.o $(MAKEFILE_DIR)sw_poly1305-donna.o $(MAKEFILE_DIR)systick.o $(MAKEFILE_DIR)sys_ctrl.o $(MAKEFILE_DIR)timer.o $(MAKEFILE_DIR)trng.o $(MAKEFILE_DIR)uart.o $(MAKEFILE_DIR)udma.o $(MAKEFILE_DIR)vims.o $(MAKEFILE_DIR)watchdog.o @ rm -f $(MAKEFILE_DIR)*.o # Deletes previous output and temporary files diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/bin/iar/driverlib.lib b/third_party/ti/devices/cc13x2_cc26x2/driverlib/bin/iar/driverlib.lib index 5c4ec94e3ded7cb442c2874d9948155fadfd8ccc..06fd5889c51f1a76e659610c76ef3b6e175f1aeb 100644 GIT binary patch delta 147071 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 Y@8x-u{1-E_mS;`a7kMLV%ntJZ2Wxu1xBvhE diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/bin/iar/makefile b/third_party/ti/devices/cc13x2_cc26x2/driverlib/bin/iar/makefile index f8e350027..0073e34fa 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/bin/iar/makefile +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/bin/iar/makefile @@ -108,6 +108,9 @@ all : @ echo IAR: Compile rfc.c @ $(COMPILER_TOOL) $(MAKEFILE_DIR)../../../driverlib/rfc.c -D nDEBUG $(ADD_PARAM) -o $(MAKEFILE_DIR)rfc.o --no_clustering --debug --endian=little --cpu=Cortex-M4 -e --fpu=FPv4_sp -Ohz --require_prototypes --silent @ $(OBJ_MANIP_TOOL) --remove_file_path --remove_section ".comment" --silent $(MAKEFILE_DIR)rfc.o $(MAKEFILE_DIR)rfc.o + @ echo IAR: Compile rom_crypto.c + @ $(COMPILER_TOOL) $(MAKEFILE_DIR)../../../driverlib/rom_crypto.c -D nDEBUG $(ADD_PARAM) -o $(MAKEFILE_DIR)rom_crypto.o --no_clustering --debug --endian=little --cpu=Cortex-M4 -e --fpu=FPv4_sp -Ohz --require_prototypes --silent + @ $(OBJ_MANIP_TOOL) --remove_file_path --remove_section ".comment" --silent $(MAKEFILE_DIR)rom_crypto.o $(MAKEFILE_DIR)rom_crypto.o @ echo IAR: Compile setup.c @ $(COMPILER_TOOL) $(MAKEFILE_DIR)../../../driverlib/setup.c -D nDEBUG $(ADD_PARAM) -o $(MAKEFILE_DIR)setup.o --no_clustering --debug --endian=little --cpu=Cortex-M4 -e --fpu=FPv4_sp -Ohz --require_prototypes --silent @ $(OBJ_MANIP_TOOL) --remove_file_path --remove_section ".comment" --silent $(MAKEFILE_DIR)setup.o $(MAKEFILE_DIR)setup.o @@ -154,7 +157,7 @@ all : @ $(COMPILER_TOOL) $(MAKEFILE_DIR)../../../driverlib/watchdog.c -D nDEBUG $(ADD_PARAM) -o $(MAKEFILE_DIR)watchdog.o --no_clustering --debug --endian=little --cpu=Cortex-M4 -e --fpu=FPv4_sp -Ohz --require_prototypes --silent @ $(OBJ_MANIP_TOOL) --remove_file_path --remove_section ".comment" --silent $(MAKEFILE_DIR)watchdog.o $(MAKEFILE_DIR)watchdog.o @ echo IAR: Archive driverlib.lib - @ $(ARCHIVER_TOOL) $(MAKEFILE_DIR)adi.o $(MAKEFILE_DIR)aes.o $(MAKEFILE_DIR)aon_batmon.o $(MAKEFILE_DIR)aon_event.o $(MAKEFILE_DIR)aon_ioc.o $(MAKEFILE_DIR)aon_pmctl.o $(MAKEFILE_DIR)aon_rtc.o $(MAKEFILE_DIR)aux_adc.o $(MAKEFILE_DIR)aux_smph.o $(MAKEFILE_DIR)aux_sysif.o $(MAKEFILE_DIR)aux_tdc.o $(MAKEFILE_DIR)ccfgread.o $(MAKEFILE_DIR)chipinfo.o $(MAKEFILE_DIR)cpu.o $(MAKEFILE_DIR)crypto.o $(MAKEFILE_DIR)ddi.o $(MAKEFILE_DIR)debug.o $(MAKEFILE_DIR)driverlib_release.o $(MAKEFILE_DIR)event.o $(MAKEFILE_DIR)flash.o $(MAKEFILE_DIR)gpio.o $(MAKEFILE_DIR)i2c.o $(MAKEFILE_DIR)i2s.o $(MAKEFILE_DIR)interrupt.o $(MAKEFILE_DIR)ioc.o $(MAKEFILE_DIR)osc.o $(MAKEFILE_DIR)pka.o $(MAKEFILE_DIR)prcm.o $(MAKEFILE_DIR)pwr_ctrl.o $(MAKEFILE_DIR)rfc.o $(MAKEFILE_DIR)setup.o $(MAKEFILE_DIR)setup_rom.o $(MAKEFILE_DIR)sha2.o $(MAKEFILE_DIR)smph.o $(MAKEFILE_DIR)ssi.o $(MAKEFILE_DIR)sw_chacha.o $(MAKEFILE_DIR)sw_poly1305-donna.o $(MAKEFILE_DIR)systick.o $(MAKEFILE_DIR)sys_ctrl.o $(MAKEFILE_DIR)timer.o $(MAKEFILE_DIR)trng.o $(MAKEFILE_DIR)uart.o $(MAKEFILE_DIR)udma.o $(MAKEFILE_DIR)vims.o $(MAKEFILE_DIR)watchdog.o --create -o $(MAKEFILE_DIR)driverlib.lib + @ $(ARCHIVER_TOOL) $(MAKEFILE_DIR)adi.o $(MAKEFILE_DIR)aes.o $(MAKEFILE_DIR)aon_batmon.o $(MAKEFILE_DIR)aon_event.o $(MAKEFILE_DIR)aon_ioc.o $(MAKEFILE_DIR)aon_pmctl.o $(MAKEFILE_DIR)aon_rtc.o $(MAKEFILE_DIR)aux_adc.o $(MAKEFILE_DIR)aux_smph.o $(MAKEFILE_DIR)aux_sysif.o $(MAKEFILE_DIR)aux_tdc.o $(MAKEFILE_DIR)ccfgread.o $(MAKEFILE_DIR)chipinfo.o $(MAKEFILE_DIR)cpu.o $(MAKEFILE_DIR)crypto.o $(MAKEFILE_DIR)ddi.o $(MAKEFILE_DIR)debug.o $(MAKEFILE_DIR)driverlib_release.o $(MAKEFILE_DIR)event.o $(MAKEFILE_DIR)flash.o $(MAKEFILE_DIR)gpio.o $(MAKEFILE_DIR)i2c.o $(MAKEFILE_DIR)i2s.o $(MAKEFILE_DIR)interrupt.o $(MAKEFILE_DIR)ioc.o $(MAKEFILE_DIR)osc.o $(MAKEFILE_DIR)pka.o $(MAKEFILE_DIR)prcm.o $(MAKEFILE_DIR)pwr_ctrl.o $(MAKEFILE_DIR)rfc.o $(MAKEFILE_DIR)rom_crypto.o $(MAKEFILE_DIR)setup.o $(MAKEFILE_DIR)setup_rom.o $(MAKEFILE_DIR)sha2.o $(MAKEFILE_DIR)smph.o $(MAKEFILE_DIR)ssi.o $(MAKEFILE_DIR)sw_chacha.o $(MAKEFILE_DIR)sw_poly1305-donna.o $(MAKEFILE_DIR)systick.o $(MAKEFILE_DIR)sys_ctrl.o $(MAKEFILE_DIR)timer.o $(MAKEFILE_DIR)trng.o $(MAKEFILE_DIR)uart.o $(MAKEFILE_DIR)udma.o $(MAKEFILE_DIR)vims.o $(MAKEFILE_DIR)watchdog.o --create -o $(MAKEFILE_DIR)driverlib.lib @ rm -f $(MAKEFILE_DIR)*.o # Deletes previous output and temporary files diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/bin/keil/driverlib.lib b/third_party/ti/devices/cc13x2_cc26x2/driverlib/bin/keil/driverlib.lib index 51d5922a0d6f1a98a3f1fb0b665110c3aa889f7b..89ba527d925127b45888b23ae042b9c1bc290183 100644 GIT binary patch delta 31034 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 z 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 = 0x0A and ui16Mask = 0x0E. Bits 0 and 5-7 will //! not be affected by the operation, as long as the corresponding bits are //! not set in the \c ui16Mask. //! -//! \note Both the AUX module and the clock for the AUX SMPH module must be -//! enabled before calling this function. -//! //! \param ui32Base is the base address of the DDI port. //! \param ui32Reg is the Least Significant Register in the DDI slave that //! will be affected by the write operation. @@ -300,14 +288,11 @@ DDI8SetValBit(uint32_t ui32Base, uint32_t ui32Reg, uint32_t ui32Byte, //! This function allows 16 bit masked access to the DDI slave registers. //! //! Use this function to write any value in the range 0-15 bits aligned on a -//! half-word boundary. Fx. for writing the value 0b101 to bits 1-3 set +//! half-word boundary. For example, for writing the value 0b101 to bits 1-3 set //! ui32Val = 0x000A and ui32Mask = 0x000E. Bits 0 and 5-15 will not be //! affected by the operation, as long as the corresponding bits are not set //! in the \c ui32Mask. //! -//! \note Both the AUX module and the clock for the AUX SMPH module must be -//! enabled before calling this function. -//! //! \param ui32Base is the base address of the DDI port. //! \param ui32Reg is register to access. //! \param bWriteHigh defines which part of the register to write in. @@ -350,9 +335,6 @@ DDI16SetValBit(uint32_t ui32Base, uint32_t ui32Reg, bool bWriteHigh, //! conservation of the previous value of the register will be kept (i.e. this //! is NOT read-modify-write on the register). //! -//! \note Both the AUX module and the clock for the AUX SMPH module must be -//! enabled before calling this function. -//! //! \param ui32Base is DDI base address. //! \param ui32Reg is the register to write. //! \param ui32Val is the 32 bit value to write to the register. @@ -368,15 +350,10 @@ extern void DDI32RegWrite(uint32_t ui32Base, uint32_t ui32Reg, uint32_t ui32Val) //! //! A '1' is written to the bit if \c ui32WrData is non-zero, else a '0' is written. //! -//! \note Both the AUX module and the clock for the AUX SMPH module must be -//! enabled before calling this function. -//! //! \param ui32Base is the base address of the DDI port. //! \param ui32Reg is register to access. -//! \param ui32Mask is the mask defining which of the 16 bit that should be -//! overwritten. The mask must be defined in the lower half of the 32 bits. -//! \param ui32WrData is the value to write. The value must be defined in the lower -//! half of the 32 bits. +//! \param ui32Mask is the mask defining which of the 16 bit that should be overwritten. +//! \param ui32WrData is the value to write. The value must be defined in the lower half of the 32 bits. //! //! \return None // @@ -389,17 +366,13 @@ extern void DDI16BitWrite(uint32_t ui32Base, uint32_t ui32Reg, // //! \brief Write a bit field via the DDI using 16-bit maskable write. //! -//! Requires that bitfields not space the low/high word boundary. -//! -//! \note Both the AUX module and the clock for the AUX SMPH module must be -//! enabled before calling this function. +//! Requires that entire bit field is within the half word boundary. //! //! \param ui32Base is the base address of the DDI port. //! \param ui32Reg is register to access. -//! \param ui32Mask is the mask defining which of the 16 bits that should be -//! overwritten. The mask must be defined in the lower half of the 32 bits. -//! \param ui32Shift -//! \param ui32Data +//! \param ui32Mask is the mask defining which of the 16 bits that should be overwritten. +//! \param ui32Shift is the shift value for the bit field. +//! \param ui32Data is the data aligned to bit 0. //! //! \return None // @@ -412,9 +385,6 @@ extern void DDI16BitfieldWrite(uint32_t ui32Base, uint32_t ui32Reg, // //! \brief Read a bit via the DDI using 16-bit read. //! -//! \note Both the AUX module and the clock for the AUX SMPH module must be -//! enabled before calling this function. -//! //! \param ui32Base is the base address of the DDI module. //! \param ui32Reg is the register to read. //! \param ui32Mask defines the bit which should be read. @@ -427,17 +397,13 @@ extern uint16_t DDI16BitRead(uint32_t ui32Base, uint32_t ui32Reg, //***************************************************************************** // -//! \brief Read a bitfield via the DDI using 16-bit read. +//! \brief Read a bit field via the DDI using 16-bit read. //! -//! Requires that bit fields do not space the low/high word boundary. -//! -//! \note Both the AUX module and the clock for the AUX SMPH module must be -//! enabled before calling this function. +//! Requires that entire bit field is within the half word boundary. //! //! \param ui32Base is the base address of the DDI port. //! \param ui32Reg is register to access. -//! \param ui32Mask is the mask defining which of the 16 bits that should be -//! overwritten. The mask must be defined in the lower half of the 32 bits. +//! \param ui32Mask is the mask defining which of the 16 bits that should be overwritten. //! \param ui32Shift defines the required shift of the data to align with bit 0. //! //! \return Returns data aligned to bit 0. diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/driverlib_release.c b/third_party/ti/devices/cc13x2_cc26x2/driverlib/driverlib_release.c index 00b054730..cdb08e35d 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/driverlib_release.c +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/driverlib_release.c @@ -42,4 +42,4 @@ /// Declare the current DriverLib release -DRIVERLIB_DECLARE_RELEASE(0, 51995); +DRIVERLIB_DECLARE_RELEASE(0, 54539); diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/driverlib_release.h b/third_party/ti/devices/cc13x2_cc26x2/driverlib/driverlib_release.h index 5d52f7e6c..497f8b0f9 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/driverlib_release.h +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/driverlib_release.h @@ -63,7 +63,7 @@ extern "C" /// DriverLib release group number #define DRIVERLIB_RELEASE_GROUP 0 /// DriverLib release build number -#define DRIVERLIB_RELEASE_BUILD 51995 +#define DRIVERLIB_RELEASE_BUILD 54539 @@ -83,7 +83,7 @@ extern "C" const volatile uint8_t driverlib_release_##group##_##build /// External declaration of the DriverLib release locking object -extern DRIVERLIB_DECLARE_RELEASE(0, 51995); +extern DRIVERLIB_DECLARE_RELEASE(0, 54539); @@ -135,7 +135,7 @@ extern DRIVERLIB_DECLARE_RELEASE(0, 51995); // //***************************************************************************** #define DRIVERLIB_ASSERT_CURR_RELEASE() \ - DRIVERLIB_ASSERT_RELEASE(0, 51995) + DRIVERLIB_ASSERT_RELEASE(0, 54539) diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/i2s.h b/third_party/ti/devices/cc13x2_cc26x2/driverlib/i2s.h index 0ef2441c6..62c2c5ef3 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/i2s.h +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/i2s.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: i2s.h -* Revised: 2017-05-23 12:08:52 +0200 (Tue, 23 May 2017) -* Revision: 49048 +* Revised: 2018-11-16 11:16:53 +0100 (Fri, 16 Nov 2018) +* Revision: 53356 * * Description: Defines and prototypes for the I2S. * @@ -97,6 +97,8 @@ extern "C" //! \brief A structure that defines an audio control table. Note: Memory for this //! structure \b must be initialized by user application. See detailed description! //! +//! \deprecated This structure will be removed in a future release. +//! //! These fields are used by the I2S and normally it is not necessary for //! software to directly read or write fields in the table. //! @@ -113,6 +115,7 @@ extern "C" //! // //***************************************************************************** +#ifndef DEPRECATED typedef struct { uint16_t ui16DMABufSize; //!< Size of DMA buffer in number of samples. @@ -125,6 +128,7 @@ typedef struct uint32_t ui32OutBase; //!< Base address of the output buffer. uint32_t ui32OutOffset; //!< Value of the current output pointer offset. } I2SControlTable; +#endif //***************************************************************************** // @@ -137,42 +141,51 @@ typedef struct // g_pControlTable = &g_controlTable; // //***************************************************************************** +#ifndef DEPRECATED extern I2SControlTable *g_pControlTable; +#endif //***************************************************************************** // // Defines for the I2S DMA buffer sizes // //***************************************************************************** +#ifndef DEPRECATED #define I2S_DMA_BUF_SIZE_64 0x00000040 #define I2S_DMA_BUF_SIZE_128 0x00000080 #define I2S_DMA_BUF_SIZE_256 0x00000100 +#endif //***************************************************************************** // // Defines for the I2S audio clock configuration // //***************************************************************************** +#ifndef DEPRECATED #define I2S_EXT_WCLK 0x00000001 #define I2S_INT_WCLK 0x00000002 #define I2S_INVERT_WCLK 0x00000004 #define I2S_NORMAL_WCLK 0x00000000 +#endif //***************************************************************************** // // Defines for the audio data line input/output configuration // //***************************************************************************** +#ifndef DEPRECATED #define I2S_LINE_UNUSED 0x00000000 #define I2S_LINE_INPUT 0x00000001 #define I2S_LINE_OUTPUT 0x00000002 #define I2S_LINE_MASK 0x00000003 +#endif //***************************************************************************** // // Defines for activating an audio channel. // //***************************************************************************** +#ifndef DEPRECATED #define I2S_CHAN0_ACT 0x00000100 #define I2S_CHAN1_ACT 0x00000200 #define I2S_CHAN2_ACT 0x00000400 @@ -184,6 +197,16 @@ extern I2SControlTable *g_pControlTable; #define I2S_MONO_MODE 0x00000100 #define I2S_STEREO_MODE 0x00000300 #define I2S_CHAN_CFG_MASK 0x0000FF00 +#endif + +#define I2S_CHAN0_MASK 0x00000001 +#define I2S_CHAN1_MASK 0x00000002 +#define I2S_CHAN2_MASK 0x00000004 +#define I2S_CHAN3_MASK 0x00000008 +#define I2S_CHAN4_MASK 0x00000010 +#define I2S_CHAN5_MASK 0x00000020 +#define I2S_CHAN6_MASK 0x00000040 +#define I2S_CHAN7_MASK 0x00000080 //***************************************************************************** // @@ -205,8 +228,10 @@ extern I2SControlTable *g_pControlTable; // Defines for the sample stamp counters // //***************************************************************************** +#ifndef DEPRECATED #define I2S_STMP0 0x00000001 // Sample stamp counter channel 0 #define I2S_STMP1 0x00000002 // Sample stamp counter channel 1 +#endif #define I2S_STMP_SATURATION 0x0000FFFF // The saturation value used when // calculating the sample stamp @@ -255,6 +280,8 @@ I2SBaseValid(uint32_t ui32Base) // //! \brief Enables the I2S module for operation. //! +//! \deprecated This function will be removed in a future release. +//! //! \note The module should only be enabled after configuration. When the //! module is disabled, no data or clocks will be generated on the I2S signals. //! @@ -268,12 +295,16 @@ I2SBaseValid(uint32_t ui32Base) //! \return None // //***************************************************************************** +#ifndef DEPRECATED extern void I2SEnable(uint32_t ui32Base); +#endif //***************************************************************************** // //! \brief Disables the I2S module for operation. //! +//! \deprecated This function will be removed in a future release. +//! //! This function will immediately disable the I2S module. To ensure that //! all buffer operations are completed before shutting down, the correct //! procedure is: @@ -288,6 +319,7 @@ extern void I2SEnable(uint32_t ui32Base); //! \return None // //***************************************************************************** +#ifndef DEPRECATED __STATIC_INLINE void I2SDisable(uint32_t ui32Base) { @@ -297,11 +329,14 @@ I2SDisable(uint32_t ui32Base) // Disable the I2S module. HWREG(I2S0_BASE + I2S_O_AIFDMACFG) = 0x0; } +#endif //***************************************************************************** // //! \brief Configures the I2S module. //! +//! \deprecated This function will be removed in a future release. +//! //! The word length defines the size of the word transmitted on the data //! lines. For single phased formats \c I2S_WORD_LENGTH_x is the exact number //! of bits per word. In dual phased format this is the maximum number of bits @@ -337,13 +372,17 @@ I2SDisable(uint32_t ui32Base) //! \sa \ref I2SChannelConfigure() // //***************************************************************************** +#ifndef DEPRECATED extern void I2SAudioFormatConfigure(uint32_t ui32Base, uint32_t ui32FmtCfg, uint32_t ui32BitClkDelay); +#endif //**************************************************************************** // //! \brief Setup the audio channel configuration. //! +//! \deprecated This function will be removed in a future release. +//! //! The channel configuration is a bitwise OR of the input/output mode of each //! data line and the active audio channels within a specific audio frame. //! @@ -380,13 +419,17 @@ extern void I2SAudioFormatConfigure(uint32_t ui32Base, uint32_t ui32FmtCfg, //! \sa \ref I2SAudioFormatConfigure() // //**************************************************************************** +#ifndef DEPRECATED extern void I2SChannelConfigure(uint32_t ui32Base, uint32_t ui32Chan0Cfg, uint32_t ui32Chan1Cfg); +#endif //**************************************************************************** // //! \brief Configure the I2S frame clock. //! +//! \deprecated This function will be removed in a future release. +//! //! Configure I2S clock to be either internal or external and either normal //! or inverted. //! @@ -407,6 +450,7 @@ extern void I2SChannelConfigure(uint32_t ui32Base, uint32_t ui32Chan0Cfg, //! \return None // //**************************************************************************** +#ifndef DEPRECATED __STATIC_INLINE void I2SClockConfigure(uint32_t ui32Base, uint32_t ui32ClkConfig) { @@ -418,11 +462,14 @@ I2SClockConfigure(uint32_t ui32Base, uint32_t ui32ClkConfig) (I2S_AIFWCLKSRC_WCLK_INV_M | I2S_AIFWCLKSRC_WCLK_SRC_M); } +#endif //**************************************************************************** // //! \brief Set the input buffer pointers. //! +//! \deprecated This function will be removed in a future release. +//! //! The next pointer should always be written while the DMA is using the //! previous written pointer. If not written in time an \ref I2S_INT_PTR_ERR will //! occur and all outputs will be disabled. @@ -439,14 +486,18 @@ I2SClockConfigure(uint32_t ui32Base, uint32_t ui32ClkConfig) //! \return None // //**************************************************************************** +#ifndef DEPRECATED extern void I2SBufferConfig(uint32_t ui32Base, uint32_t ui32InBufBase, uint32_t ui32OutBufBase, uint16_t ui16DMABufSize, uint16_t ui16ChanBufSize); +#endif //**************************************************************************** // //! \brief Update the buffer pointers. //! +//! \deprecated This function will be removed in a future release. +//! //! The next pointer should always be written while the DMA is using the //! previous written pointer. If not written in time an \ref I2S_INT_PTR_ERR will occur //! and all outputs will be disabled. Nothing is preventing the pointers from @@ -466,12 +517,16 @@ extern void I2SBufferConfig(uint32_t ui32Base, uint32_t ui32InBufBase, //! \sa \ref I2SPointerSet() // //**************************************************************************** +#ifndef DEPRECATED extern void I2SPointerUpdate(uint32_t ui32Base, bool bInput); +#endif //**************************************************************************** // //! \brief Set a buffer pointer (input or output) directly. //! +//! \deprecated This function will be removed in a future release. +//! //! This function allows bypassing of the pointers in the global control table. //! //! The next pointer should always be written while the DMA is using the @@ -494,12 +549,16 @@ extern void I2SPointerUpdate(uint32_t ui32Base, bool bInput); //! \sa \ref I2SPointerUpdate() // //**************************************************************************** +#ifndef DEPRECATED extern void I2SPointerSet(uint32_t ui32Base, bool bInput, void * pNextPointer); +#endif //***************************************************************************** // //! \brief Registers an interrupt handler for an I2S interrupt in the dynamic interrupt table. //! +//! \deprecated This function will be removed in a future release. +//! //! \note Only use this function if you want to use the dynamic vector table (in SRAM)! //! //! This function registers a function as the interrupt handler for a specific @@ -518,6 +577,7 @@ extern void I2SPointerSet(uint32_t ui32Base, bool bInput, void * pNextPointer); //! handlers. // //***************************************************************************** +#ifndef DEPRECATED __STATIC_INLINE void I2SIntRegister(uint32_t ui32Base, void (*pfnHandler)(void)) { @@ -530,11 +590,14 @@ I2SIntRegister(uint32_t ui32Base, void (*pfnHandler)(void)) // Enable the I2S interrupt. IntEnable(INT_I2S_IRQ); } +#endif //***************************************************************************** // //! \brief Unregisters an interrupt handler for a I2S interrupt in the dynamic interrupt table. //! +//! \deprecated This function will be removed in a future release. +//! //! This function does the actual unregistering of the interrupt handler. It //! clears the handler to be called when an I2S interrupt occurs. This //! function also masks off the interrupt in the interrupt controller so that @@ -548,6 +611,7 @@ I2SIntRegister(uint32_t ui32Base, void (*pfnHandler)(void)) //! handlers. // //***************************************************************************** +#ifndef DEPRECATED __STATIC_INLINE void I2SIntUnregister(uint32_t ui32Base) { @@ -560,6 +624,27 @@ I2SIntUnregister(uint32_t ui32Base) // Unregister the interrupt handler. IntUnregister(INT_I2S_IRQ); } +#endif + +//***************************************************************************** +// +//! \brief Configure the sample stamp generator. +//! +//! \deprecated This function will be removed in a future release. +//! +//! Use this function to configure the sample stamp generator. +//! +//! \param ui32Base is the base address of the I2S module. +//! \param bInput enables triggering of the sample stamp generator on input. +//! \param bOutput enables triggering of the sample stamp generator on output. +//! +//! \return None +// +//***************************************************************************** +#ifndef DEPRECATED +extern void I2SSampleStampConfigure(uint32_t ui32Base, bool bInput, + bool bOutput); +#endif //***************************************************************************** // @@ -732,6 +817,9 @@ I2SIntClear(uint32_t ui32Base, uint32_t ui32IntFlags) __STATIC_INLINE void I2SSampleStampEnable(uint32_t ui32Base) { + // Check the arguments. + ASSERT(I2SBaseValid(ui32Base)); + // Set the enable bit. HWREG(I2S0_BASE + I2S_O_STMPCTL) = I2S_STMPCTL_STMP_EN; } @@ -749,27 +837,14 @@ I2SSampleStampEnable(uint32_t ui32Base) __STATIC_INLINE void I2SSampleStampDisable(uint32_t ui32Base) { + // Check the arguments. + ASSERT(I2SBaseValid(ui32Base)); + // Clear the enable bit. HWREG(I2S0_BASE + I2S_O_STMPCTL) = 0; } -//***************************************************************************** -// -//! \brief Configure the sample stamp generator. -//! -//! Use this function to configure the sample stamp generator. -//! -//! \param ui32Base is the base address of the I2S module. -//! \param bInput enables triggering of the sample stamp generator on input. -//! \param bOutput enables triggering of the sample stamp generator on output. -//! -//! \return None -// -//***************************************************************************** -extern void I2SSampleStampConfigure(uint32_t ui32Base, bool bInput, - bool bOutput); - //***************************************************************************** // //! \brief Get the current value of a sample stamp counter. @@ -782,6 +857,446 @@ extern void I2SSampleStampConfigure(uint32_t ui32Base, bool bInput, //***************************************************************************** extern uint32_t I2SSampleStampGet(uint32_t ui32Base, uint32_t ui32Channel); +//***************************************************************************** +// +//! \brief Starts the I2S. +//! +//! I2S must be configured before it is started. +//! +//! \note Immediately after enabling the module the programmer must update +//! the DMA data pointer registers using \ref I2SInPointerSet() and +//! \ref I2SOutPointerSet() to ensure a new pointer is written before the DMA +//! transfer completes. Failure to update the pointer in time will result in +//! an \ref I2S_INT_PTR_ERR. +//! +//! \param ui32Base is the I2S module base address. +//! \param ui8FixDMALength is the length of the DMA buffer: this will allow +//! the DMA to read ui8FixDMALength between to pointer refreshes. +//! +//! \return None +//! +//! \sa \ref I2SStop() +// +//***************************************************************************** +__STATIC_INLINE void I2SStart(uint32_t ui32Base, uint8_t ui8FixDMALength) +{ + // Check the arguments. + ASSERT(I2SBaseValid(ui32Base)); + + // Enable the I2S module. + HWREG(I2S0_BASE + I2S_O_AIFDMACFG) = ui8FixDMALength; +} + +//***************************************************************************** +// +//! \brief Stops the I2S module for operation. +//! +//! This function will immediately disable the I2S module. To ensure that +//! all buffer operations are completed before shutting down, the correct +//! procedure is: +//! 1. Do not update the data pointers using \ref I2SInPointerSet() and +//! \ref I2SOutPointerSet(). +//! 2. Await that values returned by \ref I2SInPointerNextGet(), +//! \ref I2SOutPointerNextGet(), \ref I2SInPointerGet() and \ref I2SOutPointerGet() +//! are zero. +//! 3. Disable the I2S using \ref I2SStop() and clear the pointer +//! error using \ref I2SIntClear(). +//! 4. Disable bit clock source (done externally). +//! +//! \param ui32Base is the I2S module base address. +//! +//! \return None +//! +//! \sa \ref I2SStart() +// +//***************************************************************************** +__STATIC_INLINE void I2SStop(uint32_t ui32Base) +{ + // Check the arguments. + ASSERT(I2SBaseValid(ui32Base)); + + // Disable the I2S module. + HWREG(I2S0_BASE + I2S_O_AIFDMACFG) = 0x00; +} + +//***************************************************************************** +// +//! \brief Configure the serial format of the I2S module. +//! +//! The word length defines the size of the word transmitted on the data +//! lines. For single phased formats \c ui8BitsPerSample is the exact number +//! of bits per word. In dual phased format this is the maximum number of bits +//! per word. +//! +//! \param ui32Base is the I2S module base address. +//! \param ui8iDataDelay is the number of BCLK periods between the first WCLK +//! edge and the MSB of the first audio channel data transferred during +//! the phase. +//! \param ui8iMemory24Bits selects if the samples in memory are coded on 16 bits +//! or 24 bits. Possible values are: +//! - \ref I2S_MEM_LENGTH_16 +//! - \ref I2S_MEM_LENGTH_24 +//! \param ui8iSamplingEdge selects if sampling on falling or rising edges. +//! Possible values are: +//! - \ref I2S_NEG_EDGE +//! - \ref I2S_POS_EDGE +//! \param boolDualPhase must be set to true for dual phase and to false for +//! single phase and user-defined phase. +//! \param ui8BitsPerSample is the number of bits transmitted for each sample. +//! If this number does not match with the memory length selected +//! (16 bits or24 bits), samples will be truncated or padded. +//! \param ui16transmissionDelay is the number of WCLK periods before the first +//! transmission. +//! +//! \return None +//! +//! \sa \ref I2SFrameConfigure() +// +//***************************************************************************** +__STATIC_INLINE void +I2SFormatConfigure(uint32_t ui32Base, + uint8_t ui8iDataDelay, + uint8_t ui8iMemory24Bits, + uint8_t ui8iSamplingEdge, + bool boolDualPhase, + uint8_t ui8BitsPerSample, + uint16_t ui16transmissionDelay) +{ + // Check the arguments. + ASSERT(I2SBaseValid(ui32Base)); + ASSERT(ui8BitsPerSample <= I2S_AIFFMTCFG_WORD_LEN_MAX); + ASSERT(ui8BitsPerSample >= I2S_AIFFMTCFG_WORD_LEN_MIN); + + // Setup register AIFFMTCFG Source. + HWREGH(I2S0_BASE + I2S_O_AIFFMTCFG) = + (ui8iDataDelay << I2S_AIFFMTCFG_DATA_DELAY_S) | + (ui8iMemory24Bits << I2S_AIFFMTCFG_MEM_LEN_24_S) | + (ui8iSamplingEdge << I2S_AIFFMTCFG_SMPL_EDGE_S ) | + (boolDualPhase << I2S_AIFFMTCFG_DUAL_PHASE_S) | + (ui8BitsPerSample << I2S_AIFFMTCFG_WORD_LEN_S ); + + // Number of WCLK periods before the first read / write + HWREGH(I2S0_BASE + I2S_O_STMPWPER) = ui16transmissionDelay; +} + +//**************************************************************************** +// +//! \brief Setup the two interfaces SD0 and SD1 (also called AD0 and AD1). +//! +//! This function sets interface's direction and activated channels. +//! +//! \param ui32Base is base address of the I2S module. +//! \param ui8StatusAD0 defines the usage of AD0 +//! 0x00: AD0 is disabled +//! 0x01, AD0 is an input +//! 0x02, AD0 is an output +//! \param ui8ChanAD0 defines the channel mask for AD0. +//! Use a bitwise OR'ed combination of: +//! - \ref I2S_CHAN0_MASK +//! - \ref I2S_CHAN1_MASK +//! - \ref I2S_CHAN2_MASK +//! - \ref I2S_CHAN3_MASK +//! - \ref I2S_CHAN4_MASK +//! - \ref I2S_CHAN5_MASK +//! - \ref I2S_CHAN6_MASK +//! - \ref I2S_CHAN7_MASK +//! \param ui8StatusAD1 defines the usage of AD1 +//! 0x00: AD1 is disabled +//! 0x10, AD1 is an input +//! 0x20, AD1 is an output +//! \param ui8ChanAD1 defines the channel mask for AD1. +//! Use a bitwise OR'ed combination of: +//! - \ref I2S_CHAN0_MASK +//! - \ref I2S_CHAN1_MASK +//! - \ref I2S_CHAN2_MASK +//! - \ref I2S_CHAN3_MASK +//! - \ref I2S_CHAN4_MASK +//! - \ref I2S_CHAN5_MASK +//! - \ref I2S_CHAN6_MASK +//! - \ref I2S_CHAN7_MASK +//! +//! \return None +//! +//! \sa \ref I2SFormatConfigure() +// +//**************************************************************************** +__STATIC_INLINE void +I2SFrameConfigure(uint32_t ui32Base, + uint8_t ui8StatusAD0, uint8_t ui8ChanAD0, + uint8_t ui8StatusAD1, uint8_t ui8ChanAD1) +{ + // Check the arguments. + ASSERT(I2SBaseValid(ui32Base)); + + // Configure input/output channels. + HWREGB(I2S0_BASE + I2S_O_AIFDIRCFG) = (ui8StatusAD0 | ui8StatusAD1); + + // Configure the valid channel mask. + HWREGB(I2S0_BASE + I2S_O_AIFWMASK0) = ui8ChanAD0; + HWREGB(I2S0_BASE + I2S_O_AIFWMASK1) = ui8ChanAD1; +} + +//**************************************************************************** +// +//! \brief Configure the I2S frame clock (also called WCLK or WS). +//! +//! Configure WCLK clock to be either internal (master) or external (slave). +//! Configure WCLK clock either normal or inverted. +//! +//! \note The bit clock configuration is done externally, but the internal/ +//! external setting must match what is chosen internally in the I2S module +//! for the frame clock. +//! +//! \param ui32Base is the base address of the I2S module. +//! \param boolMaster false: the device is a slave (external clock) +//! true: the device is a master (internal clock) +//! \param boolWCLKInvert false: WCLK is not inverted +//! true: WCLK is internally inverted +//! +//! \return None +// +//**************************************************************************** +__STATIC_INLINE void +I2SWclkConfigure(uint32_t ui32Base, + bool boolMaster, + bool boolWCLKInvert) +{ + // Check the arguments. + ASSERT(I2SBaseValid(ui32Base)); + ASSERT(ui8ClkSource < I2S_AIFWCLKSRC_WCLK_SRC_RESERVED); + + // if(boolMaster == 0) then ui8ClkSource = 1 + // if(boolMaster == 1) then ui8ClkSource = 2 + uint8_t ui8ClkSource = (uint8_t)boolMaster + 0x01; + + // Setup register WCLK Source. + HWREGB(I2S0_BASE + I2S_O_AIFWCLKSRC) = + ((ui8ClkSource << I2S_AIFWCLKSRC_WCLK_SRC_S) | + (boolWCLKInvert << I2S_AIFWCLKSRC_WCLK_INV_S )); +} + +//**************************************************************************** +// +//! \brief Set the input buffer pointer. +//! +//! The next pointer should always be written while the DMA is using the +//! previous written pointer. If not written in time an \ref I2S_INT_PTR_ERR +//! will occur and all inputs and outputs will be disabled. +//! This function relies on pointer is pointing to a valid address. +//! +//! \note It is recommended that the pointer update is done in an interrupt context +//! to ensure that the update is performed before the buffer is full. +//! +//! \param ui32Base is the base address of the I2S module. +//! \param ui32NextPointer is the adress of the data +//! +//! \return None +//! +//! \sa \ref I2SOutPointerSet() +// +//**************************************************************************** +__STATIC_INLINE void +I2SInPointerSet(uint32_t ui32Base, uint32_t ui32NextPointer) +{ + // Check the arguments. + ASSERT(I2SBaseValid(ui32Base)); + + HWREG(I2S0_BASE + I2S_O_AIFINPTRNEXT) = ui32NextPointer; +} + +//**************************************************************************** +// +//! \brief Set the output buffer pointer. +//! +//! The next pointer should always be written while the DMA is using the +//! previous written pointer. If not written in time an \ref I2S_INT_PTR_ERR +//! will occur and all inputs and outputs will be disabled. +//! This function relies on pointer is pointing to a valid address. +//! +//! \note It is recommended that the pointer update is done in an interrupt context +//! to ensure that the update is performed before the buffer is full. +//! +//! \param ui32Base is the base address of the I2S module. +//! \param ui32NextPointer is the adress of the data +//! +//! \return None +//! +//! \sa \ref I2SInPointerSet() +// +//**************************************************************************** +__STATIC_INLINE void +I2SOutPointerSet(uint32_t ui32Base, uint32_t ui32NextPointer) +{ + // Check the arguments. + ASSERT(I2SBaseValid(ui32Base)); + + HWREG(I2S0_BASE + I2S_O_AIFOUTPTRNEXT) = ui32NextPointer; +} + +//**************************************************************************** +// +//! \brief Get value stored in PTR NEXT IN register +//! +//! \param ui32Base is the base address of the I2S module. +//! +//! \return the value of PTR NEXT IN. +// +//**************************************************************************** +__STATIC_INLINE uint32_t +I2SInPointerNextGet(uint32_t ui32Base) +{ + // Check the arguments. + ASSERT(I2SBaseValid(ui32Base)); + + return (HWREG(I2S0_BASE + I2S_O_AIFINPTRNEXT)); +} + + +//**************************************************************************** +// +//! \brief Get value stored in PTR NEXT OUT register +//! +//! \param ui32Base is the base address of the I2S module. +//! +//! \return the value of PTR NEXT OUT. +// +//**************************************************************************** +__STATIC_INLINE uint32_t +I2SOutPointerNextGet(uint32_t ui32Base) +{ + // Check the arguments. + ASSERT(I2SBaseValid(ui32Base)); + + return (HWREG(I2S0_BASE + I2S_O_AIFOUTPTRNEXT)); +} + +//**************************************************************************** +// +//! \brief Get value stored in PTR IN register +//! +//! \param ui32Base is the base address of the I2S module. +//! +//! \return the value of PTR IN. +// +//**************************************************************************** +__STATIC_INLINE uint32_t +I2SInPointerGet(uint32_t ui32Base) +{ + // Check the arguments. + ASSERT(I2SBaseValid(ui32Base)); + + return (HWREG(I2S0_BASE + I2S_O_AIFINPTR)); +} + +//**************************************************************************** +// +//! \brief Get value stored in PTR OUT register +//! +//! \param ui32Base is the base address of the I2S module. +//! +//! \return the value of PTR OUT. +// +//**************************************************************************** +__STATIC_INLINE uint32_t +I2SOutPointerGet(uint32_t ui32Base) +{ + // Check the arguments. + ASSERT(I2SBaseValid(ui32Base)); + + return (HWREG(I2S0_BASE + I2S_O_AIFOUTPTR)); +} + +//***************************************************************************** +// +//! \brief Configure the IN sample stamp generator. +//! +//! Use this function to configure the sample stamp generator. +//! +//! \param ui32Base is the base address of the I2S module. +//! \param ui16TrigValue value used to set the trigger. +//! +//! \return None +// +//***************************************************************************** +__STATIC_INLINE void +I2SSampleStampInConfigure(uint32_t ui32Base, uint16_t ui16TrigValue) +{ + // Check the arguments. + ASSERT(I2SBaseValid(ui32Base)); + + // Setup the sample stamp trigger for input streams. + HWREGH(I2S0_BASE + I2S_O_STMPINTRIG) = ui16TrigValue; +} + +//***************************************************************************** +// +//! \brief Configure the OUT sample stamp generator. +//! +//! Use this function to configure the sample stamp generator. +//! +//! \param ui32Base is the base address of the I2S module. +//! \param ui16TrigValue value used to set the trigger. +//! +//! \return None +// +//***************************************************************************** +__STATIC_INLINE void +I2SSampleStampOutConfigure(uint32_t ui32Base, uint16_t ui16TrigValue) +{ + // Check the arguments. + ASSERT(I2SBaseValid(ui32Base)); + + // Setup the sample stamp trigger for output streams. + HWREGH(I2S0_BASE + I2S_O_STMPOUTTRIG) = ui16TrigValue; +} + +//***************************************************************************** +// +//! \brief Add the specified value to the WCLK count. +//! +//! \param ui32Base is the base address of the I2S module. +//! \param i16Value is the offset to add to the counter (this value can be negative) +//! +//! \return None +// +//***************************************************************************** +__STATIC_INLINE void +I2SWclkCounterConfigure(uint32_t ui32Base, int16_t i16Value) +{ + uint16_t ui16MinusValue; + + // Check the arguments. + ASSERT(I2SBaseValid(ui32Base)); + + if (i16Value >= 0) + { + HWREGH(I2S0_BASE + I2S_O_STMPWADD) = i16Value; + } + else + { + ui16MinusValue = (uint16_t)(-i16Value); + HWREGH(I2S0_BASE + I2S_O_STMPWADD) = HWREGH(I2S0_BASE + I2S_O_STMPWPER) - ui16MinusValue; + } +} + +//***************************************************************************** +// +//! \brief Reset the WCLK count. +//! +//! \param ui32Base is the base address of the I2S module. +//! +//! \return None +// +//***************************************************************************** +__STATIC_INLINE void +I2SWclkCounterReset(uint32_t ui32Base) +{ + // Check the arguments. + ASSERT(I2SBaseValid(ui32Base)); + + HWREGH(I2S0_BASE + I2S_O_STMPWSET) = 0; +} + //***************************************************************************** // // Support for DriverLib in ROM: diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/i2s_doc.h b/third_party/ti/devices/cc13x2_cc26x2/driverlib/i2s_doc.h new file mode 100644 index 000000000..5f2e1d9e0 --- /dev/null +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/i2s_doc.h @@ -0,0 +1,141 @@ +/****************************************************************************** +* Filename: i2s_doc.h +* Revised: $$ +* Revision: $$ +* +* Copyright (c) 2015 - 2017, Texas Instruments Incorporated +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* 1) Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* +* 2) Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* 3) Neither the name of the ORGANIZATION nor the names of its contributors may +* be used to endorse or promote products derived from this software without +* specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +******************************************************************************/ +//! \addtogroup i2s_api +//! @{ +//! \section sec_i2s Introduction +//! +//! The I2S API provides a set of functions for using the I2S module. +//! This module provides a standardized serial interface to transfer +//! audio samples from and to external audio devices such as a codec, +//! DAC, or ADC. +//! +//! The I2S module has the following features: +//! - Audio clock signals are internally generated by the PRCM module +//! or externally by another device. +//! - One or two data pins, which can be configured independently as +//! input or output +//! - Various data formats according to the settings of the module +//! - Up to two channels per data pin for dual phase formats and up +//! to eight channels per data pin for single phase formats +//! - DMA with double-buffered pointers +//! - Error detection for DMA and audio clock signal integrity +//! - A Samplestamp generator that allows maintaining of constant +//! audio latency +//! +//! The I2S module is configured through the functions \ref I2SFormatConfigure(), +//! \ref I2SFrameConfigure() and \ref I2SWclkConfigure(). +//! Transfers are enabled using \ref I2SStart(). Transfers are disabled using +//! \ref I2SStop(). Please note that a specific procedure exists in order +//! to disable transfers without losing data (refer to \ref I2SStop()). +//! +//! Data are transmitted using the two double-buffered pointers. +//! For each interface, two registers are set with the address of the data to +//! transfer. These registers are named INPTR and INPTRNEXT for the input +//! interface and OUTPTR and OUTPTRNEXT for the output. When PTR is consumed, +//! the hardware copies the content of PTRNEXT into PTR and the next transfer +//! begins. +//! The address of the next value to write or to read in memory (i.e. to receive +//! or to send out) is set using \ref I2SInPointerSet() and \ref I2SOutPointerSet(). +//! The values contented by INPTRNEXT, OUTPTRNEXT, INPTR and OUTPTR can be read using +//! \ref I2SInPointerNextGet(), \ref I2SOutPointerNextGet(), \ref I2SInPointerGet() and +//! \ref I2SOutPointerGet() functions. +//! +//! Interrupts can help the user to refresh pointers on time. Interrupts can also +//! be used to detect I2S errors. \ref I2SIntEnable() and \ref I2SIntDisable() +//! activate and deactivate interrupt(s). Interrupt status can be read through +//! \ref I2SIntStatus() and a pending interrupt can be acquitted by +//! \ref I2SIntClear() function. +//! +//! The sample stamps generator can be configured to slightly delay the +//! emission or the reception of the data (based on the number of WCLK +//! cycles) using \ref I2SSampleStampInConfigure(), \ref I2SSampleStampOutConfigure(), +//! \ref I2SWclkCounterReset() and \ref I2SWclkCounterConfigure(). The current sample stamp +//! can be computed using \ref I2SSampleStampGet(). +//! To finish, the sample stamps generator can be enable and disable using +//! the following functions: \ref I2SSampleStampEnable() and +//! \ref I2SSampleStampDisable(). +//! The sample stamps generator must be enabled prior to any transfer. +//! +//! Note: Other functions contained in the PRCM API are required to handle I2S. +//! +//! \section sec_i2s_api API +//! +//! Two APIs are coexisting. +//! It is recommended to only use the new API as the old one is deprecated and +//! will be removed soon. +//! +//! New API: +//! Functions to perform I2S configuration: +//! - \ref I2SStart() +//! - \ref I2SStop() +//! - \ref I2SFormatConfigure() +//! - \ref I2SFrameConfigure() +//! - \ref I2SWclkConfigure() +//! +//! Functions to perform transfers: +//! - \ref I2SInPointerSet() +//! - \ref I2SOutPointerSet() +//! - \ref I2SInPointerGet() +//! - \ref I2SOutPointerGet() +//! - \ref I2SInPointerNextGet() +//! - \ref I2SOutPointerNextGet() +//! +//! Functions to handle interruptions: +//! - \ref I2SIntEnable() +//! - \ref I2SIntDisable() +//! - \ref I2SIntStatus() +//! - \ref I2SIntClear() +//! +//! Functions to handle sample stamps +//! - \ref I2SSampleStampEnable() +//! - \ref I2SSampleStampDisable() +//! - \ref I2SSampleStampInConfigure() +//! - \ref I2SSampleStampOutConfigure() +//! - \ref I2SSampleStampGet() +//! - \ref I2SWclkCounterConfigure() +//! - \ref I2SWclkCounterReset() +//! +//! Old API: +//! \ref I2SEnable(), \ref I2SDisable(), \ref I2SAudioFormatConfigure(), +//! \ref I2SChannelConfigure(), \ref I2SClockConfigure(), +//! \ref I2SBufferConfig(), \ref I2SIntEnable(), \ref I2SIntDisable(), +//! \ref I2SIntStatus(), \ref I2SIntClear(), \ref I2SSampleStampEnable(), +//! \ref I2SSampleStampDisable(), \ref I2SSampleStampGet(), +//! \ref I2SPointerSet (), \ref I2SPointerUpdate(), +//! \ref I2SSampleStampConfigure(), \ref I2SIntRegister(), +//! \ref I2SIntUnregister() +//! +//! @} diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/osc.c b/third_party/ti/devices/cc13x2_cc26x2/driverlib/osc.c index 3c557c182..1212d01e7 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/osc.c +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/osc.c @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: osc.c -* Revised: 2017-09-01 10:21:01 +0200 (Fri, 01 Sep 2017) -* Revision: 49677 +* Revised: 2019-02-14 09:35:31 +0100 (Thu, 14 Feb 2019) +* Revision: 54539 * * Description: Driver for setting up the system Oscillators * @@ -67,14 +67,32 @@ #define OSCHF_DebugGetCrystalAmplitude NOROM_OSCHF_DebugGetCrystalAmplitude #undef OSCHF_DebugGetExpectedAverageCrystalAmplitude #define OSCHF_DebugGetExpectedAverageCrystalAmplitude NOROM_OSCHF_DebugGetExpectedAverageCrystalAmplitude + #undef OSC_HPOSC_Debug_InitFreqOffsetParams + #define OSC_HPOSC_Debug_InitFreqOffsetParams NOROM_OSC_HPOSC_Debug_InitFreqOffsetParams + #undef OSC_HPOSCInitializeFrequencyOffsetParameters + #define OSC_HPOSCInitializeFrequencyOffsetParameters NOROM_OSC_HPOSCInitializeFrequencyOffsetParameters #undef OSC_HPOSCRelativeFrequencyOffsetGet #define OSC_HPOSCRelativeFrequencyOffsetGet NOROM_OSC_HPOSCRelativeFrequencyOffsetGet #undef OSC_AdjustXoscHfCapArray #define OSC_AdjustXoscHfCapArray NOROM_OSC_AdjustXoscHfCapArray #undef OSC_HPOSCRelativeFrequencyOffsetToRFCoreFormatConvert #define OSC_HPOSCRelativeFrequencyOffsetToRFCoreFormatConvert NOROM_OSC_HPOSCRelativeFrequencyOffsetToRFCoreFormatConvert + #undef OSC_HPOSCRtcCompensate + #define OSC_HPOSCRtcCompensate NOROM_OSC_HPOSCRtcCompensate #endif +//***************************************************************************** +// +// Global HPOSC curve fitting polynomials +// Parameters found/calculated when calling function +// OSC_HPOSCInitializeFrequencyOffsetParameters() +// (or OSC_HPOSC_Debug_InitFreqOffsetParams() used for debugging only) +// These global variables must be updated before using HPOSC +// +//***************************************************************************** + +static int16_t _hpOscPolynomials[ 4 ]; + //***************************************************************************** // // OSCHF switch time calculator defines and globals @@ -311,6 +329,132 @@ OSC_AdjustXoscHfCapArray( int32_t capArrDelta ) DDI32RegWrite(AUX_DDI0_OSC_BASE, DDI_0_OSC_O_ANABYPASSVAL1, SetupGetTrimForAnabypassValue1( ccfg_ModeConfReg )); } +//***************************************************************************** +// +// Initialize the frequency offset curve fitting parameters +// These are either picked diretly from FCFG1:FREQ_OFFSET & FCFG1:MISC_CONF_2 or +// calculated based on the FCFG1:HPOSC_MEAS_x parameters. +// +//***************************************************************************** + +// Using the following hardcoded constants (Using temporary constants for now) +#define D1OFFSET_p25C -24 +#define D2OFFSET_p85C -36 +#define D3OFFSET_m40C 18 +#define P3_POLYNOMIAL -47 +#define N_INSERTIONS 3 + +typedef struct { + int32_t dFreq ; + int32_t temp ; +} insertion_t ; + +static void +InitializeMeasurmentSet( insertion_t * pInsertion, uint32_t registerAddress, int32_t deltaOffset, int32_t p3PolOffset ) +{ + // Doing the following adjustment to the deltaFrequence before finding the polynomials P0, P1, P2 + // Dx = Dx + DxOFFSET - ((P3*Tx^3)/2^18) + uint32_t insertionData = HWREG( registerAddress ); + pInsertion->dFreq = (((int32_t)( insertionData << ( 32 - FCFG1_HPOSC_MEAS_1_HPOSC_D1_W - FCFG1_HPOSC_MEAS_1_HPOSC_D1_S ))) + >> ( 32 - FCFG1_HPOSC_MEAS_1_HPOSC_D1_W )); + pInsertion->temp = (((int32_t)( insertionData << ( 32 - FCFG1_HPOSC_MEAS_1_HPOSC_T1_W - FCFG1_HPOSC_MEAS_1_HPOSC_T1_S ))) + >> ( 32 - FCFG1_HPOSC_MEAS_1_HPOSC_T1_W )); + pInsertion->dFreq = pInsertion->dFreq + deltaOffset - (( p3PolOffset * pInsertion->temp * pInsertion->temp * pInsertion->temp ) >> 18 ); +} + +static void +FindPolynomialsAndUpdateGlobals( insertion_t * pMeasurment ) +{ + uint32_t loopCount ; + int32_t polynomial_0 ; + int32_t polynomial_1 ; + int32_t polynomial_2 ; + + int32_t Syi_ = 0 ; + int32_t Sxi_ = 0 ; + int32_t Sxi2_ = 0 ; + int32_t Sxiyi_ = 0 ; + int32_t Sxi2yi_ = 0 ; + int32_t Sxi3_ = 0 ; + int32_t Sxi4_ = 0 ; + + for ( loopCount = 0 ; loopCount < N_INSERTIONS ; loopCount++ ) { + int32_t x ; + int32_t x2 ; + int32_t y ; + + x = pMeasurment[ loopCount ].temp ; + x2 = ( x * x ); + y = pMeasurment[ loopCount ].dFreq ; + + Syi_ += ( y ); + Sxi_ += ( x ); + Sxi2_ += ( x2 ); + Sxiyi_ += ( x * y ); + Sxi2yi_ += ( x2 * y ); + Sxi3_ += ( x2 * x ); + Sxi4_ += ( x2 * x2 ); + } + + int32_t Sxx_ = ( Sxi2_ * N_INSERTIONS ) - ( Sxi_ * Sxi_ ); + int32_t Sxy_ = ( Sxiyi_ * N_INSERTIONS ) - ( Sxi_ * Syi_ ); + int32_t Sxx2_ = ( Sxi3_ * N_INSERTIONS ) - ( Sxi_ * Sxi2_ ); + int32_t Sx2y_ = ( Sxi2yi_ * N_INSERTIONS ) - ( Sxi2_ * Syi_ ); + int32_t Sx2x2_ = ( Sxi4_ * N_INSERTIONS ) - ( Sxi2_ * Sxi2_ ); + + int32_t divisor = ((((int64_t) Sxx_ * Sx2x2_ ) - ((int64_t) Sxx2_ * Sxx2_ )) + (1<<9)) >> 10 ; + if ( divisor == 0 ) { + polynomial_2 = 0 ; + polynomial_1 = 0 ; + } else { + polynomial_2 = (((int64_t) Sx2y_ * Sxx_ ) - ((int64_t) Sxy_ * Sxx2_ )) / divisor ; + polynomial_1 = (((int64_t) Sxy_ * Sx2x2_ ) - ((int64_t) Sx2y_ * Sxx2_ )) / divisor ; + } + polynomial_0 = ( Syi_ - (((( polynomial_1 * Sxi_ ) + ( polynomial_2 * Sxi2_ )) + (1<<9)) >> 10 )) / N_INSERTIONS ; + polynomial_1 = ( polynomial_1 + (1<<6)) >> 7 ; + + _hpOscPolynomials[ 0 ] = polynomial_0 ; + _hpOscPolynomials[ 1 ] = polynomial_1 ; + _hpOscPolynomials[ 2 ] = polynomial_2 ; + _hpOscPolynomials[ 3 ] = P3_POLYNOMIAL ; +} + +//***************************************************************************** +// Degub function to calculate the HPOSC polynomials for experimental data sets. +//***************************************************************************** +void +OSC_HPOSC_Debug_InitFreqOffsetParams( HposcDebugData_t * pDebugData ) +{ + // Calculate the curve fitting parameters from temp insertion measurements + // But first adjust the measurements with constants found in characterization + insertion_t pMeasurment[ 3 ]; + + InitializeMeasurmentSet( &pMeasurment[ 0 ], (uint32_t)&pDebugData->meas_1, pDebugData->offsetD1, pDebugData->polyP3 ); + InitializeMeasurmentSet( &pMeasurment[ 1 ], (uint32_t)&pDebugData->meas_2, pDebugData->offsetD2, pDebugData->polyP3 ); + InitializeMeasurmentSet( &pMeasurment[ 2 ], (uint32_t)&pDebugData->meas_3, pDebugData->offsetD3, pDebugData->polyP3 ); + + FindPolynomialsAndUpdateGlobals( pMeasurment ); +} + +//***************************************************************************** +// The general HPOSC initialization function - Must always be called before using HPOSC +//***************************************************************************** +void +OSC_HPOSCInitializeFrequencyOffsetParameters( void ) +{ + { + // Calculate the curve fitting parameters from temp insertion measurements + // But first adjust the measurements with constants found in characterization + insertion_t pMeasurment[ 3 ]; + + InitializeMeasurmentSet( &pMeasurment[ 0 ], FCFG1_BASE + FCFG1_O_HPOSC_MEAS_1, D1OFFSET_p25C, P3_POLYNOMIAL ); + InitializeMeasurmentSet( &pMeasurment[ 1 ], FCFG1_BASE + FCFG1_O_HPOSC_MEAS_2, D2OFFSET_p85C, P3_POLYNOMIAL ); + InitializeMeasurmentSet( &pMeasurment[ 2 ], FCFG1_BASE + FCFG1_O_HPOSC_MEAS_3, D3OFFSET_m40C, P3_POLYNOMIAL ); + + FindPolynomialsAndUpdateGlobals( pMeasurment ); + } +} + //***************************************************************************** // // Calculate the temperature dependent relative frequency offset of HPOSC @@ -320,17 +464,11 @@ int32_t OSC_HPOSCRelativeFrequencyOffsetGet( int32_t tempDegC ) { // Estimate HPOSC frequency, using temperature and curve fitting parameters - uint32_t fitParams = HWREG(FCFG1_BASE + FCFG1_O_FREQ_OFFSET); - // Extract the P0,P1,P2 params, and sign extend them via shifting up/down - int32_t paramP0 = ((((int32_t) fitParams) << (32 - FCFG1_FREQ_OFFSET_HPOSC_COMP_P0_W - FCFG1_FREQ_OFFSET_HPOSC_COMP_P0_S)) - >> (32 - FCFG1_FREQ_OFFSET_HPOSC_COMP_P0_W)); - int32_t paramP1 = ((((int32_t) fitParams) << (32 - FCFG1_FREQ_OFFSET_HPOSC_COMP_P1_W - FCFG1_FREQ_OFFSET_HPOSC_COMP_P1_S)) - >> (32 - FCFG1_FREQ_OFFSET_HPOSC_COMP_P1_W)); - int32_t paramP2 = ((((int32_t) fitParams) << (32 - FCFG1_FREQ_OFFSET_HPOSC_COMP_P2_W - FCFG1_FREQ_OFFSET_HPOSC_COMP_P2_S)) - >> (32 - FCFG1_FREQ_OFFSET_HPOSC_COMP_P2_W)); - int32_t paramP3 = ((((int32_t) HWREG(FCFG1_BASE + FCFG1_O_MISC_CONF_2)) - << (32 - FCFG1_MISC_CONF_2_HPOSC_COMP_P3_W - FCFG1_MISC_CONF_2_HPOSC_COMP_P3_S)) - >> (32 - FCFG1_MISC_CONF_2_HPOSC_COMP_P3_W)); + + int32_t paramP0 = _hpOscPolynomials[ 0 ]; + int32_t paramP1 = _hpOscPolynomials[ 1 ]; + int32_t paramP2 = _hpOscPolynomials[ 2 ]; + int32_t paramP3 = _hpOscPolynomials[ 3 ]; // Now we can find the HPOSC freq offset, given as a signed variable d, expressed by: // @@ -395,6 +533,41 @@ OSC_HPOSCRelativeFrequencyOffsetToRFCoreFormatConvert( int32_t HPOSC_RelFreqOffs return ( rfCoreFreqOffset ); } +//***************************************************************************** +// +// Compensate the RTC increment based on the relative frequency offset of HPOSC +// +//***************************************************************************** +void +OSC_HPOSCRtcCompensate( int32_t relFreqOffset ) +{ + uint32_t rtcSubSecInc; + uint32_t lfClkFrequency; + uint32_t hfFreq; + int64_t calcFactor; + + // Calculate SCLK_HF frequency, defined as: + // hfFreq = 48000000 * (1 + relFreqOffset/(2^22)) + if( relFreqOffset >= 0 ) + { + calcFactor = ( ( 48000000 * (int64_t)relFreqOffset ) + 0x200000 ) / 0x400000; + } + else + { + calcFactor = ( ( 48000000 * (int64_t)relFreqOffset ) - 0x200000 ) / 0x400000; + } + hfFreq = 48000000 + calcFactor; + + // Calculate SCLK_LF frequency, defined as SCLK_LF_FREQ = SCLK_HF_FREQ / 1536 + lfClkFrequency = ( hfFreq + 768 ) / 1536; + + // Calculate SUBSECINC, defined as: SUBSECINC = 2^38 / SCLK_LF_FREQ + rtcSubSecInc = 0x4000000000 / lfClkFrequency; + + /* Update SUBSECINC value */ + SetupSetAonRtcSubSecInc(rtcSubSecInc); +} + //***************************************************************************** // // Get crystal amplitude (assuming crystal is running). diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/osc.h b/third_party/ti/devices/cc13x2_cc26x2/driverlib/osc.h index 20215fd14..52fe0f30a 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/osc.h +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/osc.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: osc.h -* Revised: 2018-04-18 15:47:09 +0200 (Wed, 18 Apr 2018) -* Revision: 51907 +* Revised: 2019-02-14 09:35:31 +0100 (Thu, 14 Feb 2019) +* Revision: 54539 * * Description: Defines and prototypes for the system oscillator control. * @@ -62,6 +62,8 @@ extern "C" #include #include #include "../inc/hw_aon_pmctl.h" +#include "../inc/hw_ccfg.h" +#include "../inc/hw_fcfg1.h" #include "../inc/hw_types.h" #include "../inc/hw_memmap.h" #include "../inc/hw_ddi.h" @@ -92,9 +94,12 @@ extern "C" #define OSCHF_SwitchToRcOscTurnOffXosc NOROM_OSCHF_SwitchToRcOscTurnOffXosc #define OSCHF_DebugGetCrystalAmplitude NOROM_OSCHF_DebugGetCrystalAmplitude #define OSCHF_DebugGetExpectedAverageCrystalAmplitude NOROM_OSCHF_DebugGetExpectedAverageCrystalAmplitude + #define OSC_HPOSC_Debug_InitFreqOffsetParams NOROM_OSC_HPOSC_Debug_InitFreqOffsetParams + #define OSC_HPOSCInitializeFrequencyOffsetParameters NOROM_OSC_HPOSCInitializeFrequencyOffsetParameters #define OSC_HPOSCRelativeFrequencyOffsetGet NOROM_OSC_HPOSCRelativeFrequencyOffsetGet #define OSC_AdjustXoscHfCapArray NOROM_OSC_AdjustXoscHfCapArray #define OSC_HPOSCRelativeFrequencyOffsetToRFCoreFormatConvert NOROM_OSC_HPOSCRelativeFrequencyOffsetToRFCoreFormatConvert + #define OSC_HPOSCRtcCompensate NOROM_OSC_HPOSCRtcCompensate #endif //***************************************************************************** @@ -208,9 +213,9 @@ OSCClockLossEventDisable( void ) //! Use this function to set the oscillator source for one or more of the //! system source clocks. //! -//! When selecting the high frequency clock source, this function will not do +//! When selecting the high frequency clock source (OSC_SRC_CLK_HF), this function will not do //! the actual switch. Enabling the high frequency XTAL can take several hundred -//! micro seconds, so the actual switch is split into a separate function, +//! micro seconds, so the actual switch is done in a separate function, \ref OSCHfSourceSwitch(), //! leaving System CPU free to perform other tasks as the XTAL starts up. //! //! \note The High Frequency (\ref OSC_SRC_CLK_HF) can only be derived from the @@ -232,7 +237,7 @@ OSCClockLossEventDisable( void ) //! - \ref OSC_RCOSC_LF (only when ui32SrcClk is \ref OSC_SRC_CLK_LF) //! - \ref OSC_XOSC_LF (only when ui32SrcClk is \ref OSC_SRC_CLK_LF) //! -//! \sa OSCClockSourceGet() +//! \sa \ref OSCClockSourceGet(), \ref OSCHfSourceSwitch() //! //! \return None // @@ -292,7 +297,7 @@ OSCHfSourceReady(void) //! //! When switching the HF clock source the clock period might be prolonged //! leaving the clock 'stuck-at' high or low for a few cycles. To ensure that -//! this does not coincide with a read access to the Flash potentially +//! this does not coincide with a read access to the Flash, potentially //! freezing the device, the HF clock source switch must be executed from ROM. //! //! \note This function will not return until the clock source has been @@ -307,8 +312,82 @@ OSCHfSourceReady(void) __STATIC_INLINE void OSCHfSourceSwitch(void) { + // Read target clock (lower half of the 32-bit CTL0 register) + uint16_t hfSrc = HWREGH(AUX_DDI0_OSC_BASE + DDI_0_OSC_O_CTL0) & DDI_0_OSC_CTL0_SCLK_HF_SRC_SEL_M; + + // If target clock source is RCOSC, change clock source for DCDC to RCOSC + if(hfSrc == DDI_0_OSC_CTL0_SCLK_HF_SRC_SEL_RCOSC) + { + // Force DCDC to use RCOSC before switching SCLK_HF to RCOSC + HWREG(AUX_DDI0_OSC_BASE + DDI_O_MASK16B + (DDI_0_OSC_O_CTL0 << 1) + 4) = DDI_0_OSC_CTL0_CLK_DCDC_SRC_SEL_M | (DDI_0_OSC_CTL0_CLK_DCDC_SRC_SEL_M >> 16); + // Dummy read to ensure that the write has propagated + HWREGH(AUX_DDI0_OSC_BASE + DDI_0_OSC_O_CTL0); + } + // Switch the HF clock source HapiHFSourceSafeSwitch(); + + // If target clock source is XOSC, change clock source for DCDC to "auto" + if(hfSrc == DDI_0_OSC_CTL0_SCLK_HF_SRC_SEL_XOSC) + { + // Set DCDC clock source back to "auto" after SCLK_HF was switched to XOSC + HWREG(AUX_DDI0_OSC_BASE + DDI_O_MASK16B + (DDI_0_OSC_O_CTL0 << 1) + 4) = DDI_0_OSC_CTL0_CLK_DCDC_SRC_SEL_M; + } +} + +//***************************************************************************** +// +//! \brief Identifies if HPOSC is enabled. +//! +//! This function checks if the device supports HPOSC and that HPOSC is selected +//! as HF oscillator for use when the radio is active. +//! +//! \return Returns status of HPOSC functionality: +//! - \c true : HPOSC is enabled. +//! - \c false : HPOSC is not enabled. +// +//***************************************************************************** +__STATIC_INLINE bool +OSC_IsHPOSCEnabled(void) +{ + bool enabled = false; + + if((( HWREG(CCFG_BASE + CCFG_O_MODE_CONF) & CCFG_MODE_CONF_XOSC_FREQ_M) == CCFG_MODE_CONF_XOSC_FREQ_HPOSC) && + (( HWREG(FCFG1_BASE + FCFG1_O_OSC_CONF) & FCFG1_OSC_CONF_HPOSC_OPTION) == 0)) + { + enabled = true; + } + + return (enabled); +} + +//***************************************************************************** +// +//! \brief Identifies if HPOSC is enabled and that SCLK_LF is derived from XOSC_HF. +//! +//! This function checks if the device supports HPOSC and that HPOSC is selected +//! as HF oscillator for use when the radio is active and also that SCLK_LF is +//! derived from XOSC_HF. +//! +//! \return Returns status of HPOSC and SCLK_LF configuration: +//! - \c true : HPOSC is enabled and SCLK_LF is derived from XOSC_HF. +//! - \c false : Either HPOSC not enabled or SCLK_LF is not derived from XOSC_HF. +// +//***************************************************************************** +__STATIC_INLINE bool +OSC_IsHPOSCEnabledWithHfDerivedLfClock(void) +{ + bool enabled = false; + + // Check configuration by reading lower half of the 32-bit CTL0 register + uint16_t regVal = HWREGH(AUX_DDI0_OSC_BASE + DDI_0_OSC_O_CTL0); + if( ( ( regVal & DDI_0_OSC_CTL0_SCLK_LF_SRC_SEL_M ) == DDI_0_OSC_CTL0_SCLK_LF_SRC_SEL_XOSCHFDLF ) && + ( ( regVal & DDI_0_OSC_CTL0_HPOSC_MODE_EN_M ) == DDI_0_OSC_CTL0_HPOSC_MODE_EN ) ) + { + enabled = true; + } + + return (enabled); } //***************************************************************************** @@ -402,6 +481,53 @@ extern uint32_t OSCHF_DebugGetCrystalAmplitude( void ); //***************************************************************************** extern uint32_t OSCHF_DebugGetExpectedAverageCrystalAmplitude( void ); +//***************************************************************************** +// +//! \brief Data structure for experimental HPOSC polynomials calculation. +//! +//! The structure of the meas_1, meas_2 and meas_3 parameter is +//! as defined in FCFG1_O_HPOSC_MEAS_1, 2 and 3. +//! +//! \sa OSC_HPOSC_Debug_InitFreqOffsetParams() +// +//***************************************************************************** +typedef struct { + uint32_t meas_1 ; //!< Measurement set 1 (typically at room temp) + uint32_t meas_2 ; //!< Measurement set 2 (typically at high temp) + uint32_t meas_3 ; //!< Measurement set 3 (typically at low temp) + int32_t offsetD1 ; //!< Offset to measurement set 1 + int32_t offsetD2 ; //!< Offset to measurement set 2 + int32_t offsetD3 ; //!< Offset to measurement set 3 + int32_t polyP3 ; //!< The P3 polynomial +} HposcDebugData_t; + +//***************************************************************************** +// +//! \brief Debug function to calculate the HPOSC polynomials for experimental data sets. +//! +//! \param pDebugData pointer to the input data collected in \ref HposcDebugData_t +//! +//! \return None +//! +//! \sa OSC_HPOSCInitializeFrequencyOffsetParameters() +// +//***************************************************************************** +extern void OSC_HPOSC_Debug_InitFreqOffsetParams( HposcDebugData_t * pDebugData ); + +//***************************************************************************** +// +//! \brief HPOSC initialization function. Must always be called before using HPOSC. +//! +//! Calculates the fitting curve parameters (polynomials) to used by the +//! HPOSC temperature compensation. +//! +//! \return None +//! +//! \sa OSC_HPOSC_Debug_InitFreqOffsetParams() +// +//***************************************************************************** +extern void OSC_HPOSCInitializeFrequencyOffsetParameters( void ); + //***************************************************************************** // //! \brief Calculate the temperature dependent relative frequency offset of HPOSC @@ -481,6 +607,43 @@ extern void OSC_AdjustXoscHfCapArray( int32_t capArrDelta ); //***************************************************************************** extern int16_t OSC_HPOSCRelativeFrequencyOffsetToRFCoreFormatConvert( int32_t HPOSC_RelFreqOffset ); +//***************************************************************************** +// +//! \brief Compensate the RTC increment based on the relative frequency offset of HPOSC +//! +//! The HPOSC (High Precision Oscillator) frequency will vary slightly with chip temperature. +//! This variation forces the RTC increment to be compensated if SCLK_LF is configured +//! to be derived from the HF clock of HPOSC. +//! This function must only be called if SCLK_LF is configured to be derived from +//! the HF clock of HPOSC. The status of this configuration can be determined +//! by calling the \ref OSC_IsHPOSCEnabledWithHfDerivedLfClock() function. +//! +//! This function first calculates the HPOSC frequency, defined as: +//!

+//!     F_HPOSC = F_nom * (1 + d/(2^22))
+//! 
+//! where +//! - F_HPOSC is the current HPOSC frequency. +//! - F_nom is the nominal oscillator frequency, assumed to be 48.000 MHz. +//! - d is the relative frequency offset given by the input argument relFreqOffset. +//! Then the SCLK_LF frequency is calculated, defined as: +//!
+//!     F_SCLK_LF = F_HPOSC / 1536
+//! 
+//! Then the RTC increment SUBSECINC is calculated, defined as; +//!
+//!     SUBSECINC = (2^38) / F_SCLK_LF
+//! 
+//! Finally the RTC module is updated with the calculated SUBSECINC value. +//! +//! \param relFreqOffset is the relative frequency offset parameter d returned from \ref OSC_HPOSCRelativeFrequencyOffsetGet() +//! +//! \return None +//! +// +//***************************************************************************** +extern void OSC_HPOSCRtcCompensate( int32_t relFreqOffset ); + //***************************************************************************** // // Support for DriverLib in ROM: @@ -521,6 +684,14 @@ extern int16_t OSC_HPOSCRelativeFrequencyOffsetToRFCoreFormatConvert( int32_t HP #undef OSCHF_DebugGetExpectedAverageCrystalAmplitude #define OSCHF_DebugGetExpectedAverageCrystalAmplitude ROM_OSCHF_DebugGetExpectedAverageCrystalAmplitude #endif + #ifdef ROM_OSC_HPOSC_Debug_InitFreqOffsetParams + #undef OSC_HPOSC_Debug_InitFreqOffsetParams + #define OSC_HPOSC_Debug_InitFreqOffsetParams ROM_OSC_HPOSC_Debug_InitFreqOffsetParams + #endif + #ifdef ROM_OSC_HPOSCInitializeFrequencyOffsetParameters + #undef OSC_HPOSCInitializeFrequencyOffsetParameters + #define OSC_HPOSCInitializeFrequencyOffsetParameters ROM_OSC_HPOSCInitializeFrequencyOffsetParameters + #endif #ifdef ROM_OSC_HPOSCRelativeFrequencyOffsetGet #undef OSC_HPOSCRelativeFrequencyOffsetGet #define OSC_HPOSCRelativeFrequencyOffsetGet ROM_OSC_HPOSCRelativeFrequencyOffsetGet @@ -533,6 +704,10 @@ extern int16_t OSC_HPOSCRelativeFrequencyOffsetToRFCoreFormatConvert( int32_t HP #undef OSC_HPOSCRelativeFrequencyOffsetToRFCoreFormatConvert #define OSC_HPOSCRelativeFrequencyOffsetToRFCoreFormatConvert ROM_OSC_HPOSCRelativeFrequencyOffsetToRFCoreFormatConvert #endif + #ifdef ROM_OSC_HPOSCRtcCompensate + #undef OSC_HPOSCRtcCompensate + #define OSC_HPOSCRtcCompensate ROM_OSC_HPOSCRtcCompensate + #endif #endif //***************************************************************************** diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/pka.c b/third_party/ti/devices/cc13x2_cc26x2/driverlib/pka.c index ad3f04e68..57e4b5818 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/pka.c +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/pka.c @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: pka.c -* Revised: 2018-05-08 10:58:47 +0200 (Tue, 08 May 2018) -* Revision: 51975 +* Revised: 2018-07-19 15:07:05 +0200 (Thu, 19 Jul 2018) +* Revision: 52294 * * Description: Driver for the PKA module * @@ -45,6 +45,8 @@ // //***************************************************************************** #if !defined(DOXYGEN) + #undef PKAClearPkaRam + #define PKAClearPkaRam NOROM_PKAClearPkaRam #undef PKAGetOpsStatus #define PKAGetOpsStatus NOROM_PKAGetOpsStatus #undef PKAArrayAllZeros @@ -102,6 +104,8 @@ // //***************************************************************************** #if !defined(DOXYGEN) + #undef PKAClearPkaRam + #define PKAClearPkaRam NOROM_PKAClearPkaRam #undef PKAGetOpsStatus #define PKAGetOpsStatus NOROM_PKAGetOpsStatus #undef PKAArrayAllZeros @@ -569,6 +573,29 @@ const PKA_EccParam256 Curve25519_order = {.byte = {0xb9, 0xdc, 0xf5, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}; + +//***************************************************************************** +// +// Zeroize PKA RAM. Not threadsafe. +// +//***************************************************************************** +void PKAClearPkaRam(void){ + // Get initial state + uint32_t secdmaclkgr = HWREG(PRCM_BASE + PRCM_O_SECDMACLKGR); + + // OR in zeroize bit + secdmaclkgr |= PRCM_SECDMACLKGR_PKA_ZERIOZE_RESET_N; + + // Start zeroization + HWREG(PRCM_BASE + PRCM_O_SECDMACLKGR) = secdmaclkgr; + + // Wait 256 cycles for PKA RAM to be cleared + CPUdelay(256 / 4); + + // Turn off zeroization + HWREG(PRCM_BASE + PRCM_O_SECDMACLKGR) = secdmaclkgr & (~PRCM_SECDMACLKGR_PKA_ZERIOZE_RESET_N); +} + //***************************************************************************** // // Write a PKA parameter to the PKA module, set required registers, and add an offset. diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/pka.h b/third_party/ti/devices/cc13x2_cc26x2/driverlib/pka.h index d178c9249..e175ada8d 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/pka.h +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/pka.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: pka.h -* Revised: 2018-03-02 10:51:37 +0100 (Fri, 02 Mar 2018) -* Revision: 51635 +* Revised: 2018-07-19 15:07:05 +0200 (Thu, 19 Jul 2018) +* Revision: 52294 * * Description: PKA header file. * @@ -83,6 +83,7 @@ extern "C" // //***************************************************************************** #if !defined(DOXYGEN) + #define PKAClearPkaRam NOROM_PKAClearPkaRam #define PKAGetOpsStatus NOROM_PKAGetOpsStatus #define PKAArrayAllZeros NOROM_PKAArrayAllZeros #define PKAZeroOutArray NOROM_PKAZeroOutArray @@ -603,6 +604,15 @@ extern const PKA_EccParam256 Curve25519_order; // //***************************************************************************** +//***************************************************************************** +// +//! \brief Zeroizes PKA RAM. +//! +//! This function uses the zeroization function in PRCM to clear the PKA RAM. +// +//***************************************************************************** +extern void PKAClearPkaRam(void); + //***************************************************************************** // //! \brief Gets the PKA operation status. @@ -1323,6 +1333,10 @@ extern uint32_t PKAEccVerifyPublicKeyWeierstrassStart(const uint8_t *curvePointX //***************************************************************************** #if !defined(DRIVERLIB_NOROM) && !defined(DOXYGEN) #include "../driverlib/rom.h" + #ifdef ROM_PKAClearPkaRam + #undef PKAClearPkaRam + #define PKAClearPkaRam ROM_PKAClearPkaRam + #endif #ifdef ROM_PKAGetOpsStatus #undef PKAGetOpsStatus #define PKAGetOpsStatus ROM_PKAGetOpsStatus diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/prcm.c b/third_party/ti/devices/cc13x2_cc26x2/driverlib/prcm.c index b4e36119d..e81df8f93 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/prcm.c +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/prcm.c @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: prcm.c -* Revised: 2017-07-19 10:58:53 +0200 (Wed, 19 Jul 2017) -* Revision: 49363 +* Revised: 2018-10-18 17:33:32 +0200 (Thu, 18 Oct 2018) +* Revision: 52954 * * Description: Driver for the PRCM. * @@ -53,6 +53,10 @@ #define PRCMAudioClockConfigSet NOROM_PRCMAudioClockConfigSet #undef PRCMAudioClockConfigSetOverride #define PRCMAudioClockConfigSetOverride NOROM_PRCMAudioClockConfigSetOverride + #undef PRCMAudioClockInternalSource + #define PRCMAudioClockInternalSource NOROM_PRCMAudioClockInternalSource + #undef PRCMAudioClockExternalSource + #define PRCMAudioClockExternalSource NOROM_PRCMAudioClockExternalSource #undef PRCMPowerDomainOn #define PRCMPowerDomainOn NOROM_PRCMPowerDomainOn #undef PRCMPowerDomainOff @@ -350,6 +354,64 @@ PRCMAudioClockConfigSetOverride(uint32_t ui32ClkConfig, uint32_t ui32MstDiv, HWREG(PRCM_BASE + PRCM_O_I2SCLKCTL) = ui32Reg | ui32ClkConfig; } +//***************************************************************************** +// +// Configure the audio clocks for I2S module +// +//***************************************************************************** +void +PRCMAudioClockConfigOverride(uint8_t ui8SamplingEdge, + uint8_t ui8WCLKPhase, + uint32_t ui32MstDiv, + uint32_t ui32BitDiv, + uint32_t ui32WordDiv) +{ + // Check the arguments. + ASSERT( ui8BitsPerSample == PRCM_WCLK_SINGLE_PHASE + || ui8BitsPerSample == PRCM_WCLK_DUAL_PHASE + || ui8BitsPerSample == PRCM_WCLK_USER_DEF); + + // Make sure the audio clock generation is disabled before reconfiguring. + PRCMAudioClockDisable(); + + // Make sure to compensate the Frame clock division factor if using single + // phase format. + if((ui8WCLKPhase) == PRCM_WCLK_SINGLE_PHASE) + { + ui32WordDiv -= 1; + } + + // Write the clock division factors. + HWREG(PRCM_BASE + PRCM_O_I2SMCLKDIV) = ui32MstDiv; + HWREG(PRCM_BASE + PRCM_O_I2SBCLKDIV) = ui32BitDiv; + HWREG(PRCM_BASE + PRCM_O_I2SWCLKDIV) = ui32WordDiv; + + // Configure the Word clock format and polarity and enable it. + HWREG(PRCM_BASE + PRCM_O_I2SCLKCTL) = (ui8SamplingEdge << PRCM_I2SCLKCTL_SMPL_ON_POSEDGE_S) | + (ui8WCLKPhase << PRCM_I2SCLKCTL_WCLK_PHASE_S ) | + (1 << PRCM_I2SCLKCTL_EN_S ); +} + +//***************************************************************************** +// +// Configure the clocks as "internally generated". +// +//***************************************************************************** +void PRCMAudioClockInternalSource(void) +{ + HWREGBITW(PRCM_BASE + PRCM_O_I2SBCLKSEL, PRCM_I2SBCLKSEL_SRC_BITN) = 1; +} + +//***************************************************************************** +// +// Configure the clocks as "externally generated". +// +//***************************************************************************** +void PRCMAudioClockExternalSource(void) +{ + HWREGBITW(PRCM_BASE + PRCM_O_I2SBCLKSEL, PRCM_I2SBCLKSEL_SRC_BITN) = 0; +} + //***************************************************************************** // // Turn power on in power domains in the MCU domain diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/prcm.h b/third_party/ti/devices/cc13x2_cc26x2/driverlib/prcm.h index fabda4b42..783ca4214 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/prcm.h +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/prcm.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: prcm.h -* Revised: 2017-12-11 16:44:38 +0100 (Mon, 11 Dec 2017) -* Revision: 50602 +* Revised: 2018-10-23 10:19:14 +0200 (Tue, 23 Oct 2018) +* Revision: 52979 * * Description: Defines and prototypes for the PRCM * @@ -71,6 +71,7 @@ extern "C" #include "debug.h" #include "cpu.h" + //***************************************************************************** // // Support for DriverLib in ROM: @@ -89,6 +90,8 @@ extern "C" #define PRCMInfClockConfigureGet NOROM_PRCMInfClockConfigureGet #define PRCMAudioClockConfigSet NOROM_PRCMAudioClockConfigSet #define PRCMAudioClockConfigSetOverride NOROM_PRCMAudioClockConfigSetOverride + #define PRCMAudioClockInternalSource NOROM_PRCMAudioClockInternalSource + #define PRCMAudioClockExternalSource NOROM_PRCMAudioClockExternalSource #define PRCMPowerDomainOn NOROM_PRCMPowerDomainOn #define PRCMPowerDomainOff NOROM_PRCMPowerDomainOff #define PRCMPeripheralRunEnable NOROM_PRCMPeripheralRunEnable @@ -169,6 +172,11 @@ extern "C" #define PRCM_WCLK_SINGLE_PHASE 0x00000000 #define PRCM_WCLK_DUAL_PHASE 0x00000002 #define PRCM_WCLK_USER_DEF 0x00000004 +#define PRCM_I2S_WCLK_NEG_EDGE 0 +#define PRCM_I2S_WCLK_POS_EDGE 1 +#define PRCM_I2S_WCLK_SINGLE_PHASE 0 +#define PRCM_I2S_WCLK_DUAL_PHASE 1 +#define PRCM_I2S_WCLK_USER_DEF 2 #define I2S_SAMPLE_RATE_16K 0x00000001 #define I2S_SAMPLE_RATE_24K 0x00000002 @@ -428,6 +436,8 @@ PRCMAudioClockDisable(void) // //! \brief Configure the audio clock generation. //! +//! \deprecated This function will be removed in a future release. +//! //! Use this function to set the sample rate when using internal audio clock //! generation for the I2S module. //! @@ -455,13 +465,17 @@ PRCMAudioClockDisable(void) //! \sa \ref PRCMAudioClockConfigSetOverride() // //***************************************************************************** +#ifndef DEPRECATED extern void PRCMAudioClockConfigSet(uint32_t ui32ClkConfig, uint32_t ui32SampleRate); +#endif //***************************************************************************** // //! \brief Configure the audio clock generation with manual setting of clock divider. //! +//! \deprecated This function will be removed in a future release. +//! //! Use this function to set the audio clock divider values manually. //! //! \note See hardware documentation before setting audio clock dividers manually. @@ -483,8 +497,64 @@ extern void PRCMAudioClockConfigSet(uint32_t ui32ClkConfig, //! \sa \ref PRCMAudioClockConfigSet() // //***************************************************************************** +#ifndef DEPRECATED extern void PRCMAudioClockConfigSetOverride(uint32_t ui32ClkConfig, uint32_t ui32MstDiv, uint32_t ui32BitDiv, uint32_t ui32WordDiv); +#endif + +//***************************************************************************** +// +//! \brief Configure the audio clocks for I2S module. +//! +//! \note See hardware documentation before setting audio clock dividers. +//! This is user's responsability to provide valid clock dividers. +//! +//! \param ui8SamplingEdge Define the clock polarity: +//! - \ref PRCM_I2S_WCLK_NEG_EDGE +//! - \ref PRCM_I2S_WCLK_POS_EDGE +//! \param ui8WCLKPhase Define I2S phase used +//! - PRCM_I2S_WCLK_SINGLE_PHASE +//! - PRCM_I2S_WCLK_DUAL_PHASE +//! - PRCM_I2S_WCLK_USER_DEF +//! \param ui32MstDiv is the desired master clock divider. +//! \param ui32BitDiv is the desired bit clock divider. +//! \param ui32WordDiv is the desired word clock divider. +//! +//! \return None +//! +//***************************************************************************** +extern void PRCMAudioClockConfigOverride + (uint8_t ui8SamplingEdge, + uint8_t ui8WCLKPhase, + uint32_t ui32MstDiv, + uint32_t ui32BitDiv, + uint32_t ui32WordDiv); + +//***************************************************************************** +// +//! \brief Configure the audio clocks to be internally generated. +//! +//! Use this function to set the audio clocks as internal. +//! +//! \return None +//! +//! \sa \ref PRCMAudioClockExternalSource() +// +//***************************************************************************** +extern void PRCMAudioClockInternalSource(void); + +//***************************************************************************** +// +//! \brief Configure the audio clocks to be externally generated. +//! +//! Use this function to set the audio clocks as external. +//! +//! \return None +//! +//! \sa \ref PRCMAudioClockInternalSource() +// +//***************************************************************************** +extern void PRCMAudioClockExternalSource(void); //***************************************************************************** // @@ -1094,6 +1164,14 @@ PRCMCacheRetentionDisable( void ) #undef PRCMAudioClockConfigSetOverride #define PRCMAudioClockConfigSetOverride ROM_PRCMAudioClockConfigSetOverride #endif + #ifdef ROM_PRCMAudioClockInternalSource + #undef PRCMAudioClockInternalSource + #define PRCMAudioClockInternalSource ROM_PRCMAudioClockInternalSource + #endif + #ifdef ROM_PRCMAudioClockExternalSource + #undef PRCMAudioClockExternalSource + #define PRCMAudioClockExternalSource ROM_PRCMAudioClockExternalSource + #endif #ifdef ROM_PRCMPowerDomainOn #undef PRCMPowerDomainOn #define PRCMPowerDomainOn ROM_PRCMPowerDomainOn diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_ble_cmd.h b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_ble_cmd.h index 2fc251fbb..d8517d0e4 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_ble_cmd.h +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_ble_cmd.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: rf_ble_cmd.h -* Revised: 2018-05-07 15:02:01 +0200 (Mon, 07 May 2018) -* Revision: 18438 +* Revised: 2018-07-31 20:13:42 +0200 (Tue, 31 Jul 2018) +* Revision: 18572 * * Description: CC13x2/CC26x2 API for Bluetooth Low Energy commands * @@ -203,9 +203,8 @@ struct __RFC_STRUCT rfc_ble5RadioOp_s { uint8_t rangeDelay; //!< Number of RAT ticks to add to the listening time after T_IFS uint16_t txPower; //!< \brief Transmit power to use (overrides the one given in radio setup)
//!< 0x0000: Use default TX power
- //!< 0xFFFF: Use field tx20Power to set power for 20-dBm PA or to switch PA - //!< (command structure that includes tx20Power must be used; patch - //!< required) + //!< 0xFFFF: 20-dBm PA only: Use TX power from tx20Power field (command + //!< structure that includes tx20Power must be used) uint8_t* pParams; //!< Pointer to command specific parameter structure uint8_t* pOutput; //!< Pointer to command specific output structure } __RFC_STRUCT_ATTR; @@ -258,12 +257,11 @@ struct __RFC_STRUCT rfc_ble5Tx20RadioOp_s { uint8_t rangeDelay; //!< Number of RAT ticks to add to the listening time after T_IFS uint16_t txPower; //!< \brief Transmit power to use (overrides the one given in radio setup)
//!< 0x0000: Use default TX power
- //!< 0xFFFF: Use field tx20Power to set power for 20-dBm PA or to switch PA - //!< (command structure that includes tx20Power must be used; patch - //!< required) + //!< 0xFFFF: 20-dBm PA only: Use TX power from tx20Power field (command + //!< structure that includes tx20Power must be used) uint8_t* pParams; //!< Pointer to command specific parameter structure uint8_t* pOutput; //!< Pointer to command specific output structure - uint32_t tx20Power; //!< \brief If txPower = 0xFFFF (patch required):
+ uint32_t tx20Power; //!< \brief If txPower = 0xFFFF:
//!< If tx20Power < 0x10000000: Transmit power to use for the 20-dBm PA; //!< overrides the one given in radio setup for the duration of the command.
//!< If tx20Power >= 0x10000000: Pointer to PA change override structure @@ -812,12 +810,11 @@ struct __RFC_STRUCT rfc_CMD_BLE5_SLAVE_s { uint8_t rangeDelay; //!< Number of RAT ticks to add to the listening time after T_IFS uint16_t txPower; //!< \brief Transmit power to use (overrides the one given in radio setup)
//!< 0x0000: Use default TX power
- //!< 0xFFFF: Use field tx20Power to set power for 20-dBm PA or to switch PA - //!< (command structure that includes tx20Power must be used; patch - //!< required) + //!< 0xFFFF: 20-dBm PA only: Use TX power from tx20Power field (command + //!< structure that includes tx20Power must be used) rfc_ble5SlavePar_t *pParams; //!< Pointer to command specific parameter structure rfc_bleMasterSlaveOutput_t *pOutput; //!< Pointer to command specific output structure - uint32_t tx20Power; //!< \brief If txPower = 0xFFFF (patch required):
+ uint32_t tx20Power; //!< \brief If txPower = 0xFFFF:
//!< If tx20Power < 0x10000000: Transmit power to use for the 20-dBm PA; //!< overrides the one given in radio setup for the duration of the command.
//!< If tx20Power >= 0x10000000: Pointer to PA change override structure @@ -875,12 +872,11 @@ struct __RFC_STRUCT rfc_CMD_BLE5_MASTER_s { uint8_t rangeDelay; //!< Number of RAT ticks to add to the listening time after T_IFS uint16_t txPower; //!< \brief Transmit power to use (overrides the one given in radio setup)
//!< 0x0000: Use default TX power
- //!< 0xFFFF: Use field tx20Power to set power for 20-dBm PA or to switch PA - //!< (command structure that includes tx20Power must be used; patch - //!< required) + //!< 0xFFFF: 20-dBm PA only: Use TX power from tx20Power field (command + //!< structure that includes tx20Power must be used) rfc_ble5MasterPar_t *pParams; //!< Pointer to command specific parameter structure rfc_bleMasterSlaveOutput_t *pOutput; //!< Pointer to command specific output structure - uint32_t tx20Power; //!< \brief If txPower = 0xFFFF (patch required):
+ uint32_t tx20Power; //!< \brief If txPower = 0xFFFF:
//!< If tx20Power < 0x10000000: Transmit power to use for the 20-dBm PA; //!< overrides the one given in radio setup for the duration of the command.
//!< If tx20Power >= 0x10000000: Pointer to PA change override structure @@ -938,12 +934,11 @@ struct __RFC_STRUCT rfc_CMD_BLE5_ADV_EXT_s { uint8_t rangeDelay; //!< Number of RAT ticks to add to the listening time after T_IFS uint16_t txPower; //!< \brief Transmit power to use (overrides the one given in radio setup)
//!< 0x0000: Use default TX power
- //!< 0xFFFF: Use field tx20Power to set power for 20-dBm PA or to switch PA - //!< (command structure that includes tx20Power must be used; patch - //!< required) + //!< 0xFFFF: 20-dBm PA only: Use TX power from tx20Power field (command + //!< structure that includes tx20Power must be used) rfc_ble5AdvExtPar_t *pParams; //!< Pointer to command specific parameter structure rfc_bleAdvOutput_t *pOutput; //!< Pointer to command specific output structure - uint32_t tx20Power; //!< \brief If txPower = 0xFFFF (patch required):
+ uint32_t tx20Power; //!< \brief If txPower = 0xFFFF:
//!< If tx20Power < 0x10000000: Transmit power to use for the 20-dBm PA; //!< overrides the one given in radio setup for the duration of the command.
//!< If tx20Power >= 0x10000000: Pointer to PA change override structure @@ -1001,12 +996,11 @@ struct __RFC_STRUCT rfc_CMD_BLE5_ADV_AUX_s { uint8_t rangeDelay; //!< Number of RAT ticks to add to the listening time after T_IFS uint16_t txPower; //!< \brief Transmit power to use (overrides the one given in radio setup)
//!< 0x0000: Use default TX power
- //!< 0xFFFF: Use field tx20Power to set power for 20-dBm PA or to switch PA - //!< (command structure that includes tx20Power must be used; patch - //!< required) + //!< 0xFFFF: 20-dBm PA only: Use TX power from tx20Power field (command + //!< structure that includes tx20Power must be used) rfc_ble5AdvAuxPar_t *pParams; //!< Pointer to command specific parameter structure rfc_bleAdvOutput_t *pOutput; //!< Pointer to command specific output structure - uint32_t tx20Power; //!< \brief If txPower = 0xFFFF (patch required):
+ uint32_t tx20Power; //!< \brief If txPower = 0xFFFF:
//!< If tx20Power < 0x10000000: Transmit power to use for the 20-dBm PA; //!< overrides the one given in radio setup for the duration of the command.
//!< If tx20Power >= 0x10000000: Pointer to PA change override structure @@ -1064,12 +1058,11 @@ struct __RFC_STRUCT rfc_CMD_BLE5_SCANNER_s { uint8_t rangeDelay; //!< Number of RAT ticks to add to the listening time after T_IFS uint16_t txPower; //!< \brief Transmit power to use (overrides the one given in radio setup)
//!< 0x0000: Use default TX power
- //!< 0xFFFF: Use field tx20Power to set power for 20-dBm PA or to switch PA - //!< (command structure that includes tx20Power must be used; patch - //!< required) + //!< 0xFFFF: 20-dBm PA only: Use TX power from tx20Power field (command + //!< structure that includes tx20Power must be used) rfc_ble5ScannerPar_t *pParams; //!< Pointer to command specific parameter structure rfc_ble5ScanInitOutput_t *pOutput; //!< Pointer to command specific output structure - uint32_t tx20Power; //!< \brief If txPower = 0xFFFF (patch required):
+ uint32_t tx20Power; //!< \brief If txPower = 0xFFFF:
//!< If tx20Power < 0x10000000: Transmit power to use for the 20-dBm PA; //!< overrides the one given in radio setup for the duration of the command.
//!< If tx20Power >= 0x10000000: Pointer to PA change override structure @@ -1127,12 +1120,11 @@ struct __RFC_STRUCT rfc_CMD_BLE5_INITIATOR_s { uint8_t rangeDelay; //!< Number of RAT ticks to add to the listening time after T_IFS uint16_t txPower; //!< \brief Transmit power to use (overrides the one given in radio setup)
//!< 0x0000: Use default TX power
- //!< 0xFFFF: Use field tx20Power to set power for 20-dBm PA or to switch PA - //!< (command structure that includes tx20Power must be used; patch - //!< required) + //!< 0xFFFF: 20-dBm PA only: Use TX power from tx20Power field (command + //!< structure that includes tx20Power must be used) rfc_ble5InitiatorPar_t *pParams; //!< Pointer to command specific parameter structure rfc_ble5ScanInitOutput_t *pOutput; //!< Pointer to command specific output structure - uint32_t tx20Power; //!< \brief If txPower = 0xFFFF (patch required):
+ uint32_t tx20Power; //!< \brief If txPower = 0xFFFF:
//!< If tx20Power < 0x10000000: Transmit power to use for the 20-dBm PA; //!< overrides the one given in radio setup for the duration of the command.
//!< If tx20Power >= 0x10000000: Pointer to PA change override structure @@ -1190,12 +1182,11 @@ struct __RFC_STRUCT rfc_CMD_BLE5_GENERIC_RX_s { uint8_t rangeDelay; //!< Number of RAT ticks to add to the listening time after T_IFS uint16_t txPower; //!< \brief Transmit power to use (overrides the one given in radio setup)
//!< 0x0000: Use default TX power
- //!< 0xFFFF: Use field tx20Power to set power for 20-dBm PA or to switch PA - //!< (command structure that includes tx20Power must be used; patch - //!< required) + //!< 0xFFFF: 20-dBm PA only: Use TX power from tx20Power field (command + //!< structure that includes tx20Power must be used) rfc_bleGenericRxPar_t *pParams; //!< Pointer to command specific parameter structure rfc_bleGenericRxOutput_t *pOutput; //!< Pointer to command specific output structure - uint32_t tx20Power; //!< \brief If txPower = 0xFFFF (patch required):
+ uint32_t tx20Power; //!< \brief If txPower = 0xFFFF:
//!< If tx20Power < 0x10000000: Transmit power to use for the 20-dBm PA; //!< overrides the one given in radio setup for the duration of the command.
//!< If tx20Power >= 0x10000000: Pointer to PA change override structure @@ -1253,12 +1244,11 @@ struct __RFC_STRUCT rfc_CMD_BLE5_TX_TEST_s { uint8_t rangeDelay; //!< Number of RAT ticks to add to the listening time after T_IFS uint16_t txPower; //!< \brief Transmit power to use (overrides the one given in radio setup)
//!< 0x0000: Use default TX power
- //!< 0xFFFF: Use field tx20Power to set power for 20-dBm PA or to switch PA - //!< (command structure that includes tx20Power must be used; patch - //!< required) + //!< 0xFFFF: 20-dBm PA only: Use TX power from tx20Power field (command + //!< structure that includes tx20Power must be used) rfc_bleTxTestPar_t *pParams; //!< Pointer to command specific parameter structure rfc_bleTxTestOutput_t *pOutput; //!< Pointer to command specific output structure - uint32_t tx20Power; //!< \brief If txPower = 0xFFFF (patch required):
+ uint32_t tx20Power; //!< \brief If txPower = 0xFFFF:
//!< If tx20Power < 0x10000000: Transmit power to use for the 20-dBm PA; //!< overrides the one given in radio setup for the duration of the command.
//!< If tx20Power >= 0x10000000: Pointer to PA change override structure @@ -1316,12 +1306,11 @@ struct __RFC_STRUCT rfc_CMD_BLE5_ADV_s { uint8_t rangeDelay; //!< Number of RAT ticks to add to the listening time after T_IFS uint16_t txPower; //!< \brief Transmit power to use (overrides the one given in radio setup)
//!< 0x0000: Use default TX power
- //!< 0xFFFF: Use field tx20Power to set power for 20-dBm PA or to switch PA - //!< (command structure that includes tx20Power must be used; patch - //!< required) + //!< 0xFFFF: 20-dBm PA only: Use TX power from tx20Power field (command + //!< structure that includes tx20Power must be used) rfc_bleAdvPar_t *pParams; //!< Pointer to command specific parameter structure rfc_bleAdvOutput_t *pOutput; //!< Pointer to command specific output structure - uint32_t tx20Power; //!< \brief If txPower = 0xFFFF (patch required):
+ uint32_t tx20Power; //!< \brief If txPower = 0xFFFF:
//!< If tx20Power < 0x10000000: Transmit power to use for the 20-dBm PA; //!< overrides the one given in radio setup for the duration of the command.
//!< If tx20Power >= 0x10000000: Pointer to PA change override structure @@ -1379,12 +1368,11 @@ struct __RFC_STRUCT rfc_CMD_BLE5_ADV_DIR_s { uint8_t rangeDelay; //!< Number of RAT ticks to add to the listening time after T_IFS uint16_t txPower; //!< \brief Transmit power to use (overrides the one given in radio setup)
//!< 0x0000: Use default TX power
- //!< 0xFFFF: Use field tx20Power to set power for 20-dBm PA or to switch PA - //!< (command structure that includes tx20Power must be used; patch - //!< required) + //!< 0xFFFF: 20-dBm PA only: Use TX power from tx20Power field (command + //!< structure that includes tx20Power must be used) rfc_bleAdvPar_t *pParams; //!< Pointer to command specific parameter structure rfc_bleAdvOutput_t *pOutput; //!< Pointer to command specific output structure - uint32_t tx20Power; //!< \brief If txPower = 0xFFFF (patch required):
+ uint32_t tx20Power; //!< \brief If txPower = 0xFFFF:
//!< If tx20Power < 0x10000000: Transmit power to use for the 20-dBm PA; //!< overrides the one given in radio setup for the duration of the command.
//!< If tx20Power >= 0x10000000: Pointer to PA change override structure @@ -1442,12 +1430,11 @@ struct __RFC_STRUCT rfc_CMD_BLE5_ADV_NC_s { uint8_t rangeDelay; //!< Number of RAT ticks to add to the listening time after T_IFS uint16_t txPower; //!< \brief Transmit power to use (overrides the one given in radio setup)
//!< 0x0000: Use default TX power
- //!< 0xFFFF: Use field tx20Power to set power for 20-dBm PA or to switch PA - //!< (command structure that includes tx20Power must be used; patch - //!< required) + //!< 0xFFFF: 20-dBm PA only: Use TX power from tx20Power field (command + //!< structure that includes tx20Power must be used) rfc_bleAdvPar_t *pParams; //!< Pointer to command specific parameter structure rfc_bleAdvOutput_t *pOutput; //!< Pointer to command specific output structure - uint32_t tx20Power; //!< \brief If txPower = 0xFFFF (patch required):
+ uint32_t tx20Power; //!< \brief If txPower = 0xFFFF:
//!< If tx20Power < 0x10000000: Transmit power to use for the 20-dBm PA; //!< overrides the one given in radio setup for the duration of the command.
//!< If tx20Power >= 0x10000000: Pointer to PA change override structure @@ -1505,12 +1492,11 @@ struct __RFC_STRUCT rfc_CMD_BLE5_ADV_SCAN_s { uint8_t rangeDelay; //!< Number of RAT ticks to add to the listening time after T_IFS uint16_t txPower; //!< \brief Transmit power to use (overrides the one given in radio setup)
//!< 0x0000: Use default TX power
- //!< 0xFFFF: Use field tx20Power to set power for 20-dBm PA or to switch PA - //!< (command structure that includes tx20Power must be used; patch - //!< required) + //!< 0xFFFF: 20-dBm PA only: Use TX power from tx20Power field (command + //!< structure that includes tx20Power must be used) rfc_bleAdvPar_t *pParams; //!< Pointer to command specific parameter structure rfc_bleAdvOutput_t *pOutput; //!< Pointer to command specific output structure - uint32_t tx20Power; //!< \brief If txPower = 0xFFFF (patch required):
+ uint32_t tx20Power; //!< \brief If txPower = 0xFFFF:
//!< If tx20Power < 0x10000000: Transmit power to use for the 20-dBm PA; //!< overrides the one given in radio setup for the duration of the command.
//!< If tx20Power >= 0x10000000: Pointer to PA change override structure @@ -1760,9 +1746,9 @@ struct __RFC_STRUCT rfc_bleAdvPar_s { uint8_t bStrictLenFilter:1; //!< \brief 0: Accept any packet with a valid advertising packet length
//!< 1: Discard messages with illegal length for the given packet type uint8_t chSel:1; //!< \brief 0: Do not report support of Channel Selection Algorithm #2
- //!< 1: Report support of Channel Selection Algorithm #2 (patch required) - uint8_t privIgnMode:1; //!< \brief 0: Filter on bPrivIgn only when white list is used (if patch is used) - //!< 1: Filter on bPrivIgn always (patch required) + //!< 1: Report support of Channel Selection Algorithm #2 + uint8_t privIgnMode:1; //!< \brief 0: Filter on bPrivIgn only when white list is used + //!< 1: Filter on bPrivIgn always uint8_t rpaMode:1; //!< \brief Resolvable private address mode
//!< 0: Normal operation
//!< 1: Use white list for a received RPA regardless of filter policy @@ -1777,7 +1763,12 @@ struct __RFC_STRUCT rfc_bleAdvPar_s { rfc_bleWhiteListEntry_t *pWhiteList; //!< \brief Pointer (with least significant bit set to 0) to white list or peer address (directed //!< advertiser). If least significant bit is 1, the address type given by //!< advConfig.peerAddrType is inverted. - uint16_t __dummy0; + struct { + uint8_t scanRspEndType:1; //!< \brief Command status at end if SCAN_RSP was sent:
+ //!< 0: End with BLE_DONE_OK and result True
+ //!< 1: End with BLE_DONE_SCAN_RSP and result False + } behConfig; + uint8_t __dummy0; uint8_t __dummy1; struct { uint8_t triggerType:4; //!< The type of trigger @@ -1897,7 +1888,7 @@ struct __RFC_STRUCT rfc_bleInitiatorPar_s { uint8_t bStrictLenFilter:1; //!< \brief 0: Accept any packet with a valid advertising packet length
//!< 1: Discard messages with illegal length for the given packet type uint8_t chSel:1; //!< \brief 0: Do not report support of Channel Selection Algorithm #2
- //!< 1: Report support of Channel Selection Algorithm #2 (patch required) + //!< 1: Report support of Channel Selection Algorithm #2 } initConfig; uint8_t __dummy0; uint8_t connectReqLen; //!< Size of connect request data @@ -2171,13 +2162,17 @@ struct __RFC_STRUCT rfc_ble5AdvAuxPar_s { //!< 1: Discard messages with illegal length for the given packet type uint8_t bDirected:1; //!< \brief 0: Advertiser is undirected: pWhiteList points to a white list //!< 1: Advertiser is directed: pWhiteList points to a single device address - uint8_t privIgnMode:1; //!< \brief 0: Filter on bPrivIgn only when white list is used (if patch is used) - //!< 1: Filter on bPrivIgn always (patch required) + uint8_t privIgnMode:1; //!< \brief 0: Filter on bPrivIgn only when white list is used + //!< 1: Filter on bPrivIgn always uint8_t rpaMode:1; //!< \brief Resolvable private address mode
//!< 0: Normal operation
//!< 1: Use white list for a received RPA regardless of filter policy } advConfig; - uint8_t __dummy0; + struct { + uint8_t scanRspEndType:1; //!< \brief Command status at end if AUX_SCAN_RSP was sent:
+ //!< 0: End with BLE_DONE_OK and result True
+ //!< 1: End with BLE_DONE_SCAN_RSP and result False + } behConfig; uint8_t auxPtrTargetType; //!< \brief Number indicating reference for auxPtrTargetTime. Takes same values as trigger types, //!< but only TRIG_ABSTIME and TRIG_REL_* are allowed ratmr_t auxPtrTargetTime; //!< Time of start of packet to which auxPtr points @@ -2258,14 +2253,41 @@ struct __RFC_STRUCT rfc_ble5ScannerPar_s { struct { uint8_t bCheckAdi:1; //!< \brief 0: Do not perform ADI filtering
//!< 1: Perform ADI filtering on packets where ADI is present - uint8_t bAutoAdiUpdate:1; //!< \brief 0: Do not update ADI entries in radio CPU
- //!< 1: Automatically update ADI entry for received packets with AuxPtr - uint8_t bApplyDuplicateFiltering:1;//!< \brief 0: Do not apply duplicate filtering based on device address for extended advertiser packets
- //!< 1: Apply duplicate filtering based on device address for extended advertiser packets with no ADI field + uint8_t bAutoAdiUpdate:1; //!< \brief 0: Do not update ADI entries in radio CPU using legacy mode (recommended)
+ //!< 1: Legacy mode: Automatically update ADI entry for received packets with + //!< AdvDataInfo after first occurrence + uint8_t bApplyDuplicateFiltering:1;//!< \brief 0: Do not apply duplicate filtering based on device address for extended + //!< advertiser packets (recommended)
+ //!< 1: Apply duplicate filtering based on device address for extended advertiser + //!< packets with no ADI field uint8_t bAutoWlIgnore:1; //!< \brief 0: Do not set ignore bit in white list from radio CPU for extended advertising packets
//!< 1: Automatically set ignore bit in white list for extended advertising packets + uint8_t bAutoAdiProcess:1; //!< \brief 0: Do not use automatic ADI processing
+ //!< 1: Automatically update ADI entry for received packets so that only the same + //!< ADI is accepted for the rest of the chain and the SID/DID combination is + //!< ignored after the entire chain is received. + uint8_t bExclusiveSid:1; //!< \brief 0: Set adiStatus.state to 0 when command starts so that all + //!< valid SIDs are accepted
+ //!< 1: Do not modify adiStatus.state when command starts
} extFilterConfig; - uint32_t __dummy0; + struct { + uint8_t lastAcceptedSid:4; //!< Indication of SID of last successfully received packet that was not ignored + uint8_t state:3; //!< \brief 0: No extended packet received, or last extended packet didn't have an ADI; + //!< lastAcceptedSid field is not valid
+ //!< 1: A message with ADI has been received, but no chain is under reception; + //!< ADI filtering to be performed normally
+ //!< 2: A message with SID as given in lastAcceptedSid has been + //!< received, and chained messages are still pending. Messages without this + //!< SID will be ignored
+ //!< 3: An AUX_SCAN_RSP message has been received after receiving messages with SID + //!< as given in lastAcceptedSid, and chained messages are + //!< pending. Messages with an ADI field will be ignored.
+ //!< 4: A message with no ADI has been received, and chained messages are still + //!< pending. Messages with an ADI field will be ignored.
+ //!< Others: Reserved + } adiStatus; + uint8_t __dummy0; + uint16_t __dummy1; uint16_t* pDeviceAddress; //!< \brief Pointer (with least significant bit set to 0) to device address used for this device. //!< If least significant bit is 1, the address type given by //!< scanConfig.deviceAddrType is inverted. @@ -2332,7 +2354,7 @@ struct __RFC_STRUCT rfc_ble5InitiatorPar_s { uint8_t bStrictLenFilter:1; //!< \brief 0: Accept any packet with a valid advertising packet length
//!< 1: Discard messages with illegal length for the given packet type uint8_t chSel:1; //!< \brief 0: Do not report support of Channel Selection Algorithm #2 in CONNECT_IND
- //!< 1: Report support of Channel Selection Algorithm #2 in CONNECT_IND (patch required) + //!< 1: Report support of Channel Selection Algorithm #2 in CONNECT_IND } initConfig; uint16_t randomState; //!< State for pseudo-random number generation used in backoff procedure uint16_t backoffCount; //!< Parameter backoffCount used in backoff procedure, cf. Bluetooth spec diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_ble_mailbox.h b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_ble_mailbox.h index 66bf7c208..b43d0993d 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_ble_mailbox.h +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_ble_mailbox.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: rf_ble_mailbox.h -* Revised: 2018-01-23 19:51:42 +0100 (Tue, 23 Jan 2018) -* Revision: 18189 +* Revised: 2018-01-15 15:58:36 +0100 (Mon, 15 Jan 2018) +* Revision: 18171 * * Description: Definitions for BLE interface * @@ -54,6 +54,7 @@ #define BLE_DONE_STOPPED 0x1408 ///< Operation stopped after stop command #define BLE_DONE_AUX 0x1409 ///< Operation ended after following aux pointer pointing far ahead #define BLE_DONE_CONNECT_CHSEL0 0x140A ///< CONNECT_IND received or transmitted; peer does not support channel selection algorithm #2 +#define BLE_DONE_SCAN_RSP 0x140B ///< SCAN_RSP or AUX_SCAN_RSP transmitted ///@} /// \name Operation finished with error ///@{ diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_common_cmd.h b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_common_cmd.h index 5bf60b069..b479f8883 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_common_cmd.h +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_common_cmd.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: rf_common_cmd.h -* Revised: 2018-05-07 15:02:01 +0200 (Mon, 07 May 2018) -* Revision: 18438 +* Revised: 2018-11-02 11:52:02 +0100 (Fri, 02 Nov 2018) +* Revision: 18756 * * Description: CC13x2/CC26x2 API for common/generic commands * @@ -103,9 +103,11 @@ typedef struct __RFC_STRUCT rfc_CMD_DISARM_RAT_CH_s rfc_CMD_DISARM_RAT_CH_t; typedef struct __RFC_STRUCT rfc_CMD_SET_TX_POWER_s rfc_CMD_SET_TX_POWER_t; typedef struct __RFC_STRUCT rfc_CMD_SET_TX20_POWER_s rfc_CMD_SET_TX20_POWER_t; typedef struct __RFC_STRUCT rfc_CMD_CHANGE_PA_s rfc_CMD_CHANGE_PA_t; +typedef struct __RFC_STRUCT rfc_CMD_UPDATE_HPOSC_FREQ_s rfc_CMD_UPDATE_HPOSC_FREQ_t; typedef struct __RFC_STRUCT rfc_CMD_UPDATE_FS_s rfc_CMD_UPDATE_FS_t; typedef struct __RFC_STRUCT rfc_CMD_MODIFY_FS_s rfc_CMD_MODIFY_FS_t; typedef struct __RFC_STRUCT rfc_CMD_BUS_REQUEST_s rfc_CMD_BUS_REQUEST_t; +typedef struct __RFC_STRUCT rfc_CMD_SET_CMD_START_IRQ_s rfc_CMD_SET_CMD_START_IRQ_t; //! \addtogroup command //! @{ @@ -256,7 +258,7 @@ struct __RFC_STRUCT rfc_CMD_FS_s { uint8_t bTxMode:1; //!< \brief 0: Start synth in RX mode
//!< 1: Start synth in TX mode uint8_t refFreq:6; //!< \brief 0: Use default reference frequency
- //!< Others: Use reference frequency 24 MHz/refFreq + //!< Others: Use reference frequency 48 MHz/refFreq } synthConf; uint8_t __dummy0; //!< Reserved, always write 0 uint8_t __dummy1; //!< Reserved @@ -1020,6 +1022,17 @@ struct __RFC_STRUCT rfc_CMD_CHANGE_PA_s { //! @} +//! \addtogroup CMD_UPDATE_HPOSC_FREQ +//! @{ +#define CMD_UPDATE_HPOSC_FREQ 0x0608 +//! Set New Frequency Offset for HPOSC +struct __RFC_STRUCT rfc_CMD_UPDATE_HPOSC_FREQ_s { + uint16_t commandNo; //!< The command ID number 0x0608 + int16_t freqOffset; //!< Relative frequency offset, signed, scaled by 2-22 +} __RFC_STRUCT_ATTR; + +//! @} + //! \addtogroup CMD_UPDATE_FS //! @{ #define CMD_UPDATE_FS 0x0011 @@ -1060,6 +1073,17 @@ struct __RFC_STRUCT rfc_CMD_BUS_REQUEST_s { //! @} +//! \addtogroup CMD_SET_CMD_START_IRQ +//! @{ +#define CMD_SET_CMD_START_IRQ 0x0411 +//! Enable or disable generation of IRQ when a radio operation command starts +struct __RFC_STRUCT rfc_CMD_SET_CMD_START_IRQ_s { + uint16_t commandNo; //!< The command ID number 0x0411 + uint8_t bEna; //!< 1 to enable interrupt generation; 0 to disable it +} __RFC_STRUCT_ATTR; + +//! @} + //! @} //! @} #endif diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_data_entry.h b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_data_entry.h index a8a2031ff..c79465c4f 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_data_entry.h +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_data_entry.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: rf_data_entry.h -* Revised: 2017-11-10 10:42:47 +0100 (Fri, 10 Nov 2017) -* Revision: 18052 +* Revised: 2018-01-15 06:15:14 +0100 (Mon, 15 Jan 2018) +* Revision: 18170 * * Description: Definition of API for data exchange * diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_hs_cmd.h b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_hs_cmd.h index 90345694e..e681acc04 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_hs_cmd.h +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_hs_cmd.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: rf_hs_cmd.h -* Revised: 2017-11-10 10:42:47 +0100 (Fri, 10 Nov 2017) -* Revision: 18052 +* Revised: 2018-01-15 06:15:14 +0100 (Mon, 15 Jan 2018) +* Revision: 18170 * * Description: CC13x2/CC26x2 API for high-speed mode commands * diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_hs_mailbox.h b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_hs_mailbox.h index f112d4f57..e1fb7a05c 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_hs_mailbox.h +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_hs_mailbox.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: rf_hs_mailbox.h -* Revised: 2017-11-03 15:06:37 +0100 (Fri, 03 Nov 2017) -* Revision: 18032 +* Revised: 2018-01-15 15:58:36 +0100 (Mon, 15 Jan 2018) +* Revision: 18171 * * Description: Definitions for high-speed mode radio interface * diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_ieee_cmd.h b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_ieee_cmd.h index fa54308c7..f33facdfe 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_ieee_cmd.h +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_ieee_cmd.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: rf_ieee_cmd.h -* Revised: 2017-11-10 10:42:47 +0100 (Fri, 10 Nov 2017) -* Revision: 18052 +* Revised: 2018-01-15 06:15:14 +0100 (Mon, 15 Jan 2018) +* Revision: 18170 * * Description: CC13x2/CC26x2 API for IEEE 802.15.4 commands * diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_mailbox.h b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_mailbox.h index 48af9ab12..a23d71ad0 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_mailbox.h +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_mailbox.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: rf_mailbox.h -* Revised: 2018-05-07 15:02:01 +0200 (Mon, 07 May 2018) -* Revision: 18438 +* Revised: 2018-11-02 11:52:02 +0100 (Fri, 02 Nov 2018) +* Revision: 18756 * * Description: Definitions for interface between system and radio CPU * @@ -83,6 +83,8 @@ typedef struct { #define IRQN_TX_RETRANS 9 ///< Packet retransmitted #define IRQN_TX_ENTRY_DONE 10 ///< Tx queue data entry state changed to Finished #define IRQN_TX_BUFFER_CHANGED 11 ///< A buffer change is complete +#define IRQN_COMMAND_STARTED 12 ///< A radio operation command has gone into active state +#define IRQN_FG_COMMAND_STARTED 13 ///< FG level radio operation command has gone into active state #define IRQN_PA_CHANGED 14 ///< PA is changed #define IRQN_RX_OK 16 ///< Packet received with CRC OK, payload, and not to be ignored #define IRQN_RX_NOK 17 ///< Packet received with CRC error @@ -117,6 +119,8 @@ typedef struct { #define IRQ_TX_ENTRY_DONE (1U << IRQN_TX_ENTRY_DONE) #define IRQ_TX_BUFFER_CHANGED (1U << IRQN_TX_BUFFER_CHANGED) +#define IRQ_COMMAND_STARTED (1U << IRQN_COMMAND_STARTED) +#define IRQ_FG_COMMAND_STARTED (1U << IRQN_FG_COMMAND_STARTED) #define IRQ_PA_CHANGED (1U << IRQN_PA_CHANGED) #define IRQ_RX_OK (1U << IRQN_RX_OK) @@ -301,13 +305,19 @@ typedef struct { (((_POSITION_##cmd##_##field) + ((offset) << 1)) << 4) | ((uint32_t)(val) << 16)) /// 8-bit SW register as defined in radio_par_def.txt #define SW_REG_BYTE_OVERRIDE(cmd, field, val) (0x8003 | ((_POSITION_##cmd##_##field) << 4) | \ -((uint32_t)(val) << 16)) +(((uint32_t)(val) & 0xFF) << 16)) /// Two 8-bit SW registers as defined in radio_par_def.txt; the one given by field and the next byte. #define SW_REG_2BYTE_OVERRIDE(cmd, field, val0, val1) (3 | (((_POSITION_##cmd##_##field) & 0xFFFE) << 4) | \ (((uint32_t)(val0) << 16) & 0x00FF0000) | ((uint32_t)(val1) << 24)) +#define SW_REG_MASK_OVERRIDE(cmd, field, offset, mask, val) (0x8003 | \ +((_POSITION_##cmd##_##field + (offset)) << 4) | (((uint32_t)(val) & 0xFF) << 16) | (((uint32_t)(mask) & 0xFF) << 24)) + #define HW16_ARRAY_OVERRIDE(addr, length) (1 | (((uintptr_t) (addr)) & 0xFFFC) | ((uint32_t)(length) << 16)) #define HW32_ARRAY_OVERRIDE(addr, length) (1 | (((uintptr_t) (addr)) & 0xFFFC) | \ ((uint32_t)(length) << 16) | (1U << 30)) +#define HW16_MASK_ARRAY_OVERRIDE(addr, length) (0x20000001 | (((uintptr_t) (addr)) & 0xFFFC) | ((uint32_t)(length) << 16)) +#define HW32_MASK_ARRAY_OVERRIDE(addr, length) (0x60000001 | (((uintptr_t) (addr)) & 0xFFFC) | ((uint32_t)(length) << 16)) +#define HW16_MASK_VAL(mask, val) ((mask) << 16 | (val)) #define ADI_ARRAY_OVERRIDE(adiNo, addr, bHalfSize, length) (1 | ((((addr) & 0x3F) << 2)) | \ ((!!(bHalfSize)) << 8) | ((!!(adiNo)) << 9) | ((uint32_t)(length) << 16) | (2U << 30)) #define SW_ARRAY_OVERRIDE(cmd, firstfield, length) (1 | (((_POSITION_##cmd##_##firstfield)) << 2) | \ @@ -317,10 +327,15 @@ typedef struct { ((mceCfg & 1) << 6) | (((mceRomBank) & 0x0F) << 7) | \ ((rfeCfg & 1) << 11) | (((rfeRomBank) & 0x0F) << 12) | \ (((mceMode) & 0x00FF) << 16) | (((rfeMode) & 0x00FF) << 24)) -#define CENTER_FREQ_OVERRIDE(centerFreq, flags) (0x001B | ((flags & 0x07) << 9) | \ - ((((((12 * 24) << 20) / ((uint32_t) centerFreq)) + 1) / 2) << 12)) +#define HPOSC_OVERRIDE(freqOffset) (0x000B | ((freqOffset) << 16)) #define TX20_POWER_OVERRIDE(tx20Power) (0x002B | (((uint32_t) tx20Power) << 10)) #define TX_STD_POWER_OVERRIDE(txPower) (0x022B | (((uint32_t) txPower) << 10)) +#define MCE_RFE_SPLIT_OVERRIDE(mceRxCfg, mceTxCfg, rfeRxCfg, rfeTxCfg) \ + (0x003B | ((mceRxCfg) << 12) | ((mceTxCfg) << 17) | ((rfeRxCfg) << 22) | ((rfeTxCfg) << 27)) +#define CENTER_FREQ_OVERRIDE(centerFreq, flags) (0x004B | ((flags & 0x03) << 18) | \ + ((centerFreq) << 20)) +#define MOD_TYPE_OVERRIDE(modType, deviation, stepSz, flags) (0x005B | ((flags & 0x01) << 15) | \ + ((modType) << 16) | ((deviation) << 19) |((stepSz) << 30) ) #define NEW_OVERRIDE_SEGMENT(address) (((((uintptr_t)(address)) & 0x03FFFFFC) << 6) | 0x000F | \ (((((uintptr_t)(address) >> 24) == 0x20) ? 0x01 : \ (((uintptr_t)(address) >> 24) == 0x21) ? 0x02 : \ diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_prop_cmd.h b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_prop_cmd.h index ba069f975..6dbccd655 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_prop_cmd.h +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_prop_cmd.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: rf_prop_cmd.h -* Revised: 2018-05-07 15:02:01 +0200 (Mon, 07 May 2018) -* Revision: 18438 +* Revised: 2018-07-31 20:13:42 +0200 (Tue, 31 Jul 2018) +* Revision: 18572 * * Description: CC13x2/CC26x2 API for Proprietary mode commands * diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_prop_mailbox.h b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_prop_mailbox.h index bb8c541e0..6819d8c8c 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_prop_mailbox.h +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rf_prop_mailbox.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: rf_prop_mailbox.h -* Revised: 2017-11-03 15:06:37 +0100 (Fri, 03 Nov 2017) -* Revision: 18032 +* Revised: 2018-01-15 15:58:36 +0100 (Mon, 15 Jan 2018) +* Revision: 18171 * * Description: Definitions for proprietary mode radio interface * diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rfc.c b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rfc.c index 14db54f3a..474768506 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rfc.c +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rfc.c @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: rfc.c -* Revised: 2018-01-30 17:42:58 +0100 (Tue, 30 Jan 2018) -* Revision: 51371 +* Revised: 2018-08-08 11:04:37 +0200 (Wed, 08 Aug 2018) +* Revision: 52334 * * Description: Driver for the RF Core. * @@ -61,9 +61,10 @@ #define RFCOverrideUpdate NOROM_RFCOverrideUpdate #undef RFCHwIntGetAndClear #define RFCHwIntGetAndClear NOROM_RFCHwIntGetAndClear + #undef RFCAnaDivTxOverride + #define RFCAnaDivTxOverride NOROM_RFCAnaDivTxOverride #endif - // Function is not complete //***************************************************************************** // @@ -144,7 +145,8 @@ RFCSynthPowerDown(void) // Reset previously patched CPE RAM to a state where it can be patched again // //***************************************************************************** -void RFCCpePatchReset(void) +void +RFCCpePatchReset(void) { // Function is not complete } @@ -174,15 +176,74 @@ RFCOverrideSearch(const uint32_t *pOverride, const uint32_t pattern, const uint3 return 0xFF; } +//***************************************************************************** +// +// Function to calculate the proper override run-time for the High Gain PA. +// +//***************************************************************************** +uint32_t +RFCAnaDivTxOverride(uint8_t loDivider, uint8_t frontEndMode) +{ + uint16_t fsOnly; + uint16_t txSetting; + + switch (loDivider) + { + case 0: fsOnly = 0x0502; + break; + case 2: + fsOnly = 0x0102; + break; + case 4: + case 6: + case 12: + fsOnly = 0xF101; + break; + case 5: + case 10: + case 15: + case 30: + fsOnly = 0x1101; + break; + default: + // Error, should not occur! + fsOnly = 0; + break; + } + + if (frontEndMode == 255) + { + // Special value meaning 20 dBm PA + txSetting = (fsOnly | 0x00C0) & ~0x0400; + } + else if (frontEndMode == 0) + { + // Differential + txSetting = fsOnly | 0x0030; + } + else if (frontEndMode & 1) + { + // Single ended on RFP + txSetting = fsOnly | 0x0010; + } + else + { + // Single ended on RFN + txSetting = fsOnly | 0x0020; + } + + return ((((uint32_t) txSetting) << 16) | RFC_FE_OVERRIDE_ADDRESS); +} //***************************************************************************** // // Update the override list based on values stored in FCFG1 // //***************************************************************************** -uint8_t RFCOverrideUpdate(rfc_radioOp_t *pOpSetup, uint32_t *pParams) +uint8_t +RFCOverrideUpdate(rfc_radioOp_t *pOpSetup, uint32_t *pParams) { - // Function is not complete + // Function is left blank for compatibility reasons. return 0; } @@ -227,6 +288,8 @@ RFCHwIntGetAndClear(uint32_t ui32Mask) #define RFCOverrideUpdate NOROM_RFCOverrideUpdate #undef RFCHwIntGetAndClear #define RFCHwIntGetAndClear NOROM_RFCHwIntGetAndClear + #undef RFCAnaDivTxOverride + #define RFCAnaDivTxOverride NOROM_RFCAnaDivTxOverride #endif // See rfc.h for implementation diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rfc.h b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rfc.h index 45c8717ba..00d8f188c 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rfc.h +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rfc.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: rfc.h -* Revised: 2018-04-25 22:52:33 +0200 (Wed, 25 Apr 2018) -* Revision: 51935 +* Revised: 2018-08-08 14:03:25 +0200 (Wed, 08 Aug 2018) +* Revision: 52338 * * Description: Defines and prototypes for the RF Core. * @@ -63,12 +63,12 @@ extern "C" #include "../inc/hw_memmap.h" #include "../inc/hw_rfc_pwr.h" #include "../inc/hw_rfc_dbell.h" -#include "rf_common_cmd.h" -#include "rf_prop_cmd.h" -#include "rf_ble_cmd.h" #include "../inc/hw_fcfg1.h" #include "../inc/hw_adi_3_refsys.h" #include "../inc/hw_adi.h" +#include "rf_common_cmd.h" +#include "rf_prop_cmd.h" +#include "rf_ble_cmd.h" // Definition of RFTRIM container typedef struct { @@ -79,11 +79,14 @@ typedef struct { } rfTrim_t; // Definition of maximum search depth used by the RFCOverrideUpdate function -#define RFC_MAX_SEARCH_DEPTH 5 -#define RFC_PA_TYPE_ADDRESS 0x21000345 -#define RFC_PA_TYPE_MASK 0x04 -#define RFC_PA_GAIN_ADDRESS 0x2100034C -#define RFC_PA_GAIN_MASK 0x003FFFFF +#define RFC_MAX_SEARCH_DEPTH 5 +#define RFC_PA_TYPE_ADDRESS 0x21000345 +#define RFC_PA_TYPE_MASK 0x04 +#define RFC_PA_GAIN_ADDRESS 0x2100034C +#define RFC_PA_GAIN_MASK 0x003FFFFF +#define RFC_FE_MODE_ESCAPE_VALUE 0xFF +#define RFC_FE_OVERRIDE_ADDRESS 0x0703 +#define RFC_FE_OVERRIDE_MASK 0x0000FFFF //***************************************************************************** // @@ -106,6 +109,7 @@ typedef struct { #define RFCOverrideSearch NOROM_RFCOverrideSearch #define RFCOverrideUpdate NOROM_RFCOverrideUpdate #define RFCHwIntGetAndClear NOROM_RFCHwIntGetAndClear + #define RFCAnaDivTxOverride NOROM_RFCAnaDivTxOverride #endif //***************************************************************************** @@ -392,6 +396,14 @@ RFCGetPaGain(void) } +//***************************************************************************** +// +//! Function to calculate the proper override run-time for the High Gain PA. +// +//***************************************************************************** +extern uint32_t RFCAnaDivTxOverride(uint8_t loDivider, uint8_t frontEndMode); + + //***************************************************************************** // // Support for DriverLib in ROM: @@ -428,6 +440,10 @@ RFCGetPaGain(void) #undef RFCHwIntGetAndClear #define RFCHwIntGetAndClear ROM_RFCHwIntGetAndClear #endif + #ifdef ROM_RFCAnaDivTxOverride + #undef RFCAnaDivTxOverride + #define RFCAnaDivTxOverride ROM_RFCAnaDivTxOverride + #endif #endif //***************************************************************************** diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rom.h b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rom.h index 9dd309b6a..fc79556d7 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rom.h +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rom.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: rom.h -* Revised: 2016-10-06 17:21:09 +0200 (Thu, 06 Oct 2016) -* Revision: 47343 +* Revised: 2018-11-02 13:54:49 +0100 (Fri, 02 Nov 2018) +* Revision: 53196 * * Description: Prototypes for the ROM utility functions. * @@ -157,8 +157,8 @@ typedef struct #define HapiSelectDACVref(a) P_HARD_API->SelectDACVref(a) // Defines for input parameter to the HapiSelectCompAInput function. -// The define values can not be changed! #define COMPA_IN_NC 0x00 +// Defines used in CC13x0/CC26x0 devices #define COMPA_IN_AUXIO7 0x09 #define COMPA_IN_AUXIO6 0x0A #define COMPA_IN_AUXIO5 0x0B @@ -167,14 +167,23 @@ typedef struct #define COMPA_IN_AUXIO2 0x0E #define COMPA_IN_AUXIO1 0x0F #define COMPA_IN_AUXIO0 0x10 +// Defines used in CC13x2/CC26x2 devices +#define COMPA_IN_AUXIO26 COMPA_IN_AUXIO7 +#define COMPA_IN_AUXIO25 COMPA_IN_AUXIO6 +#define COMPA_IN_AUXIO24 COMPA_IN_AUXIO5 +#define COMPA_IN_AUXIO23 COMPA_IN_AUXIO4 +#define COMPA_IN_AUXIO22 COMPA_IN_AUXIO3 +#define COMPA_IN_AUXIO21 COMPA_IN_AUXIO2 +#define COMPA_IN_AUXIO20 COMPA_IN_AUXIO1 +#define COMPA_IN_AUXIO19 COMPA_IN_AUXIO0 // Defines for input parameter to the HapiSelectCompARef function. -// The define values can not be changed! #define COMPA_REF_NC 0x00 #define COMPA_REF_DCOUPL 0x01 #define COMPA_REF_VSS 0x02 #define COMPA_REF_VDDS 0x03 #define COMPA_REF_ADCVREFP 0x04 +// Defines used in CC13x0/CC26x0 devices #define COMPA_REF_AUXIO7 0x09 #define COMPA_REF_AUXIO6 0x0A #define COMPA_REF_AUXIO5 0x0B @@ -183,13 +192,22 @@ typedef struct #define COMPA_REF_AUXIO2 0x0E #define COMPA_REF_AUXIO1 0x0F #define COMPA_REF_AUXIO0 0x10 +// Defines used in CC13x2/CC26x2 devices +#define COMPA_REF_AUXIO26 COMPA_REF_AUXIO7 +#define COMPA_REF_AUXIO25 COMPA_REF_AUXIO6 +#define COMPA_REF_AUXIO24 COMPA_REF_AUXIO5 +#define COMPA_REF_AUXIO23 COMPA_REF_AUXIO4 +#define COMPA_REF_AUXIO22 COMPA_REF_AUXIO3 +#define COMPA_REF_AUXIO21 COMPA_REF_AUXIO2 +#define COMPA_REF_AUXIO20 COMPA_REF_AUXIO1 +#define COMPA_REF_AUXIO19 COMPA_REF_AUXIO0 // Defines for input parameter to the HapiSelectADCCompBInput function. -// The define values can not be changed! #define ADC_COMPB_IN_NC 0x00 #define ADC_COMPB_IN_DCOUPL 0x03 #define ADC_COMPB_IN_VSS 0x04 #define ADC_COMPB_IN_VDDS 0x05 +// Defines used in CC13x0/CC26x0 devices #define ADC_COMPB_IN_AUXIO7 0x09 #define ADC_COMPB_IN_AUXIO6 0x0A #define ADC_COMPB_IN_AUXIO5 0x0B @@ -198,6 +216,15 @@ typedef struct #define ADC_COMPB_IN_AUXIO2 0x0E #define ADC_COMPB_IN_AUXIO1 0x0F #define ADC_COMPB_IN_AUXIO0 0x10 +// Defines used in CC13x2/CC26x2 devices +#define ADC_COMPB_IN_AUXIO26 ADC_COMPB_IN_AUXIO7 +#define ADC_COMPB_IN_AUXIO25 ADC_COMPB_IN_AUXIO6 +#define ADC_COMPB_IN_AUXIO24 ADC_COMPB_IN_AUXIO5 +#define ADC_COMPB_IN_AUXIO23 ADC_COMPB_IN_AUXIO4 +#define ADC_COMPB_IN_AUXIO22 ADC_COMPB_IN_AUXIO3 +#define ADC_COMPB_IN_AUXIO21 ADC_COMPB_IN_AUXIO2 +#define ADC_COMPB_IN_AUXIO20 ADC_COMPB_IN_AUXIO1 +#define ADC_COMPB_IN_AUXIO19 ADC_COMPB_IN_AUXIO0 // Defines for input parameter to the HapiSelectDACVref function. // The define values can not be changed! @@ -243,6 +270,9 @@ typedef struct #define ROM_API_SETUP_ROM_TABLE ((uint32_t*) (ROM_API_TABLE[28])) #define ROM_API_I2S_TABLE ((uint32_t*) (ROM_API_TABLE[29])) #define ROM_API_PWR_CTRL_TABLE ((uint32_t*) (ROM_API_TABLE[30])) +#define ROM_API_AES_TABLE ((uint32_t*) (ROM_API_TABLE[31])) +#define ROM_API_PKA_TABLE ((uint32_t*) (ROM_API_TABLE[32])) +#define ROM_API_SHA2_TABLE ((uint32_t*) (ROM_API_TABLE[33])) // AON_EVENT FUNCTIONS #define ROM_AONEventMcuWakeUpSet \ @@ -668,56 +698,6 @@ typedef struct ROM_API_VIMS_TABLE[3]) -// CRYPTO FUNCTIONS -#define ROM_CRYPTOAesEcb \ - ((uint32_t (*)(uint32_t *pui32MsgIn, uint32_t *pui32MsgOut, uint32_t ui32KeyLocation, bool bEncrypt, bool bIntEnable)) \ - ROM_API_CRYPTO_TABLE[0]) - -#define ROM_CRYPTOAesEcbStatus \ - ((uint32_t (*)(void)) \ - ROM_API_CRYPTO_TABLE[1]) - -#define ROM_CRYPTOCcmAuthEncrypt \ - ((uint32_t (*)(bool bEncrypt, uint32_t ui32AuthLength, uint32_t *pui32Nonce, uint32_t *pui32PlainText, uint32_t ui32PlainTextLength, uint32_t *pui32Header, uint32_t ui32HeaderLength, uint32_t ui32KeyLocation, uint32_t ui32FieldLength, bool bIntEnable)) \ - ROM_API_CRYPTO_TABLE[3]) - -#define ROM_CRYPTOCcmAuthEncryptResultGet \ - ((uint32_t (*)(uint32_t ui32TagLength, uint32_t *pui32CcmTag)) \ - ROM_API_CRYPTO_TABLE[4]) - -#define ROM_CRYPTOCcmAuthEncryptStatus \ - ((uint32_t (*)(void)) \ - ROM_API_CRYPTO_TABLE[5]) - -#define ROM_CRYPTOCcmInvAuthDecrypt \ - ((uint32_t (*)(bool bDecrypt, uint32_t ui32AuthLength, uint32_t *pui32Nonce, uint32_t *pui32CipherText, uint32_t ui32CipherTextLength, uint32_t *pui32Header, uint32_t ui32HeaderLength, uint32_t ui32KeyLocation, uint32_t ui32FieldLength, bool bIntEnable)) \ - ROM_API_CRYPTO_TABLE[6]) - -#define ROM_CRYPTOCcmInvAuthDecryptResultGet \ - ((uint32_t (*)(uint32_t ui32AuthLength, uint32_t *pui32CipherText, uint32_t ui32CipherTextLength, uint32_t *pui32CcmTag)) \ - ROM_API_CRYPTO_TABLE[7]) - -#define ROM_CRYPTOCcmInvAuthDecryptStatus \ - ((uint32_t (*)(void)) \ - ROM_API_CRYPTO_TABLE[8]) - -#define ROM_CRYPTOAesCbc \ - ((uint32_t (*)(uint32_t *pui32MsgIn, uint32_t *pui32MsgOut, uint32_t ui32MsgLength, uint32_t *pui32Nonce, uint32_t ui32KeyLocation, bool bEncrypt, bool bIntEnable)) \ - ROM_API_CRYPTO_TABLE[9]) - -#define ROM_CRYPTOAesCbcStatus \ - ((uint32_t (*)(void)) \ - ROM_API_CRYPTO_TABLE[10]) - -#define ROM_CRYPTODmaDisable \ - ((void (*)(uint32_t ui32Channels)) \ - ROM_API_CRYPTO_TABLE[11]) - -#define ROM_CRYPTODmaEnable \ - ((void (*)(uint32_t ui32Channels)) \ - ROM_API_CRYPTO_TABLE[12]) - - // OSC FUNCTIONS #define ROM_OSCClockSourceGet \ ((uint32_t (*)(uint32_t ui32SrcClk)) \ @@ -727,10 +707,6 @@ typedef struct ((void (*)(uint32_t ui32SrcClk, uint32_t ui32Osc)) \ ROM_API_OSC_TABLE[1]) -#define ROM_OSC_HPOSCRelativeFrequencyOffsetGet \ - ((int32_t (*)(int32_t tempDegC)) \ - ROM_API_OSC_TABLE[2]) - #define ROM_OSC_HPOSCRelativeFrequencyOffsetToRFCoreFormatConvert \ ((int16_t (*)(int32_t HPOSC_RelFreqOffset)) \ ROM_API_OSC_TABLE[3]) @@ -807,6 +783,10 @@ typedef struct // SETUP_ROM FUNCTIONS +#define ROM_SetupAfterColdResetWakeupFromShutDownCfg1 \ + ((void (*)(uint32_t ccfg_ModeConfReg)) \ + ROM_API_SETUP_ROM_TABLE[0]) + #define ROM_SetupAfterColdResetWakeupFromShutDownCfg2 \ ((void (*)(uint32_t ui32Fcfg1Revision, uint32_t ccfg_ModeConfReg)) \ ROM_API_SETUP_ROM_TABLE[1]) @@ -879,6 +859,10 @@ typedef struct ((void (*)(void)) \ ROM_API_SETUP_ROM_TABLE[18]) +#define ROM_SetupStepVddrTrimTo \ + ((void (*)(uint32_t toCode)) \ + ROM_API_SETUP_ROM_TABLE[19]) + // I2S FUNCTIONS #define ROM_I2SPointerSet \ @@ -896,6 +880,168 @@ typedef struct ROM_API_PWR_CTRL_TABLE[0]) +// AES FUNCTIONS +#define ROM_AESConfigureCCMCtrl \ + ((void (*)(uint32_t nonceLength, uint32_t macLength, bool encrypt)) \ + ROM_API_AES_TABLE[0]) + +#define ROM_AESReadFromKeyStore \ + ((uint32_t (*)(uint32_t keyStoreArea)) \ + ROM_API_AES_TABLE[1]) + +#define ROM_AESReadTag \ + ((uint32_t (*)(uint8_t *tag, uint32_t tagLength)) \ + ROM_API_AES_TABLE[2]) + +#define ROM_AESSetInitializationVector \ + ((void (*)(const uint32_t *initializationVector)) \ + ROM_API_AES_TABLE[3]) + +#define ROM_AESStartDMAOperation \ + ((void (*)(const uint8_t *channel0Addr, uint32_t channel0Length, uint8_t *channel1Addr, uint32_t channel1Length)) \ + ROM_API_AES_TABLE[4]) + +#define ROM_AESVerifyTag \ + ((uint32_t (*)(const uint8_t *tag, uint32_t tagLength)) \ + ROM_API_AES_TABLE[5]) + +#define ROM_AESWaitForIRQFlags \ + ((uint32_t (*)(uint32_t irqFlags)) \ + ROM_API_AES_TABLE[6]) + +#define ROM_AESWriteCCMInitializationVector \ + ((void (*)(const uint8_t *nonce, uint32_t nonceLength)) \ + ROM_API_AES_TABLE[7]) + +#define ROM_AESWriteToKeyStore \ + ((uint32_t (*)(const uint8_t *aesKey, uint32_t aesKeyLength, uint32_t keyStoreArea)) \ + ROM_API_AES_TABLE[8]) + + +// PKA FUNCTIONS +#define ROM_PKABigNumAddGetResult \ + ((uint32_t (*)(uint8_t *resultBuf, uint32_t *resultLength, uint32_t resultPKAMemAddr)) \ + ROM_API_PKA_TABLE[0]) + +#define ROM_PKABigNumCmpGetResult \ + ((uint32_t (*)(void)) \ + ROM_API_PKA_TABLE[1]) + +#define ROM_PKABigNumInvModGetResult \ + ((uint32_t (*)(uint8_t *resultBuf, uint32_t length, uint32_t resultPKAMemAddr)) \ + ROM_API_PKA_TABLE[2]) + +#define ROM_PKABigNumModGetResult \ + ((uint32_t (*)(uint8_t *resultBuf, uint32_t length, uint32_t resultPKAMemAddr)) \ + ROM_API_PKA_TABLE[3]) + +#define ROM_PKABigNumMultGetResult \ + ((uint32_t (*)(uint8_t *resultBuf, uint32_t *resultLength, uint32_t resultPKAMemAddr)) \ + ROM_API_PKA_TABLE[4]) + +#define ROM_PKAEccAddGetResult \ + ((uint32_t (*)(uint8_t *curvePointX, uint8_t *curvePointY, uint32_t resultPKAMemAddr, uint32_t length)) \ + ROM_API_PKA_TABLE[5]) + +#define ROM_PKAEccAddStart \ + ((uint32_t (*)(const uint8_t *curvePoint1X, const uint8_t *curvePoint1Y, const uint8_t *curvePoint2X, const uint8_t *curvePoint2Y, const uint8_t *prime, const uint8_t *a, uint32_t length, uint32_t *resultPKAMemAddr)) \ + ROM_API_PKA_TABLE[6]) + +#define ROM_PKAEccMultiplyGetResult \ + ((uint32_t (*)(uint8_t *curvePointX, uint8_t *curvePointY, uint32_t resultPKAMemAddr, uint32_t length)) \ + ROM_API_PKA_TABLE[7]) + +#define ROM_PKAEccMultiplyStart \ + ((uint32_t (*)(const uint8_t *scalar, const uint8_t *curvePointX, const uint8_t *curvePointY, const uint8_t *prime, const uint8_t *a, const uint8_t *b, uint32_t length, uint32_t *resultPKAMemAddr)) \ + ROM_API_PKA_TABLE[8]) + +#define ROM_PKAGetOpsStatus \ + ((uint32_t (*)(void)) \ + ROM_API_PKA_TABLE[9]) + +#define ROM_PKABigNumAddStart \ + ((uint32_t (*)(const uint8_t *bigNum1, uint32_t bigNum1Length, const uint8_t *bigNum2, uint32_t bigNum2Length, uint32_t *resultPKAMemAddr)) \ + ROM_API_PKA_TABLE[10]) + +#define ROM_PKABigNumCmpStart \ + ((uint32_t (*)(const uint8_t *bigNum1, const uint8_t *bigNum2, uint32_t length)) \ + ROM_API_PKA_TABLE[11]) + +#define ROM_PKABigNumInvModStart \ + ((uint32_t (*)(const uint8_t *bigNum, uint32_t bigNumLength, const uint8_t *modulus, uint32_t modulusLength, uint32_t *resultPKAMemAddr)) \ + ROM_API_PKA_TABLE[12]) + +#define ROM_PKABigNumModStart \ + ((uint32_t (*)(const uint8_t *bigNum, uint32_t bigNumLength, const uint8_t *modulus, uint32_t modulusLength, uint32_t *resultPKAMemAddr)) \ + ROM_API_PKA_TABLE[13]) + +#define ROM_PKABigNumMultiplyStart \ + ((uint32_t (*)(const uint8_t *multiplicand, uint32_t multiplicandLength, const uint8_t *multiplier, uint32_t multiplierLength, uint32_t *resultPKAMemAddr)) \ + ROM_API_PKA_TABLE[14]) + +#define ROM_PKABigNumSubGetResult \ + ((uint32_t (*)(uint8_t *resultBuf, uint32_t *resultLength, uint32_t resultPKAMemAddr)) \ + ROM_API_PKA_TABLE[15]) + +#define ROM_PKABigNumSubStart \ + ((uint32_t (*)(const uint8_t *minuend, uint32_t minuendLength, const uint8_t *subtrahend, uint32_t subtrahendLength, uint32_t *resultPKAMemAddr)) \ + ROM_API_PKA_TABLE[16]) + +#define ROM_PKAArrayAllZeros \ + ((bool (*)(const uint8_t *array, uint32_t arrayLength)) \ + ROM_API_PKA_TABLE[17]) + +#define ROM_PKABigNumDivideGetQuotient \ + ((uint32_t (*)(uint8_t *resultBuf, uint32_t *length, uint32_t resultQuotientMemAddr)) \ + ROM_API_PKA_TABLE[18]) + +#define ROM_PKABigNumDivideGetRemainder \ + ((uint32_t (*)(uint8_t *resultBuf, uint32_t *length, uint32_t resultRemainderMemAddr)) \ + ROM_API_PKA_TABLE[19]) + +#define ROM_PKABigNumDivideStart \ + ((uint32_t (*)(const uint8_t *dividend, uint32_t dividendLength, const uint8_t *divisor, uint32_t divisorLength, uint32_t *resultQuotientMemAddr, uint32_t *resultRemainderMemAddr)) \ + ROM_API_PKA_TABLE[20]) + +#define ROM_PKAEccVerifyPublicKeyWeierstrassStart \ + ((uint32_t (*)(const uint8_t *curvePointX, const uint8_t *curvePointY, const uint8_t *prime, const uint8_t *a, const uint8_t *b, const uint8_t *order, uint32_t length)) \ + ROM_API_PKA_TABLE[21]) + +#define ROM_PKAZeroOutArray \ + ((void (*)(const uint8_t *array, uint32_t arrayLength)) \ + ROM_API_PKA_TABLE[22]) + +#define ROM_PKAEccMontgomeryMultiplyStart \ + ((uint32_t (*)(const uint8_t *scalar, const uint8_t *curvePointX, const uint8_t *prime, const uint8_t *a, uint32_t length, uint32_t *resultPKAMemAddr)) \ + ROM_API_PKA_TABLE[23]) + + +// SHA2 FUNCTIONS +#define ROM_SHA2ComputeFinalHash \ + ((uint32_t (*)(const uint8_t *message, uint8_t *resultDigest, uint32_t *intermediateDigest, uint32_t totalMsgLength, uint32_t messageLength, uint32_t hashAlgorithm)) \ + ROM_API_SHA2_TABLE[0]) + +#define ROM_SHA2ComputeHash \ + ((uint32_t (*)(const uint8_t *message, uint8_t *resultDigest, uint32_t totalMsgLength, uint32_t hashAlgorithm)) \ + ROM_API_SHA2_TABLE[1]) + +#define ROM_SHA2ComputeInitialHash \ + ((uint32_t (*)(const uint8_t *message, uint32_t *intermediateDigest, uint32_t hashAlgorithm, uint32_t initialMessageLength)) \ + ROM_API_SHA2_TABLE[2]) + +#define ROM_SHA2ComputeIntermediateHash \ + ((uint32_t (*)(const uint8_t *message, uint32_t *intermediateDigest, uint32_t hashAlgorithm, uint32_t intermediateMessageLength)) \ + ROM_API_SHA2_TABLE[3]) + +#define ROM_SHA2StartDMAOperation \ + ((void (*)(uint8_t *channel0Addr, uint32_t channel0Length, uint8_t *channel1Addr, uint32_t channel1Length)) \ + ROM_API_SHA2_TABLE[4]) + +#define ROM_SHA2WaitForIRQFlags \ + ((uint32_t (*)(uint32_t irqFlags)) \ + ROM_API_SHA2_TABLE[5]) + + //***************************************************************************** // diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rom_crypto.c b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rom_crypto.c new file mode 100644 index 000000000..2f284cdf3 --- /dev/null +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rom_crypto.c @@ -0,0 +1,159 @@ +/******************************************************************************* +* Filename: rom_crypto.c +* Revised: 2018-09-17 08:57:21 +0200 (Mon, 17 Sep 2018) +* Revision: 52619 +* +* Description: This is the implementation for the API to the ECC functions +* built into ROM on the CC13x2/CC26x2. +* +* Copyright (c) 2015 - 2017, Texas Instruments Incorporated +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* 1) Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* +* 2) Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* 3) Neither the name of the ORGANIZATION nor the names of its contributors may +* be used to endorse or promote products derived from this software without +* specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +*******************************************************************************/ + +#include +#include "rom_crypto.h" + + +////////////////////////////////////* ECC *//////////////////////////////////// +#ifdef ECC_PRIME_NIST256_CURVE +//#define TEST_NIST256 +//#define PARAM_P NIST256_p; +#define PARAM_P 0x100257d4; + +//#define PARAM_R NIST256_r; +#define PARAM_R 0x100257f8; + +//#define PARAM_A NIST256_a; +#define PARAM_A 0x1002581c; + +//#define PARAM_B NIST256_b; +#define PARAM_B 0x10025840; + +//#define PARAM_GX NIST256_Gx; +#define PARAM_GX 0x10025864; + +//#define PARAM_GY NIST256_Gy; +#define PARAM_GY 0x10025888; + +#endif + + +//***************************************************************************** +// ECC_initialize +//***************************************************************************** +void +ECC_initialize(uint32_t *pWorkzone) +{ + // Initialize curve parameters + //data_p = (uint32_t *)PARAM_P; + *((uint32_t **)0x20000138) = (uint32_t *)PARAM_P; + + //data_r = (uint32_t *)PARAM_R; + *((uint32_t **)0x2000013c) = (uint32_t *)PARAM_R; + + //data_a = (uint32_t *)PARAM_A; + *((uint32_t **)0x20000140) = (uint32_t *)PARAM_A; + + //data_b = (uint32_t *)PARAM_B; + *((uint32_t **)0x20000144) = (uint32_t *)PARAM_B; + + //data_Gx = (uint32_t *)PARAM_GX; + *((uint32_t **)0x2000012c) = (uint32_t *)PARAM_GX; + + //data_Gy = (uint32_t *)PARAM_GY; + *((uint32_t **)0x20000130) = (uint32_t *)PARAM_GY; + + // Initialize window size + //win = (uint8_t) ECC_WINDOW_SIZE; + *((uint8_t *)0x20000148) = (uint8_t) ECC_WINDOW_SIZE; + + // Initialize work zone + //workzone = (uint32_t *) pWorkzone; + *((uint32_t **)0x20000134) = (uint32_t *) pWorkzone; +} + +typedef uint8_t(*ecc_keygen_t)(uint32_t *, uint32_t *,uint32_t *, uint32_t *); +ecc_keygen_t ecc_generatekey = (ecc_keygen_t)(0x1001f94d); + +typedef uint8_t(*ecdsa_sign_t)(uint32_t *, uint32_t *,uint32_t *, uint32_t *, uint32_t *); +ecdsa_sign_t ecc_ecdsa_sign = (ecdsa_sign_t)(0x10010381); + +typedef uint8_t(*ecdsa_verify_t)(uint32_t *, uint32_t *,uint32_t *, uint32_t *, uint32_t *); +ecdsa_verify_t ecc_ecdsa_verify = (ecdsa_verify_t)(0x1000c805); + +typedef uint8_t(*ecdh_computeSharedSecret_t)(uint32_t *, uint32_t *,uint32_t *, uint32_t *, uint32_t *); +ecdh_computeSharedSecret_t ecdh_computeSharedSecret = (ecdh_computeSharedSecret_t)(0x10023485); + +//***************************************************************************** +// ECC_generateKey +//***************************************************************************** +uint8_t +ECC_generateKey(uint32_t *randString, uint32_t *privateKey, + uint32_t *publicKey_x, uint32_t *publicKey_y) +{ + return (uint8_t)ecc_generatekey((uint32_t*)randString, (uint32_t*)privateKey, + (uint32_t*)publicKey_x, (uint32_t*)publicKey_y); + +} + +//***************************************************************************** +// ECC_ECDSA_sign +//***************************************************************************** +uint8_t +ECC_ECDSA_sign(uint32_t *secretKey, uint32_t *text, uint32_t *randString, + uint32_t *sign1, uint32_t *sign2) +{ + return (uint8_t)ecc_ecdsa_sign((uint32_t*)secretKey, (uint32_t*)text, (uint32_t*)randString, + (uint32_t*)sign1, (uint32_t*)sign2); +} + +//***************************************************************************** +// ECC_ECDSA_verify +//***************************************************************************** +uint8_t +ECC_ECDSA_verify(uint32_t *publicKey_x, uint32_t *publicKey_y, + uint32_t *text, uint32_t *sign1, uint32_t *sign2) +{ + return (uint8_t)ecc_ecdsa_verify((uint32_t*)publicKey_x, (uint32_t*)publicKey_y, (uint32_t*)text, + (uint32_t*)sign1, (uint32_t*)sign2); +} + +//***************************************************************************** +// ECC_ECDH_computeSharedSecret +//***************************************************************************** +uint8_t +ECC_ECDH_computeSharedSecret(uint32_t *privateKey, uint32_t *publicKey_x, + uint32_t *publicKey_y, uint32_t *sharedSecret_x, + uint32_t *sharedSecret_y) +{ + return (uint8_t)ecdh_computeSharedSecret((uint32_t*)privateKey, (uint32_t*)publicKey_x, + (uint32_t*)publicKey_y, (uint32_t*)sharedSecret_x, + (uint32_t*)sharedSecret_y); +} diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/rom_crypto.h b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rom_crypto.h new file mode 100644 index 000000000..eecafac5a --- /dev/null +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/rom_crypto.h @@ -0,0 +1,212 @@ +/****************************************************************************** +* Filename: rom_crypto.h +* Revised: 2018-09-17 09:24:56 +0200 (Mon, 17 Sep 2018) +* Revision: 52624 +* +* Description: This header file is the API to the crypto functions +* built into ROM on the CC13xx/CC26xx. +* +* Copyright (c) 2015 - 2017, Texas Instruments Incorporated +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* 1) Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* +* 2) Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* 3) Neither the name of the ORGANIZATION nor the names of its contributors may +* be used to endorse or promote products derived from this software without +* specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +*******************************************************************************/ + +//***************************************************************************** +// +//! \addtogroup peripheral_group +//! @{ +//! \addtogroup rom_crypto_api +//! @{ +// +//***************************************************************************** + +#ifndef ROM_CRYPTO_H +#define ROM_CRYPTO_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +////////////////////////////////////* ECC *///////////////////////////////////// + +/* Window size, valid values are 2,3,4,5. + * Higher the value, faster the computation at the expense of memory usage. + * + * Recommended workzone size (in 4-byte words) + * Window size: 3, Workzone size: 275 + * + */ +#define ECC_WINDOW_SIZE 3 + +/* + * ECC Supported Curves, define one: + * ECC_PRIME_NIST256_CURVE + */ +#define ECC_PRIME_NIST256_CURVE + +/* + * ECC Return Status Flags. + */ +// Scalar multiplication status +#define ECC_MODULUS_EVEN 0xDC +#define ECC_MODULUS_LARGER_THAN_255_WORDS 0xD2 +#define ECC_MODULUS_LENGTH_ZERO 0x08 +#define ECC_MODULUS_MSW_IS_ZERO 0x30 +#define ECC_SCALAR_TOO_LONG 0x35 +#define ECC_SCALAR_LENGTH_ZERO 0x53 +#define ECC_ORDER_TOO_LONG 0xC6 +#define ECC_ORDER_LENGTH_ZERO 0x6C +#define ECC_X_COORD_TOO_LONG 0x3C +#define ECC_X_COORD_LENGTH_ZERO 0xC3 +#define ECC_Y_COORD_TOO_LONG 0x65 +#define ECC_Y_COORD_LENGTH_ZERO 0x56 +#define ECC_A_COEF_TOO_LONG 0x5C +#define ECC_A_COEF_LENGTH_ZERO 0xC5 +#define ECC_BAD_WINDOW_SIZE 0x66 +#define ECC_SCALAR_MUL_OK 0x99 + +// ECDSA and ECDH status +#define ECC_ORDER_LARGER_THAN_255_WORDS 0x28 +#define ECC_ORDER_EVEN 0x82 +#define ECC_ORDER_MSW_IS_ZERO 0x23 +#define ECC_ECC_KEY_TOO_LONG 0x25 +#define ECC_ECC_KEY_LENGTH_ZERO 0x52 +#define ECC_DIGEST_TOO_LONG 0x27 +#define ECC_DIGEST_LENGTH_ZERO 0x72 +#define ECC_ECDSA_SIGN_OK 0x32 +#define ECC_ECDSA_INVALID_SIGNATURE 0x5A +#define ECC_ECDSA_VALID_SIGNATURE 0xA5 +#define ECC_SIG_P1_TOO_LONG 0x11 +#define ECC_SIG_P1_LENGTH_ZERO 0x12 +#define ECC_SIG_P2_TOO_LONG 0x22 +#define ECC_SIG_P2_LENGTH_ZERO 0x21 + +#define ECC_ECDSA_KEYGEN_OK ECC_SCALAR_MUL_OK +#define ECC_ECDH_KEYGEN_OK ECC_SCALAR_MUL_OK +#define ECC_ECDH_COMMON_KEY_OK ECC_SCALAR_MUL_OK + +//***************************************************************************** +/*! + * \brief Pass pointer to ECC memory allocation to ECC engine. + * + * This function can be called again to point the ECC workzone at + * a different memory buffer. + * + * \param pWorkzone Pointer to memory allocated for computations, input. + * See description at beginning of ECC section for + * memory requirements. + * + * \return None + */ +//***************************************************************************** + extern void ECC_initialize(uint32_t *pWorkzone); + +//***************************************************************************** + /*! + * \brief Generate a key. + * + * This is used for both ECDH and ECDSA. + * + * \param randString Pointer to random string, input. + * \param privateKey Pointer to the private key, output. + * \param publicKey_x Pointer to public key X-coordinate, output. + * \param publicKey_y Pointer to public key Y-coordinate, output. + * + * \return Status + */ +//***************************************************************************** +extern uint8_t ECC_generateKey(uint32_t *randString, uint32_t *privateKey, + uint32_t *publicKey_x, uint32_t *publicKey_y); + +//***************************************************************************** +/*! + * \brief Sign data. + * + * \param secretKey Pointer to the secret key, input. + * \param text Pointer to the message, input. + * \param randString Pointer to random string, input. + * \param sign1 Pointer to signature part 1, output. + * \param sign2 Pointer to signature part 2, output. + * + * \return Status + */ +//***************************************************************************** +extern uint8_t ECC_ECDSA_sign(uint32_t *secretKey, uint32_t *text, uint32_t *randString, + uint32_t *sign1, uint32_t *sign2); + +//***************************************************************************** +/*! + * \brief Verify signature. + * + * \param publicKey_x Pointer to public key X-coordinate, input. + * \param publicKey_y Pointer to public key Y-coordinate, input. + * \param text Pointer to message data, input. + * \param sign1 Pointer to signature part 1, input. + * \param sign2 Pointer to signature part 2, input. + * + * \return Status + */ +//***************************************************************************** +extern uint8_t ECC_ECDSA_verify(uint32_t *publicKey_x, uint32_t *publicKey_y, + uint32_t *text, uint32_t *sign1, uint32_t *sign2); + +//***************************************************************************** +/*! + * \brief Compute the shared secret. + * + * \param privateKey Pointer to private key, input. + * \param publicKey_x Pointer to public key X-coordinate, input. + * \param publicKey_y Pointer to public key Y-coordinate, input. + * \param sharedSecret_x Pointer to shared secret X-coordinate, output. + * \param sharedSecret_y Pointer to shared secret Y-coordinate, output. + * + * \return Status + */ +//***************************************************************************** +extern uint8_t ECC_ECDH_computeSharedSecret(uint32_t *privateKey, + uint32_t *publicKey_x, + uint32_t *publicKey_y, + uint32_t *sharedSecret_x, + uint32_t *sharedSecret_y); + + +#ifdef __cplusplus +} +#endif + +#endif /* ROM_CRYPTO_H */ + +//***************************************************************************** +// +//! Close the Doxygen group. +//! @} +//! @} +// +//***************************************************************************** diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/setup.c b/third_party/ti/devices/cc13x2_cc26x2/driverlib/setup.c index 8752ff3a3..1f438bed0 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/setup.c +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/setup.c @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: setup.c -* Revised: 2018-04-05 13:46:03 +0200 (Thu, 05 Apr 2018) -* Revision: 51853 +* Revised: 2018-11-06 15:08:57 +0100 (Tue, 06 Nov 2018) +* Revision: 53239 * * Description: Setup file for CC13xx/CC26xx devices. * @@ -53,6 +53,7 @@ #include "../inc/hw_aon_pmctl.h" #include "../inc/hw_aon_rtc.h" #include "../inc/hw_ddi_0_osc.h" +#include "../inc/hw_ddi.h" #include "../inc/hw_ccfg.h" #include "../inc/hw_fcfg1.h" #include "../inc/hw_flash.h" @@ -121,9 +122,9 @@ SetupTrimDevice(void) ui32Fcfg1Revision = 0; } - // This driverlib version and setup file is for the CC13x2, CC26x2 chips. + // This driverlib version and setup file is for the CC13x2, CC26x2 PG2.0 or later chips. // Halt if violated - ThisLibraryIsFor_CC13x2_CC26x2_HaltIfViolated(); + ThisLibraryIsFor_CC13x2_CC26x2_HwRev20AndLater_HaltIfViolated(); // Enable standby in flash bank HWREGBITW( FLASH_BASE + FLASH_O_CFG, FLASH_CFG_DIS_STANDBY_BITN ) = 0; @@ -227,58 +228,6 @@ TrimAfterColdResetWakeupFromShutDownWakeupFromPowerDown( void ) // Currently no specific trim for Powerdown } -// Special shadow register trim propagation on first batch of devices - -static void -Step_RCOSCHF_CTRIM( uint32_t toCode ) -{ - uint32_t currentRcoscHfCtlReg ; - uint32_t currentTrim ; - - currentRcoscHfCtlReg = HWREGH( AUX_DDI0_OSC_BASE + DDI_0_OSC_O_RCOSCHFCTL ); - currentTrim = ((( currentRcoscHfCtlReg & DDI_0_OSC_RCOSCHFCTL_RCOSCHF_CTRIM_M ) >> - DDI_0_OSC_RCOSCHFCTL_RCOSCHF_CTRIM_S ) ^ 0xC0 ); - - while ( toCode != currentTrim ) { - HWREG( AON_RTC_BASE + AON_RTC_O_SYNCLF ); // Wait for next edge on SCLK_LF (positive or negative) - - if ( toCode > currentTrim ) currentTrim++; - else currentTrim--; - - HWREGH( AUX_DDI0_OSC_BASE + DDI_0_OSC_O_RCOSCHFCTL ) = - ( currentRcoscHfCtlReg & ~DDI_0_OSC_RCOSCHFCTL_RCOSCHF_CTRIM_M ) | - (( currentTrim ^ 0xC0 ) << DDI_0_OSC_RCOSCHFCTL_RCOSCHF_CTRIM_S ); - } -} - -static void -Step_VBG( int32_t targetSigned ) -{ - // VBG (ANA_TRIM[5:0]=TRIMTEMP --> ADI_3_REFSYS:REFSYSCTL3.TRIM_VBG) - uint32_t refSysCtl3Reg ; - int32_t currentSigned ; - - do { - refSysCtl3Reg = HWREGB( ADI3_BASE + ADI_3_REFSYS_O_REFSYSCTL3 ); - currentSigned = - (((int32_t)( refSysCtl3Reg << ( 32 - ADI_3_REFSYS_REFSYSCTL3_TRIM_VBG_W - ADI_3_REFSYS_REFSYSCTL3_TRIM_VBG_S ))) - >> ( 32 - ADI_3_REFSYS_REFSYSCTL3_TRIM_VBG_W )); - - HWREG( AON_RTC_BASE + AON_RTC_O_SYNCLF ); // Wait for next edge on SCLK_LF (positive or negative) - - if ( targetSigned != currentSigned ) { - if ( targetSigned > currentSigned ) currentSigned++; - else currentSigned--; - - HWREGB( ADI3_BASE + ADI_3_REFSYS_O_REFSYSCTL3 ) = - ( refSysCtl3Reg & ~( ADI_3_REFSYS_REFSYSCTL3_BOD_BG_TRIM_EN | ADI_3_REFSYS_REFSYSCTL3_TRIM_VBG_M )) | - ((((uint32_t)currentSigned) << ADI_3_REFSYS_REFSYSCTL3_TRIM_VBG_S ) & ADI_3_REFSYS_REFSYSCTL3_TRIM_VBG_M ); - - HWREGB( ADI3_BASE + ADI_3_REFSYS_O_REFSYSCTL3 ) |= ADI_3_REFSYS_REFSYSCTL3_BOD_BG_TRIM_EN; // Bit set by doing a read modify write - } - } while ( targetSigned != currentSigned ); -} - //***************************************************************************** // //! \brief Trims to be applied when coming from SHUTDOWN (also called when @@ -304,7 +253,16 @@ TrimAfterColdResetWakeupFromShutDown(uint32_t ui32Fcfg1Revision) } - // TBD-Agama - Temporarily removed for Agama + // TBD - Temporarily removed for CC13x2 / CC26x2 + + // Force DCDC to use RCOSC before starting up XOSC. + // Clock loss detector does not use XOSC until SCLK_HF actually switches + // and thus DCDC is not protected from clock loss on XOSC in that time frame. + // The force must be released when the switch to XOSC has happened. This is done + // in OSCHfSourceSwitch(). + HWREG(AUX_DDI0_OSC_BASE + DDI_O_MASK16B + (DDI_0_OSC_O_CTL0 << 1) + 4) = DDI_0_OSC_CTL0_CLK_DCDC_SRC_SEL_M | (DDI_0_OSC_CTL0_CLK_DCDC_SRC_SEL_M >> 16); + // Dummy read to ensure that the write has propagated + HWREGH(AUX_DDI0_OSC_BASE + DDI_0_OSC_O_CTL0); // read the MODE_CONF register in CCFG ccfg_ModeConfReg = HWREG( CCFG_BASE + CCFG_O_MODE_CONF ); @@ -314,6 +272,14 @@ TrimAfterColdResetWakeupFromShutDown(uint32_t ui32Fcfg1Revision) // -Configure DCDC. SetupAfterColdResetWakeupFromShutDownCfg1( ccfg_ModeConfReg ); + // Addition to the CC1352 boost mode for HWREV >= 2.0 + // The combination VDDR_EXT_LOAD=0 and VDDS_BOD_LEVEL=1 is defined to select boost mode + if ((( ccfg_ModeConfReg & CCFG_MODE_CONF_VDDR_EXT_LOAD ) == 0 ) && + (( ccfg_ModeConfReg & CCFG_MODE_CONF_VDDS_BOD_LEVEL ) != 0 ) ) + { + HWREGB( ADI3_BASE + ADI_3_REFSYS_O_DCDCCTL3 ) = ADI_3_REFSYS_DCDCCTL3_VDDR_BOOST_COMP_BOOST ; + } + // Second part of trim done after cold reset and wakeup from shutdown: // -Configure XOSC. #if ( CCFG_BASE == CCFG_BASE_DEFAULT ) @@ -322,106 +288,6 @@ TrimAfterColdResetWakeupFromShutDown(uint32_t ui32Fcfg1Revision) NOROM_SetupAfterColdResetWakeupFromShutDownCfg2( ui32Fcfg1Revision, ccfg_ModeConfReg ); #endif - // Special shadow register trim propagation on first batch of devices - { - uint32_t ui32EfuseData ; - uint32_t orgResetCtl ; - - // Get VTRIM_COARSE and VTRIM_DIG from EFUSE shadow register OSC_BIAS_LDO_TRIM - ui32EfuseData = HWREG( FCFG1_BASE + FCFG1_O_SHDW_OSC_BIAS_LDO_TRIM ); - - Step_RCOSCHF_CTRIM(( ui32EfuseData & - FCFG1_SHDW_OSC_BIAS_LDO_TRIM_RCOSCHF_CTRIM_M ) >> - FCFG1_SHDW_OSC_BIAS_LDO_TRIM_RCOSCHF_CTRIM_S ) ; - - // Write to register SOCLDO_0_1 (addr offset 3) bits[7:4] (VTRIM_COARSE) and - // bits[3:0] (VTRIM_DIG) in ADI_2_REFSYS. Direct write can be used since - // all register bit fields are trimmed. - HWREGB(ADI2_BASE + ADI_O_DIR + ADI_2_REFSYS_O_SOCLDOCTL1) = - ((((ui32EfuseData & FCFG1_SHDW_OSC_BIAS_LDO_TRIM_VTRIM_COARSE_M) >> - FCFG1_SHDW_OSC_BIAS_LDO_TRIM_VTRIM_COARSE_S) << - ADI_2_REFSYS_SOCLDOCTL1_VTRIM_COARSE_S) | - - (((ui32EfuseData & FCFG1_SHDW_OSC_BIAS_LDO_TRIM_VTRIM_DIG_M) >> - FCFG1_SHDW_OSC_BIAS_LDO_TRIM_VTRIM_DIG_S) << - ADI_2_REFSYS_SOCLDOCTL1_VTRIM_DIG_S)); - - // Write to register CTLSOCREFSYS0 (addr offset 0) bits[4:0] (TRIMIREF) in - // ADI_2_REFSYS. Avoid using masked write access since bit field spans - // nibble boundary. Direct write can be used since this is the only defined - // bit field in this register. - HWREGB(ADI2_BASE + ADI_O_DIR + ADI_2_REFSYS_O_REFSYSCTL0) = - (((ui32EfuseData & FCFG1_SHDW_OSC_BIAS_LDO_TRIM_TRIMIREF_M) >> - FCFG1_SHDW_OSC_BIAS_LDO_TRIM_TRIMIREF_S) << - ADI_2_REFSYS_REFSYSCTL0_TRIM_IREF_S); - - // Write to register CTLSOCREFSYS2 (addr offset 4) bits[7:4] (TRIMMAG) in - // ADI_3_REFSYS - HWREGH(ADI3_BASE + ADI_O_MASK8B + (ADI_3_REFSYS_O_REFSYSCTL2 << 1)) = - (ADI_3_REFSYS_REFSYSCTL2_TRIM_VREF_M << 8) | - (((ui32EfuseData & FCFG1_SHDW_OSC_BIAS_LDO_TRIM_TRIMMAG_M) >> - FCFG1_SHDW_OSC_BIAS_LDO_TRIM_TRIMMAG_S) << - ADI_3_REFSYS_REFSYSCTL2_TRIM_VREF_S); - - // Get TRIMBOD_EXTMODE or TRIMBOD_INTMODE from EFUSE shadow register in FCFG1 - ui32EfuseData = HWREG( FCFG1_BASE + FCFG1_O_SHDW_ANA_TRIM ); - - orgResetCtl = ( HWREG( AON_PMCTL_BASE + AON_PMCTL_O_RESETCTL ) & ~AON_PMCTL_RESETCTL_MCU_WARM_RESET_M ); - HWREG( AON_PMCTL_BASE + AON_PMCTL_O_RESETCTL ) = - ( orgResetCtl & ~( AON_PMCTL_RESETCTL_CLK_LOSS_EN | - AON_PMCTL_RESETCTL_VDD_LOSS_EN | - AON_PMCTL_RESETCTL_VDDR_LOSS_EN | - AON_PMCTL_RESETCTL_VDDS_LOSS_EN )); - HWREG( AON_RTC_BASE + AON_RTC_O_SYNC ); // Wait for xxx_LOSS_EN setting to propagate - - // The VDDS_BOD trim and the VDDR trim is already stepped up to max/HH if "CC1352 boost mode" is requested. - // See function SetupAfterColdResetWakeupFromShutDownCfg1() in setup_rom.c for details. - if ((( ccfg_ModeConfReg & CCFG_MODE_CONF_VDDR_EXT_LOAD ) != 0 ) || - (( ccfg_ModeConfReg & CCFG_MODE_CONF_VDDS_BOD_LEVEL ) == 0 ) ) - { - if(HWREG(AON_PMCTL_BASE + AON_PMCTL_O_PWRCTL) & - AON_PMCTL_PWRCTL_EXT_REG_MODE) - { - // Apply VDDS BOD trim value - // Write to register CTLSOCREFSYS1 (addr offset 3) bit[7:3] (TRIMBOD) - // in ADI_3_REFSYS - HWREGH(ADI3_BASE + ADI_O_MASK8B + (ADI_3_REFSYS_O_REFSYSCTL1 << 1)) = - (ADI_3_REFSYS_REFSYSCTL1_TRIM_VDDS_BOD_M << 8) | - (((ui32EfuseData & FCFG1_SHDW_ANA_TRIM_TRIMBOD_EXTMODE_M) >> - FCFG1_SHDW_ANA_TRIM_TRIMBOD_EXTMODE_S) << - ADI_3_REFSYS_REFSYSCTL1_TRIM_VDDS_BOD_S); - } - else - { - // Apply VDDS BOD trim value - // Write to register CTLSOCREFSYS1 (addr offset 3) bit[7:3] (TRIMBOD) - // in ADI_3_REFSYS - HWREGH(ADI3_BASE + ADI_O_MASK8B + (ADI_3_REFSYS_O_REFSYSCTL1 << 1)) = - (ADI_3_REFSYS_REFSYSCTL1_TRIM_VDDS_BOD_M << 8) | - (((ui32EfuseData & FCFG1_SHDW_ANA_TRIM_TRIMBOD_INTMODE_M) >> - FCFG1_SHDW_ANA_TRIM_TRIMBOD_INTMODE_S) << - ADI_3_REFSYS_REFSYSCTL1_TRIM_VDDS_BOD_S); - } - // Load the new VDDS_BOD setting - HWREGB( ADI3_BASE + ADI_3_REFSYS_O_REFSYSCTL3 ) &= ~ADI_3_REFSYS_REFSYSCTL3_BOD_BG_TRIM_EN; // Bit clear by doing a read modify write - HWREGB( ADI3_BASE + ADI_3_REFSYS_O_REFSYSCTL3 ) |= ADI_3_REFSYS_REFSYSCTL3_BOD_BG_TRIM_EN; // Bit set by doing a read modify write - - SetupStepVddrTrimTo(( ui32EfuseData & - FCFG1_SHDW_ANA_TRIM_VDDR_TRIM_M ) >> - FCFG1_SHDW_ANA_TRIM_VDDR_TRIM_S ) ; - } - - // VBG (ANA_TRIM[5:0]=TRIMTEMP --> ADI_3_REFSYS:REFSYSCTL3.TRIM_VBG) - Step_VBG(((int32_t)( ui32EfuseData << ( 32 - FCFG1_SHDW_ANA_TRIM_TRIMTEMP_W - FCFG1_SHDW_ANA_TRIM_TRIMTEMP_S ))) - >> ( 32 - FCFG1_SHDW_ANA_TRIM_TRIMTEMP_W )); - - // Wait two more LF edges before restoring xxx_LOSS_EN settings - HWREG( AON_RTC_BASE + AON_RTC_O_SYNCLF ); // Wait for next edge on SCLK_LF (positive or negative) - HWREG( AON_RTC_BASE + AON_RTC_O_SYNCLF ); // Wait for next edge on SCLK_LF (positive or negative) - HWREG( AON_PMCTL_BASE + AON_PMCTL_O_RESETCTL ) = orgResetCtl; - HWREG( AON_RTC_BASE + AON_RTC_O_SYNC ); // Wait for xxx_LOSS_EN setting to propagate - } - { uint32_t trimReg ; uint32_t ui32TrimValue ; @@ -432,11 +298,19 @@ TrimAfterColdResetWakeupFromShutDown(uint32_t ui32Fcfg1Revision) FCFG1_DAC_BIAS_CNF_LPM_TRIM_IOUT_S ) ; HWREGB( AUX_ADI4_BASE + ADI_4_AUX_O_LPMBIAS ) = (( ui32TrimValue << ADI_4_AUX_LPMBIAS_LPM_TRIM_IOUT_S ) & ADI_4_AUX_LPMBIAS_LPM_TRIM_IOUT_M ) ; - //--- Set fixed LPM_BIAS values --- LPM_BIAS_BACKUP_EN = 1 and LPM_BIAS_WIDTH_TRIM = 3 - HWREGB( ADI3_BASE + ADI_O_SET + ADI_3_REFSYS_O_AUX_DEBUG ) = ADI_3_REFSYS_AUX_DEBUG_LPM_BIAS_BACKUP_EN; - HWREGH( AUX_ADI4_BASE + ADI_O_MASK8B + ( ADI_4_AUX_O_COMP * 2 )) = // Set LPM_BIAS_WIDTH_TRIM = 3 - (( ADI_4_AUX_COMP_LPM_BIAS_WIDTH_TRIM_M << 8 ) | // Set mask (bits to be written) in [15:8] - ( 3 << ADI_4_AUX_COMP_LPM_BIAS_WIDTH_TRIM_S ) ); // Set value (in correct bit pos) in [7:0] + // Set LPM_BIAS_BACKUP_EN according to FCFG1 configuration + if ( trimReg & FCFG1_DAC_BIAS_CNF_LPM_BIAS_BACKUP_EN ) { + HWREGB( ADI3_BASE + ADI_O_SET + ADI_3_REFSYS_O_AUX_DEBUG ) = ADI_3_REFSYS_AUX_DEBUG_LPM_BIAS_BACKUP_EN; + } else { + HWREGB( ADI3_BASE + ADI_O_CLR + ADI_3_REFSYS_O_AUX_DEBUG ) = ADI_3_REFSYS_AUX_DEBUG_LPM_BIAS_BACKUP_EN; + } + // Set LPM_BIAS_WIDTH_TRIM according to FCFG1 configuration + { + uint32_t widthTrim = (( trimReg & FCFG1_DAC_BIAS_CNF_LPM_BIAS_WIDTH_TRIM_M ) >> FCFG1_DAC_BIAS_CNF_LPM_BIAS_WIDTH_TRIM_S ); + HWREGH( AUX_ADI4_BASE + ADI_O_MASK8B + ( ADI_4_AUX_O_COMP * 2 )) = // Set LPM_BIAS_WIDTH_TRIM = 3 + (( ADI_4_AUX_COMP_LPM_BIAS_WIDTH_TRIM_M << 8 ) | // Set mask (bits to be written) in [15:8] + ( widthTrim << ADI_4_AUX_COMP_LPM_BIAS_WIDTH_TRIM_S ) ); // Set value (in correct bit pos) in [7:0] + } } // Third part of trim done after cold reset and wakeup from shutdown: diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/setup.h b/third_party/ti/devices/cc13x2_cc26x2/driverlib/setup.h index d032d71d7..c2093d7fa 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/setup.h +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/setup.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: setup.h -* Revised: 2016-09-13 14:21:40 +0200 (Tue, 13 Sep 2016) -* Revision: 47152 +* Revised: 2018-10-24 11:23:04 +0200 (Wed, 24 Oct 2018) +* Revision: 52993 * * Description: Prototypes and defines for the setup API. * @@ -83,11 +83,24 @@ extern "C" //***************************************************************************** // -//! \brief Performs the necessary trim of the device which is not done in boot code. +//! \brief Performs the necessary trim of the device which is not done in ROM boot code. //! -//! This function should only execute coming from ROM boot. The current -//! implementation does not take soft reset into account. However, it does no -//! damage to execute it again. It only consumes time. +//! This function should only execute coming from ROM boot. +//! +//! The following is handled by this function: +//! - Checks if the driverlib variant used by the application is supported by the +//! device. Execution is halted in case of unsupported driverlib variant. +//! - Configures VIMS cache mode based on setting in CCFG. +//! - Configures functionalities like DCDC and XOSC dependent on startup modes like +//! cold reset, wakeup from shutdown and wakeup from from powerdown. +//! - Configures VIMS power domain control. +//! - Configures optimal wait time for flash FSM in cases where flash pump wakes up from sleep. +//! +//! \note The current implementation does not take soft reset into account. However, +//! it does no damage to execute it again. It only consumes time. +//! +//! \note This function is called by the compiler specific device startup codes +//! that are integrated in the SimpleLink SDKs for CC13xx/CC26XX devices. //! //! \return None // diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/setup_rom.h b/third_party/ti/devices/cc13x2_cc26x2/driverlib/setup_rom.h index dcc0751ca..e06ba2931 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/setup_rom.h +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/setup_rom.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: setup_rom.h -* Revised: 2017-09-04 19:00:53 +0200 (Mon, 04 Sep 2017) -* Revision: 49686 +* Revised: 2018-10-24 11:23:04 +0200 (Wed, 24 Oct 2018) +* Revision: 52993 * * Description: Prototypes and defines for the setup API. * @@ -102,9 +102,19 @@ extern "C" //***************************************************************************** // -//! \brief First part of configuration required when waking up from shutdown. +//! \brief First part of configuration required after cold reset and when waking up from shutdown. //! -//! \param ccfg_ModeConfReg +//! Configures the following based on settings in CCFG (Customer Configuration area: +//! - Boost mode for CC13xx devices +//! - Minimal VDDR voltage threshold used during sleep mode +//! - DCDC functionality: +//! - Selects if DCDC or GLDO regulator will be used for VDDR in active mode +//! - Selects if DCDC or GLDO regulator will be used for VDDR in sleep mode +//! +//! In addition the battery monitor low limit for internal regulator mode is set +//! to a hard coded value. +//! +//! \param ccfg_ModeConfReg is the value of the CCFG_O_MODE_CONF_1 register //! //! \return None // @@ -113,10 +123,14 @@ extern void SetupAfterColdResetWakeupFromShutDownCfg1( uint32_t ccfg_ModeConfReg //***************************************************************************** // -//! \brief Second part of configuration required when waking up from shutdown. +//! \brief Second part of configuration required after cold reset and when waking up from shutdown. //! -//! \param ui32Fcfg1Revision -//! \param ccfg_ModeConfReg +//! Configures and trims functionalites required for use of XOSC_HF. +//! The configurations and trimmings are based on settings in FCFG1 (Factory +//! Configuration area) and partly on \c ccfg_ModeConfReg. +//! +//! \param ui32Fcfg1Revision is the value of the FCFG1_O_FCFG1_REVISION register +//! \param ccfg_ModeConfReg is the value of the CCFG_O_MODE_CONF_1 register //! //! \return None // @@ -125,9 +139,18 @@ extern void SetupAfterColdResetWakeupFromShutDownCfg2( uint32_t ui32Fcfg1Revisio //***************************************************************************** // -//! \brief Third part of configuration required when waking up from shutdown. +//! \brief Third part of configuration required after cold reset and when waking up from shutdown. //! -//! \param ccfg_ModeConfReg +//! Configures the following: +//! - XOSC source selection based on \c ccfg_ModeConfReg. If HPOSC is selected on a +//! HPOSC device the oscillator is configured based on settings in FCFG1 (Factory +//! Configuration area). +//! - Clock loss detection is disabled. Will be re-enabled by TIRTOS power driver. +//! - Duration of the XOSC_HF fast startup mode based on FCFG1 setting. +//! - SCLK_LF based on \c ccfg_ModeConfReg. +//! - Output voltage of ADC fixed reference based on FCFG1 setting. +//! +//! \param ccfg_ModeConfReg is the value of the CCFG_O_MODE_CONF_1 register //! //! \return None // @@ -138,7 +161,7 @@ extern void SetupAfterColdResetWakeupFromShutDownCfg3( uint32_t ccfg_ModeConfReg // //! \brief Returns the trim value from FCFG1 to be used as ADC_SH_MODE_EN setting. //! -//! \param ui32Fcfg1Revision +//! \param ui32Fcfg1Revision is the value of the FCFG1_O_FCFG1_REVISION register //! //! \return Returns the trim value from FCFG1. // @@ -149,7 +172,7 @@ extern uint32_t SetupGetTrimForAdcShModeEn( uint32_t ui32Fcfg1Revision ); // //! \brief Returns the trim value from FCFG1 to be used as ADC_SH_VBUF_EN setting. //! -//! \param ui32Fcfg1Revision +//! \param ui32Fcfg1Revision is the value of the FCFG1_O_FCFG1_REVISION register //! //! \return Returns the trim value from FCFG1. // @@ -160,7 +183,7 @@ extern uint32_t SetupGetTrimForAdcShVbufEn( uint32_t ui32Fcfg1Revision ); // //! \brief Returns the trim value to be used for the AMPCOMP_CTRL register in OSC_DIG. //! -//! \param ui32Fcfg1Revision +//! \param ui32Fcfg1Revision is the value of the FCFG1_O_FCFG1_REVISION register //! //! \return Returns the trim value. // @@ -189,7 +212,7 @@ extern uint32_t SetupGetTrimForAmpcompTh2( void ); // //! \brief Returns the trim value to be used for the ANABYPASS_VALUE1 register in OSC_DIG. //! -//! \param ccfg_ModeConfReg +//! \param ccfg_ModeConfReg is the value of the CCFG_O_MODE_CONF_1 register //! //! \return Returns the trim value. // @@ -200,7 +223,7 @@ extern uint32_t SetupGetTrimForAnabypassValue1( uint32_t ccfg_ModeConfReg ); // //! \brief Returns the trim value from FCFG1 to be used as DBLR_LOOP_FILTER_RESET_VOLTAGE setting. //! -//! \param ui32Fcfg1Revision +//! \param ui32Fcfg1Revision is the value of the FCFG1_O_FCFG1_REVISION register //! //! \return Returns the trim value from FCFG1. // @@ -211,7 +234,7 @@ extern uint32_t SetupGetTrimForDblrLoopFilterResetVoltage( uint32_t ui32Fcfg1Rev // //! \brief Returns the trim value to be used for the RADCEXTCFG register in OSC_DIG. //! -//! \param ui32Fcfg1Revision +//! \param ui32Fcfg1Revision is the value of the FCFG1_O_FCFG1_REVISION register //! //! \return Returns the trim value. // @@ -222,7 +245,7 @@ extern uint32_t SetupGetTrimForRadcExtCfg( uint32_t ui32Fcfg1Revision ); // //! \brief Returns the FCFG1 OSC_CONF_ATESTLF_RCOSCLF_IBIAS_TRIM. //! -//! \param ui32Fcfg1Revision +//! \param ui32Fcfg1Revision is the value of the FCFG1_O_FCFG1_REVISION register //! //! \return Returns the trim value from FCFG1. // @@ -243,7 +266,7 @@ extern uint32_t SetupGetTrimForRcOscLfRtuneCtuneTrim( void ); // //! \brief Returns the trim value to be used for the XOSCHFCTL register in OSC_DIG. //! -//! \param ui32Fcfg1Revision +//! \param ui32Fcfg1Revision is the value of the FCFG1_O_FCFG1_REVISION register //! //! \return Returns the trim value. // @@ -274,7 +297,7 @@ extern uint32_t SetupGetTrimForXoscHfIbiastherm( void ); //! \brief Returns XOSCLF_REGULATOR_TRIM and XOSCLF_CMIRRWR_RATIO as one packet //! spanning bits [5:0] in the returned value. //! -//! \param ui32Fcfg1Revision +//! \param ui32Fcfg1Revision is the value of the FCFG1_O_FCFG1_REVISION register //! //! \return Returns XOSCLF_REGULATOR_TRIM and XOSCLF_CMIRRWR_RATIO as one packet. // diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/sys_ctrl.c b/third_party/ti/devices/cc13x2_cc26x2/driverlib/sys_ctrl.c index 3cfefa8c6..1dd35f40e 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/sys_ctrl.c +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/sys_ctrl.c @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: sys_ctrl.c -* Revised: 2017-11-07 11:56:04 +0100 (Tue, 07 Nov 2017) -* Revision: 50203 +* Revised: 2018-06-26 15:19:11 +0200 (Tue, 26 Jun 2018) +* Revision: 52220 * * Description: Driver for the System Control. * @@ -199,13 +199,8 @@ void SysCtrlStandby(bool retainCache, uint32_t vimsPdMode, uint32_t rechargeMode // adaptive recharge mode and fixed parameter values if(rechargeMode == SYSCTRL_PREFERRED_RECHARGE_MODE) { - if (( HWREG( FCFG1_BASE + FCFG1_O_TFW_FT ) % 10000 ) >= 683 ) { - // Enable the Recharge Comparator - HWREG(AON_PMCTL_BASE + AON_PMCTL_O_RECHARGECFG) = AON_PMCTL_RECHARGECFG_MODE_COMPARATOR; - } else { - // Set conservative recharge mode - HWREG(AON_PMCTL_BASE + AON_PMCTL_O_RECHARGECFG) = 0x80A4E708; - } + // Enable the Recharge Comparator + HWREG(AON_PMCTL_BASE + AON_PMCTL_O_RECHARGECFG) = AON_PMCTL_RECHARGECFG_MODE_COMPARATOR; } else { diff --git a/third_party/ti/devices/cc13x2_cc26x2/driverlib/sys_ctrl.h b/third_party/ti/devices/cc13x2_cc26x2/driverlib/sys_ctrl.h index 4742ba8d1..6dbe83184 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/driverlib/sys_ctrl.h +++ b/third_party/ti/devices/cc13x2_cc26x2/driverlib/sys_ctrl.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: sys_ctrl.h -* Revised: 2017-11-07 11:56:04 +0100 (Tue, 07 Nov 2017) -* Revision: 50203 +* Revised: 2018-09-17 14:58:51 +0200 (Mon, 17 Sep 2018) +* Revision: 52634 * * Description: Defines and prototypes for the System Controller. * diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_adi_2_refsys.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_adi_2_refsys.h index 0d4602506..68d37bde9 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_adi_2_refsys.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_adi_2_refsys.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_adi_2_refsys_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_adi_3_refsys.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_adi_3_refsys.h index d95f3058c..2315d8d55 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_adi_3_refsys.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_adi_3_refsys.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_adi_3_refsys_h -* Revised: 2017-02-18 14:22:30 +0100 (Sat, 18 Feb 2017) -* Revision: 48483 +* Revised: 2018-09-27 10:33:21 +0200 (Thu, 27 Sep 2018) +* Revision: 52772 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. @@ -67,7 +67,7 @@ // DCDC Control 2 #define ADI_3_REFSYS_O_DCDCCTL2 0x00000008 -// DCDC Control 3 +// Internal #define ADI_3_REFSYS_O_DCDCCTL3 0x00000009 // Internal @@ -451,6 +451,22 @@ // Register: ADI_3_REFSYS_O_DCDCCTL3 // //***************************************************************************** +// Field: [1:0] VDDR_BOOST_COMP +// +// Internal. Only to be used through TI provided API. +// ENUMs: +// BOOST_P1 Internal. Only to be used through TI provided API. +// BOOST Internal. Only to be used through TI provided API. +// BOOST_N1 Internal. Only to be used through TI provided API. +// DEFAULT Internal. Only to be used through TI provided API. +#define ADI_3_REFSYS_DCDCCTL3_VDDR_BOOST_COMP_W 2 +#define ADI_3_REFSYS_DCDCCTL3_VDDR_BOOST_COMP_M 0x00000003 +#define ADI_3_REFSYS_DCDCCTL3_VDDR_BOOST_COMP_S 0 +#define ADI_3_REFSYS_DCDCCTL3_VDDR_BOOST_COMP_BOOST_P1 0x00000003 +#define ADI_3_REFSYS_DCDCCTL3_VDDR_BOOST_COMP_BOOST 0x00000002 +#define ADI_3_REFSYS_DCDCCTL3_VDDR_BOOST_COMP_BOOST_N1 0x00000001 +#define ADI_3_REFSYS_DCDCCTL3_VDDR_BOOST_COMP_DEFAULT 0x00000000 + //***************************************************************************** // // Register: ADI_3_REFSYS_O_DCDCCTL4 diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_adi_4_aux.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_adi_4_aux.h index 237df6496..45fdfc31b 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_adi_4_aux.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_adi_4_aux.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_adi_4_aux_h -* Revised: 2017-05-04 11:51:48 +0200 (Thu, 04 May 2017) -* Revision: 48895 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. @@ -76,6 +76,9 @@ // ADC Reference 1 #define ADI_4_AUX_O_ADCREF1 0x0000000B +// Internal +#define ADI_4_AUX_O_LPMBIAS 0x0000000E + //***************************************************************************** // // Register: ADI_4_AUX_O_MUX0 @@ -272,6 +275,13 @@ #define ADI_4_AUX_COMP_COMPA_REF_CURR_EN_M 0x00000040 #define ADI_4_AUX_COMP_COMPA_REF_CURR_EN_S 6 +// Field: [5:3] LPM_BIAS_WIDTH_TRIM +// +// Internal. Only to be used through TI provided API. +#define ADI_4_AUX_COMP_LPM_BIAS_WIDTH_TRIM_W 3 +#define ADI_4_AUX_COMP_LPM_BIAS_WIDTH_TRIM_M 0x00000038 +#define ADI_4_AUX_COMP_LPM_BIAS_WIDTH_TRIM_S 3 + // Field: [2] COMPB_EN // // COMPB enable @@ -421,9 +431,14 @@ //***************************************************************************** // Field: [6] REF_ON_IDLE // -// Keep ADCREF powered up in IDLE state when ADC0.SMPL_MODE = 0. +// Enable ADCREF in IDLE state. // -// Set to 1 if ADC0.SMPL_CYCLE_EXP is less than 6 (21.3us sampling time) +// 0: Disabled in IDLE state +// 1: Enabled in IDLE state +// +// Keep ADCREF enabled when ADC0.SMPL_MODE = 0. +// Recommendation: Enable ADCREF always when ADC0.SMPL_CYCLE_EXP is less than +// 0x6 (21.3us sampling time). #define ADI_4_AUX_ADCREF0_REF_ON_IDLE 0x00000040 #define ADI_4_AUX_ADCREF0_REF_ON_IDLE_M 0x00000040 #define ADI_4_AUX_ADCREF0_REF_ON_IDLE_S 6 @@ -482,5 +497,17 @@ #define ADI_4_AUX_ADCREF1_VTRIM_M 0x0000003F #define ADI_4_AUX_ADCREF1_VTRIM_S 0 +//***************************************************************************** +// +// Register: ADI_4_AUX_O_LPMBIAS +// +//***************************************************************************** +// Field: [5:0] LPM_TRIM_IOUT +// +// Internal. Only to be used through TI provided API. +#define ADI_4_AUX_LPMBIAS_LPM_TRIM_IOUT_W 6 +#define ADI_4_AUX_LPMBIAS_LPM_TRIM_IOUT_M 0x0000003F +#define ADI_4_AUX_LPMBIAS_LPM_TRIM_IOUT_S 0 + #endif // __ADI_4_AUX__ diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aon_batmon.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aon_batmon.h index c482c44cc..ded130e50 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aon_batmon.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aon_batmon.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_aon_batmon_h -* Revised: 2017-05-16 19:35:21 +0200 (Tue, 16 May 2017) -* Revision: 49005 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aon_event.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aon_event.h index 05e86ed53..81c93f387 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aon_event.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aon_event.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_aon_event_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aon_ioc.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aon_ioc.h index 11c2d5c1c..d2e6d1f4f 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aon_ioc.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aon_ioc.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_aon_ioc_h -* Revised: 2017-05-18 09:01:49 +0200 (Thu, 18 May 2017) -* Revision: 49008 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aon_pmctl.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aon_pmctl.h index a057f9693..e97121777 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aon_pmctl.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aon_pmctl.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_aon_pmctl_h -* Revised: 2018-04-16 11:16:52 +0200 (Mon, 16 Apr 2018) -* Revision: 51887 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aon_rtc.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aon_rtc.h index 8bdb43091..1718015db 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aon_rtc.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aon_rtc.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_aon_rtc_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_aiodio.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_aiodio.h index 7c725d795..a66a0d5d6 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_aiodio.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_aiodio.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_aux_aiodio_h -* Revised: 2017-05-16 19:35:21 +0200 (Tue, 16 May 2017) -* Revision: 49005 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_anaif.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_anaif.h index c14c12fca..8b08db3d2 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_anaif.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_anaif.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_aux_anaif_h -* Revised: 2017-09-14 10:33:07 +0200 (Thu, 14 Sep 2017) -* Revision: 49733 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_evctl.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_evctl.h index 2dbd185a6..b92db6443 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_evctl.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_evctl.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_aux_evctl_h -* Revised: 2018-04-16 11:16:52 +0200 (Mon, 16 Apr 2018) -* Revision: 51887 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_mac.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_mac.h index b78856b56..83dea0bb8 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_mac.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_mac.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_aux_mac_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_ram.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_ram.h index 7a627e923..6a20b9156 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_ram.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_ram.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_aux_ram_h -* Revised: 2017-05-06 20:38:09 +0200 (Sat, 06 May 2017) -* Revision: 48921 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_sce.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_sce.h index 717133003..39f175867 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_sce.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_sce.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_aux_sce_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_smph.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_smph.h index a49d041d0..0bee0c53b 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_smph.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_smph.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_aux_smph_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_spim.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_spim.h index 1dd7aa6ef..c2f354da7 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_spim.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_spim.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_aux_spim_h -* Revised: 2017-05-16 19:35:21 +0200 (Tue, 16 May 2017) -* Revision: 49005 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_sysif.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_sysif.h index 970c78a68..a3de3f94f 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_sysif.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_sysif.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_aux_sysif_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_tdc.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_tdc.h index 17213e3b5..002d740a5 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_tdc.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_tdc.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_aux_tdc_h -* Revised: 2017-05-16 19:35:21 +0200 (Tue, 16 May 2017) -* Revision: 49005 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_timer01.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_timer01.h index 8c5c5621e..288a8fd82 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_timer01.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_timer01.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_aux_timer01_h -* Revised: 2017-05-22 18:50:33 +0200 (Mon, 22 May 2017) -* Revision: 49040 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_timer2.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_timer2.h index ce327a28e..aa7423f4d 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_timer2.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_aux_timer2.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_aux_timer2_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ccfg.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ccfg.h index b26c525b6..568eca055 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ccfg.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ccfg.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_ccfg_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-10-19 08:48:09 +0200 (Fri, 19 Oct 2018) +* Revision: 52957 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. @@ -415,9 +415,7 @@ // Field: [19:18] XOSC_FREQ // -// Reserved for future use. Software should not rely on the value of a -// reserved. Writing any other value than the reset/default value may result in -// undefined behavior. +// Selects high precision HF oscillator (activated when using the radio). // ENUMs: // 24M 24 MHz XOSC_HF // 48M 48 MHz XOSC_HF diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ccfg_simple_struct.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ccfg_simple_struct.h index 172c48f6a..59fec5862 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ccfg_simple_struct.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ccfg_simple_struct.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_ccfg_simple_struct_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_chip_def.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_chip_def.h index 1b68415c2..19f70e087 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_chip_def.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_chip_def.h @@ -195,7 +195,7 @@ extern "C" #define CC_GET_CHIP_FAMILY 0x26 #define CC_GET_CHIP_OPTION 0x3 -#define CC_GET_CHIP_HWREV 0x10 +#define CC_GET_CHIP_HWREV 0x20 #ifdef CC_CHIP_ID /* Define chip package only if specified */ diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_dwt.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_dwt.h index bc991e4b3..fa62b893f 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_dwt.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_dwt.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_cpu_dwt_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_fpb.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_fpb.h index 2355dfb23..efc475c58 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_fpb.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_fpb.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_cpu_fpb_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_itm.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_itm.h index 6fd74b1c4..430c0b0df 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_itm.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_itm.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_cpu_itm_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_rom_table.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_rom_table.h index 8744cbb00..e9e9e0606 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_rom_table.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_rom_table.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_cpu_rom_table_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_scs.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_scs.h index b173612d1..2906f4432 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_scs.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_scs.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_cpu_scs_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_tiprop.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_tiprop.h index dc0cd2071..29e314e16 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_tiprop.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_tiprop.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_cpu_tiprop_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_tpiu.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_tpiu.h index 04c1933dc..43c7c8e80 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_tpiu.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_cpu_tpiu.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_cpu_tpiu_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_crypto.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_crypto.h index 04984d1a4..2952afda1 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_crypto.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_crypto.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_crypto_h -* Revised: 2017-05-04 11:51:48 +0200 (Thu, 04 May 2017) -* Revision: 48895 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ddi_0_osc.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ddi_0_osc.h index 36d5c09fe..ee49e2709 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ddi_0_osc.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ddi_0_osc.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_ddi_0_osc_h -* Revised: 2017-05-04 11:51:48 +0200 (Thu, 04 May 2017) -* Revision: 48895 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_event.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_event.h index de107b545..754774f01 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_event.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_event.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_event_h -* Revised: 2017-05-16 19:35:21 +0200 (Tue, 16 May 2017) -* Revision: 49005 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_fcfg1.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_fcfg1.h index cf8607cd8..cd6cb570d 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_fcfg1.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_fcfg1.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_fcfg1_h -* Revised: 2018-04-16 11:16:52 +0200 (Mon, 16 Apr 2018) -* Revision: 51887 +* Revised: 2018-11-06 14:08:24 +0100 (Tue, 06 Nov 2018) +* Revision: 53237 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. @@ -49,6 +49,21 @@ // Internal #define FCFG1_O_MISC_CONF_2 0x000000A4 +// Internal +#define FCFG1_O_HPOSC_MEAS_5 0x000000B0 + +// Internal +#define FCFG1_O_HPOSC_MEAS_4 0x000000B4 + +// Internal +#define FCFG1_O_HPOSC_MEAS_3 0x000000B8 + +// Internal +#define FCFG1_O_HPOSC_MEAS_2 0x000000BC + +// Internal +#define FCFG1_O_HPOSC_MEAS_1 0x000000C0 + // Internal #define FCFG1_O_CONFIG_CC26_FE 0x000000C4 @@ -226,40 +241,16 @@ // Internal #define FCFG1_O_MISC_OTP_DATA_1 0x00000398 -// Power Down Current Control 20C -#define FCFG1_O_PWD_CURR_20C 0x0000039C - -// Power Down Current Control 35C -#define FCFG1_O_PWD_CURR_35C 0x000003A0 - -// Power Down Current Control 50C -#define FCFG1_O_PWD_CURR_50C 0x000003A4 - -// Power Down Current Control 65C -#define FCFG1_O_PWD_CURR_65C 0x000003A8 - -// Power Down Current Control 80C -#define FCFG1_O_PWD_CURR_80C 0x000003AC - -// Power Down Current Control 95C -#define FCFG1_O_PWD_CURR_95C 0x000003B0 - -// Power Down Current Control 110C -#define FCFG1_O_PWD_CURR_110C 0x000003B4 - -// Power Down Current Control 125C -#define FCFG1_O_PWD_CURR_125C 0x000003B8 - -// Shadow of EFUSE:DIE_ID_0 +// Shadow of EFUSE:DIE_ID_0 register #define FCFG1_O_SHDW_DIE_ID_0 0x000003D0 -// Shadow of EFUSE:DIE_ID_1 +// Shadow of EFUSE:DIE_ID_1 register #define FCFG1_O_SHDW_DIE_ID_1 0x000003D4 -// Shadow of EFUSE:DIE_ID_2 +// Shadow of EFUSE:DIE_ID_2 register #define FCFG1_O_SHDW_DIE_ID_2 0x000003D8 -// Shadow of EFUSE:DIE_ID_3 +// Shadow of EFUSE:DIE_ID_3 register #define FCFG1_O_SHDW_DIE_ID_3 0x000003DC // Internal @@ -316,6 +307,136 @@ #define FCFG1_MISC_CONF_2_HPOSC_COMP_P3_M 0x000000FF #define FCFG1_MISC_CONF_2_HPOSC_COMP_P3_S 0 +//***************************************************************************** +// +// Register: FCFG1_O_HPOSC_MEAS_5 +// +//***************************************************************************** +// Field: [31:16] HPOSC_D5 +// +// Internal. Only to be used through TI provided API. +#define FCFG1_HPOSC_MEAS_5_HPOSC_D5_W 16 +#define FCFG1_HPOSC_MEAS_5_HPOSC_D5_M 0xFFFF0000 +#define FCFG1_HPOSC_MEAS_5_HPOSC_D5_S 16 + +// Field: [15:8] HPOSC_T5 +// +// Internal. Only to be used through TI provided API. +#define FCFG1_HPOSC_MEAS_5_HPOSC_T5_W 8 +#define FCFG1_HPOSC_MEAS_5_HPOSC_T5_M 0x0000FF00 +#define FCFG1_HPOSC_MEAS_5_HPOSC_T5_S 8 + +// Field: [7:0] HPOSC_DT5 +// +// Internal. Only to be used through TI provided API. +#define FCFG1_HPOSC_MEAS_5_HPOSC_DT5_W 8 +#define FCFG1_HPOSC_MEAS_5_HPOSC_DT5_M 0x000000FF +#define FCFG1_HPOSC_MEAS_5_HPOSC_DT5_S 0 + +//***************************************************************************** +// +// Register: FCFG1_O_HPOSC_MEAS_4 +// +//***************************************************************************** +// Field: [31:16] HPOSC_D4 +// +// Internal. Only to be used through TI provided API. +#define FCFG1_HPOSC_MEAS_4_HPOSC_D4_W 16 +#define FCFG1_HPOSC_MEAS_4_HPOSC_D4_M 0xFFFF0000 +#define FCFG1_HPOSC_MEAS_4_HPOSC_D4_S 16 + +// Field: [15:8] HPOSC_T4 +// +// Internal. Only to be used through TI provided API. +#define FCFG1_HPOSC_MEAS_4_HPOSC_T4_W 8 +#define FCFG1_HPOSC_MEAS_4_HPOSC_T4_M 0x0000FF00 +#define FCFG1_HPOSC_MEAS_4_HPOSC_T4_S 8 + +// Field: [7:0] HPOSC_DT4 +// +// Internal. Only to be used through TI provided API. +#define FCFG1_HPOSC_MEAS_4_HPOSC_DT4_W 8 +#define FCFG1_HPOSC_MEAS_4_HPOSC_DT4_M 0x000000FF +#define FCFG1_HPOSC_MEAS_4_HPOSC_DT4_S 0 + +//***************************************************************************** +// +// Register: FCFG1_O_HPOSC_MEAS_3 +// +//***************************************************************************** +// Field: [31:16] HPOSC_D3 +// +// Internal. Only to be used through TI provided API. +#define FCFG1_HPOSC_MEAS_3_HPOSC_D3_W 16 +#define FCFG1_HPOSC_MEAS_3_HPOSC_D3_M 0xFFFF0000 +#define FCFG1_HPOSC_MEAS_3_HPOSC_D3_S 16 + +// Field: [15:8] HPOSC_T3 +// +// Internal. Only to be used through TI provided API. +#define FCFG1_HPOSC_MEAS_3_HPOSC_T3_W 8 +#define FCFG1_HPOSC_MEAS_3_HPOSC_T3_M 0x0000FF00 +#define FCFG1_HPOSC_MEAS_3_HPOSC_T3_S 8 + +// Field: [7:0] HPOSC_DT3 +// +// Internal. Only to be used through TI provided API. +#define FCFG1_HPOSC_MEAS_3_HPOSC_DT3_W 8 +#define FCFG1_HPOSC_MEAS_3_HPOSC_DT3_M 0x000000FF +#define FCFG1_HPOSC_MEAS_3_HPOSC_DT3_S 0 + +//***************************************************************************** +// +// Register: FCFG1_O_HPOSC_MEAS_2 +// +//***************************************************************************** +// Field: [31:16] HPOSC_D2 +// +// Internal. Only to be used through TI provided API. +#define FCFG1_HPOSC_MEAS_2_HPOSC_D2_W 16 +#define FCFG1_HPOSC_MEAS_2_HPOSC_D2_M 0xFFFF0000 +#define FCFG1_HPOSC_MEAS_2_HPOSC_D2_S 16 + +// Field: [15:8] HPOSC_T2 +// +// Internal. Only to be used through TI provided API. +#define FCFG1_HPOSC_MEAS_2_HPOSC_T2_W 8 +#define FCFG1_HPOSC_MEAS_2_HPOSC_T2_M 0x0000FF00 +#define FCFG1_HPOSC_MEAS_2_HPOSC_T2_S 8 + +// Field: [7:0] HPOSC_DT2 +// +// Internal. Only to be used through TI provided API. +#define FCFG1_HPOSC_MEAS_2_HPOSC_DT2_W 8 +#define FCFG1_HPOSC_MEAS_2_HPOSC_DT2_M 0x000000FF +#define FCFG1_HPOSC_MEAS_2_HPOSC_DT2_S 0 + +//***************************************************************************** +// +// Register: FCFG1_O_HPOSC_MEAS_1 +// +//***************************************************************************** +// Field: [31:16] HPOSC_D1 +// +// Internal. Only to be used through TI provided API. +#define FCFG1_HPOSC_MEAS_1_HPOSC_D1_W 16 +#define FCFG1_HPOSC_MEAS_1_HPOSC_D1_M 0xFFFF0000 +#define FCFG1_HPOSC_MEAS_1_HPOSC_D1_S 16 + +// Field: [15:8] HPOSC_T1 +// +// Internal. Only to be used through TI provided API. +#define FCFG1_HPOSC_MEAS_1_HPOSC_T1_W 8 +#define FCFG1_HPOSC_MEAS_1_HPOSC_T1_M 0x0000FF00 +#define FCFG1_HPOSC_MEAS_1_HPOSC_T1_S 8 + +// Field: [7:0] HPOSC_DT1 +// +// Internal. Only to be used through TI provided API. +#define FCFG1_HPOSC_MEAS_1_HPOSC_DT1_W 8 +#define FCFG1_HPOSC_MEAS_1_HPOSC_DT1_M 0x000000FF +#define FCFG1_HPOSC_MEAS_1_HPOSC_DT1_S 0 + //***************************************************************************** // // Register: FCFG1_O_CONFIG_CC26_FE @@ -1360,11 +1481,7 @@ //***************************************************************************** // Field: [31:28] PG_REV // -// Field used to distinguish revisions of the device. -// -// 0: Silicon revision 1.0 -// 1: Silicon revision 1.01 -// 2: Silicon revision 1.1 +// Field used to distinguish revisions of the device #define FCFG1_USER_ID_PG_REV_W 4 #define FCFG1_USER_ID_PG_REV_M 0xF0000000 #define FCFG1_USER_ID_PG_REV_S 28 @@ -1879,10 +1996,6 @@ // Field: [31:28] PG_REV // // Field used to distinguish revisions of the device. -// -// 0: Silicon revision 1.0 -// 1: Silicon revision 1.01 -// 2: Silicon revision 1.1 #define FCFG1_ICEPICK_DEVICE_ID_PG_REV_W 4 #define FCFG1_ICEPICK_DEVICE_ID_PG_REV_M 0xF0000000 #define FCFG1_ICEPICK_DEVICE_ID_PG_REV_S 28 @@ -1953,15 +2066,6 @@ #define FCFG1_MISC_OTP_DATA_PER_E_M 0x00007000 #define FCFG1_MISC_OTP_DATA_PER_E_S 12 -// Field: [7:0] TEST_PROGRAM_REV -// -// The revision of the test program used in the production process when FCFG1 -// was programmed. -// Value migth change without warning. -#define FCFG1_MISC_OTP_DATA_TEST_PROGRAM_REV_W 8 -#define FCFG1_MISC_OTP_DATA_TEST_PROGRAM_REV_M 0x000000FF -#define FCFG1_MISC_OTP_DATA_TEST_PROGRAM_REV_S 0 - //***************************************************************************** // // Register: FCFG1_O_IOCONF @@ -2488,278 +2592,6 @@ #define FCFG1_MISC_OTP_DATA_1_IDAC_STEP_M 0x0000000F #define FCFG1_MISC_OTP_DATA_1_IDAC_STEP_S 0 -//***************************************************************************** -// -// Register: FCFG1_O_PWD_CURR_20C -// -//***************************************************************************** -// Field: [31:24] DELTA_CACHE_REF -// -// Additional maximum current, in units of 1uA, with cache retention -#define FCFG1_PWD_CURR_20C_DELTA_CACHE_REF_W 8 -#define FCFG1_PWD_CURR_20C_DELTA_CACHE_REF_M 0xFF000000 -#define FCFG1_PWD_CURR_20C_DELTA_CACHE_REF_S 24 - -// Field: [23:16] DELTA_RFMEM_RET -// -// Additional maximum current, in 1uA units, with RF memory retention -#define FCFG1_PWD_CURR_20C_DELTA_RFMEM_RET_W 8 -#define FCFG1_PWD_CURR_20C_DELTA_RFMEM_RET_M 0x00FF0000 -#define FCFG1_PWD_CURR_20C_DELTA_RFMEM_RET_S 16 - -// Field: [15:8] DELTA_XOSC_LPM -// -// Additional maximum current, in units of 1uA, with XOSC_HF on in low-power -// mode -#define FCFG1_PWD_CURR_20C_DELTA_XOSC_LPM_W 8 -#define FCFG1_PWD_CURR_20C_DELTA_XOSC_LPM_M 0x0000FF00 -#define FCFG1_PWD_CURR_20C_DELTA_XOSC_LPM_S 8 - -// Field: [7:0] BASELINE -// -// Worst-case baseline maximum powerdown current, in units of 0.5uA -#define FCFG1_PWD_CURR_20C_BASELINE_W 8 -#define FCFG1_PWD_CURR_20C_BASELINE_M 0x000000FF -#define FCFG1_PWD_CURR_20C_BASELINE_S 0 - -//***************************************************************************** -// -// Register: FCFG1_O_PWD_CURR_35C -// -//***************************************************************************** -// Field: [31:24] DELTA_CACHE_REF -// -// Additional maximum current, in units of 1uA, with cache retention -#define FCFG1_PWD_CURR_35C_DELTA_CACHE_REF_W 8 -#define FCFG1_PWD_CURR_35C_DELTA_CACHE_REF_M 0xFF000000 -#define FCFG1_PWD_CURR_35C_DELTA_CACHE_REF_S 24 - -// Field: [23:16] DELTA_RFMEM_RET -// -// Additional maximum current, in 1uA units, with RF memory retention -#define FCFG1_PWD_CURR_35C_DELTA_RFMEM_RET_W 8 -#define FCFG1_PWD_CURR_35C_DELTA_RFMEM_RET_M 0x00FF0000 -#define FCFG1_PWD_CURR_35C_DELTA_RFMEM_RET_S 16 - -// Field: [15:8] DELTA_XOSC_LPM -// -// Additional maximum current, in units of 1uA, with XOSC_HF on in low-power -// mode -#define FCFG1_PWD_CURR_35C_DELTA_XOSC_LPM_W 8 -#define FCFG1_PWD_CURR_35C_DELTA_XOSC_LPM_M 0x0000FF00 -#define FCFG1_PWD_CURR_35C_DELTA_XOSC_LPM_S 8 - -// Field: [7:0] BASELINE -// -// Worst-case baseline maximum powerdown current, in units of 0.5uA -#define FCFG1_PWD_CURR_35C_BASELINE_W 8 -#define FCFG1_PWD_CURR_35C_BASELINE_M 0x000000FF -#define FCFG1_PWD_CURR_35C_BASELINE_S 0 - -//***************************************************************************** -// -// Register: FCFG1_O_PWD_CURR_50C -// -//***************************************************************************** -// Field: [31:24] DELTA_CACHE_REF -// -// Additional maximum current, in units of 1uA, with cache retention -#define FCFG1_PWD_CURR_50C_DELTA_CACHE_REF_W 8 -#define FCFG1_PWD_CURR_50C_DELTA_CACHE_REF_M 0xFF000000 -#define FCFG1_PWD_CURR_50C_DELTA_CACHE_REF_S 24 - -// Field: [23:16] DELTA_RFMEM_RET -// -// Additional maximum current, in 1uA units, with RF memory retention -#define FCFG1_PWD_CURR_50C_DELTA_RFMEM_RET_W 8 -#define FCFG1_PWD_CURR_50C_DELTA_RFMEM_RET_M 0x00FF0000 -#define FCFG1_PWD_CURR_50C_DELTA_RFMEM_RET_S 16 - -// Field: [15:8] DELTA_XOSC_LPM -// -// Additional maximum current, in units of 1uA, with XOSC_HF on in low-power -// mode -#define FCFG1_PWD_CURR_50C_DELTA_XOSC_LPM_W 8 -#define FCFG1_PWD_CURR_50C_DELTA_XOSC_LPM_M 0x0000FF00 -#define FCFG1_PWD_CURR_50C_DELTA_XOSC_LPM_S 8 - -// Field: [7:0] BASELINE -// -// Worst-case baseline maximum powerdown current, in units of 0.5uA -#define FCFG1_PWD_CURR_50C_BASELINE_W 8 -#define FCFG1_PWD_CURR_50C_BASELINE_M 0x000000FF -#define FCFG1_PWD_CURR_50C_BASELINE_S 0 - -//***************************************************************************** -// -// Register: FCFG1_O_PWD_CURR_65C -// -//***************************************************************************** -// Field: [31:24] DELTA_CACHE_REF -// -// Additional maximum current, in units of 1uA, with cache retention -#define FCFG1_PWD_CURR_65C_DELTA_CACHE_REF_W 8 -#define FCFG1_PWD_CURR_65C_DELTA_CACHE_REF_M 0xFF000000 -#define FCFG1_PWD_CURR_65C_DELTA_CACHE_REF_S 24 - -// Field: [23:16] DELTA_RFMEM_RET -// -// Additional maximum current, in 1uA units, with RF memory retention -#define FCFG1_PWD_CURR_65C_DELTA_RFMEM_RET_W 8 -#define FCFG1_PWD_CURR_65C_DELTA_RFMEM_RET_M 0x00FF0000 -#define FCFG1_PWD_CURR_65C_DELTA_RFMEM_RET_S 16 - -// Field: [15:8] DELTA_XOSC_LPM -// -// Additional maximum current, in units of 1uA, with XOSC_HF on in low-power -// mode -#define FCFG1_PWD_CURR_65C_DELTA_XOSC_LPM_W 8 -#define FCFG1_PWD_CURR_65C_DELTA_XOSC_LPM_M 0x0000FF00 -#define FCFG1_PWD_CURR_65C_DELTA_XOSC_LPM_S 8 - -// Field: [7:0] BASELINE -// -// Worst-case baseline maximum powerdown current, in units of 0.5uA -#define FCFG1_PWD_CURR_65C_BASELINE_W 8 -#define FCFG1_PWD_CURR_65C_BASELINE_M 0x000000FF -#define FCFG1_PWD_CURR_65C_BASELINE_S 0 - -//***************************************************************************** -// -// Register: FCFG1_O_PWD_CURR_80C -// -//***************************************************************************** -// Field: [31:24] DELTA_CACHE_REF -// -// Additional maximum current, in units of 1uA, with cache retention -#define FCFG1_PWD_CURR_80C_DELTA_CACHE_REF_W 8 -#define FCFG1_PWD_CURR_80C_DELTA_CACHE_REF_M 0xFF000000 -#define FCFG1_PWD_CURR_80C_DELTA_CACHE_REF_S 24 - -// Field: [23:16] DELTA_RFMEM_RET -// -// Additional maximum current, in 1uA units, with RF memory retention -#define FCFG1_PWD_CURR_80C_DELTA_RFMEM_RET_W 8 -#define FCFG1_PWD_CURR_80C_DELTA_RFMEM_RET_M 0x00FF0000 -#define FCFG1_PWD_CURR_80C_DELTA_RFMEM_RET_S 16 - -// Field: [15:8] DELTA_XOSC_LPM -// -// Additional maximum current, in units of 1uA, with XOSC_HF on in low-power -// mode -#define FCFG1_PWD_CURR_80C_DELTA_XOSC_LPM_W 8 -#define FCFG1_PWD_CURR_80C_DELTA_XOSC_LPM_M 0x0000FF00 -#define FCFG1_PWD_CURR_80C_DELTA_XOSC_LPM_S 8 - -// Field: [7:0] BASELINE -// -// Worst-case baseline maximum powerdown current, in units of 0.5uA -#define FCFG1_PWD_CURR_80C_BASELINE_W 8 -#define FCFG1_PWD_CURR_80C_BASELINE_M 0x000000FF -#define FCFG1_PWD_CURR_80C_BASELINE_S 0 - -//***************************************************************************** -// -// Register: FCFG1_O_PWD_CURR_95C -// -//***************************************************************************** -// Field: [31:24] DELTA_CACHE_REF -// -// Additional maximum current, in units of 1uA, with cache retention -#define FCFG1_PWD_CURR_95C_DELTA_CACHE_REF_W 8 -#define FCFG1_PWD_CURR_95C_DELTA_CACHE_REF_M 0xFF000000 -#define FCFG1_PWD_CURR_95C_DELTA_CACHE_REF_S 24 - -// Field: [23:16] DELTA_RFMEM_RET -// -// Additional maximum current, in 1uA units, with RF memory retention -#define FCFG1_PWD_CURR_95C_DELTA_RFMEM_RET_W 8 -#define FCFG1_PWD_CURR_95C_DELTA_RFMEM_RET_M 0x00FF0000 -#define FCFG1_PWD_CURR_95C_DELTA_RFMEM_RET_S 16 - -// Field: [15:8] DELTA_XOSC_LPM -// -// Additional maximum current, in units of 1uA, with XOSC_HF on in low-power -// mode -#define FCFG1_PWD_CURR_95C_DELTA_XOSC_LPM_W 8 -#define FCFG1_PWD_CURR_95C_DELTA_XOSC_LPM_M 0x0000FF00 -#define FCFG1_PWD_CURR_95C_DELTA_XOSC_LPM_S 8 - -// Field: [7:0] BASELINE -// -// Worst-case baseline maximum powerdown current, in units of 0.5uA -#define FCFG1_PWD_CURR_95C_BASELINE_W 8 -#define FCFG1_PWD_CURR_95C_BASELINE_M 0x000000FF -#define FCFG1_PWD_CURR_95C_BASELINE_S 0 - -//***************************************************************************** -// -// Register: FCFG1_O_PWD_CURR_110C -// -//***************************************************************************** -// Field: [31:24] DELTA_CACHE_REF -// -// Additional maximum current, in units of 1uA, with cache retention -#define FCFG1_PWD_CURR_110C_DELTA_CACHE_REF_W 8 -#define FCFG1_PWD_CURR_110C_DELTA_CACHE_REF_M 0xFF000000 -#define FCFG1_PWD_CURR_110C_DELTA_CACHE_REF_S 24 - -// Field: [23:16] DELTA_RFMEM_RET -// -// Additional maximum current, in 1uA units, with RF memory retention -#define FCFG1_PWD_CURR_110C_DELTA_RFMEM_RET_W 8 -#define FCFG1_PWD_CURR_110C_DELTA_RFMEM_RET_M 0x00FF0000 -#define FCFG1_PWD_CURR_110C_DELTA_RFMEM_RET_S 16 - -// Field: [15:8] DELTA_XOSC_LPM -// -// Additional maximum current, in units of 1uA, with XOSC_HF on in low-power -// mode -#define FCFG1_PWD_CURR_110C_DELTA_XOSC_LPM_W 8 -#define FCFG1_PWD_CURR_110C_DELTA_XOSC_LPM_M 0x0000FF00 -#define FCFG1_PWD_CURR_110C_DELTA_XOSC_LPM_S 8 - -// Field: [7:0] BASELINE -// -// Worst-case baseline maximum powerdown current, in units of 0.5uA -#define FCFG1_PWD_CURR_110C_BASELINE_W 8 -#define FCFG1_PWD_CURR_110C_BASELINE_M 0x000000FF -#define FCFG1_PWD_CURR_110C_BASELINE_S 0 - -//***************************************************************************** -// -// Register: FCFG1_O_PWD_CURR_125C -// -//***************************************************************************** -// Field: [31:24] DELTA_CACHE_REF -// -// Additional maximum current, in units of 1uA, with cache retention -#define FCFG1_PWD_CURR_125C_DELTA_CACHE_REF_W 8 -#define FCFG1_PWD_CURR_125C_DELTA_CACHE_REF_M 0xFF000000 -#define FCFG1_PWD_CURR_125C_DELTA_CACHE_REF_S 24 - -// Field: [23:16] DELTA_RFMEM_RET -// -// Additional maximum current, in 1uA units, with RF memory retention -#define FCFG1_PWD_CURR_125C_DELTA_RFMEM_RET_W 8 -#define FCFG1_PWD_CURR_125C_DELTA_RFMEM_RET_M 0x00FF0000 -#define FCFG1_PWD_CURR_125C_DELTA_RFMEM_RET_S 16 - -// Field: [15:8] DELTA_XOSC_LPM -// -// Additional maximum current, in units of 1uA, with XOSC_HF on in low-power -// mode -#define FCFG1_PWD_CURR_125C_DELTA_XOSC_LPM_W 8 -#define FCFG1_PWD_CURR_125C_DELTA_XOSC_LPM_M 0x0000FF00 -#define FCFG1_PWD_CURR_125C_DELTA_XOSC_LPM_S 8 - -// Field: [7:0] BASELINE -// -// Worst-case baseline maximum powerdown current, in units of 0.5uA -#define FCFG1_PWD_CURR_125C_BASELINE_W 8 -#define FCFG1_PWD_CURR_125C_BASELINE_M 0x000000FF -#define FCFG1_PWD_CURR_125C_BASELINE_S 0 - //***************************************************************************** // // Register: FCFG1_O_SHDW_DIE_ID_0 @@ -2860,6 +2692,29 @@ // Register: FCFG1_O_SHDW_ANA_TRIM // //***************************************************************************** +// Field: [30] ALT_VDDR_TRIM +// +// Internal. Only to be used through TI provided API. +#define FCFG1_SHDW_ANA_TRIM_ALT_VDDR_TRIM 0x40000000 +#define FCFG1_SHDW_ANA_TRIM_ALT_VDDR_TRIM_BITN 30 +#define FCFG1_SHDW_ANA_TRIM_ALT_VDDR_TRIM_M 0x40000000 +#define FCFG1_SHDW_ANA_TRIM_ALT_VDDR_TRIM_S 30 + +// Field: [29] DET_LOGIC_DIS +// +// Internal. Only to be used through TI provided API. +#define FCFG1_SHDW_ANA_TRIM_DET_LOGIC_DIS 0x20000000 +#define FCFG1_SHDW_ANA_TRIM_DET_LOGIC_DIS_BITN 29 +#define FCFG1_SHDW_ANA_TRIM_DET_LOGIC_DIS_M 0x20000000 +#define FCFG1_SHDW_ANA_TRIM_DET_LOGIC_DIS_S 29 + +// Field: [28:27] BOD_BANDGAP_TRIM_CNF_EXT +// +// Internal. Only to be used through TI provided API. +#define FCFG1_SHDW_ANA_TRIM_BOD_BANDGAP_TRIM_CNF_EXT_W 2 +#define FCFG1_SHDW_ANA_TRIM_BOD_BANDGAP_TRIM_CNF_EXT_M 0x18000000 +#define FCFG1_SHDW_ANA_TRIM_BOD_BANDGAP_TRIM_CNF_EXT_S 27 + // Field: [26:25] BOD_BANDGAP_TRIM_CNF // // Internal. Only to be used through TI provided API. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_flash.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_flash.h index 6815a3d87..d7e03e795 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_flash.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_flash.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_flash_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_gpio.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_gpio.h index a5bfbbf9b..8ec4bfb7b 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_gpio.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_gpio.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_gpio_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_gpram.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_gpram.h index e21892a0c..1042a0f12 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_gpram.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_gpram.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_gpram_h -* Revised: 2017-05-06 20:38:09 +0200 (Sat, 06 May 2017) -* Revision: 48921 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_gpt.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_gpt.h index bf70bf343..5cf056ea5 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_gpt.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_gpt.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_gpt_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_i2c.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_i2c.h index 31842e275..7408570c5 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_i2c.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_i2c.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_i2c_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_i2s.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_i2s.h index 9886e95a6..c7ed79aa2 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_i2s.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_i2s.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_i2s_h -* Revised: 2017-11-02 10:21:28 +0100 (Thu, 02 Nov 2017) -* Revision: 50141 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ints.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ints.h index b5d10df81..940695eca 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ints.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ints.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_ints_h -* Revised: 2017-05-16 19:35:21 +0200 (Tue, 16 May 2017) -* Revision: 49005 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ioc.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ioc.h index dc02fb9e0..9e7c982a8 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ioc.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ioc.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_ioc_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_memmap.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_memmap.h index e634c600e..e8a9e8bae 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_memmap.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_memmap.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_memmap_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_pka.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_pka.h index f8039bb21..377f08e10 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_pka.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_pka.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_pka_h -* Revised: 2017-09-14 10:33:07 +0200 (Thu, 14 Sep 2017) -* Revision: 49733 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_pka_int.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_pka_int.h index e36409a39..159ea4c3b 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_pka_int.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_pka_int.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_pka_int_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_pka_ram.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_pka_ram.h index a19b23654..3a9c12cd0 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_pka_ram.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_pka_ram.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_pka_ram_h -* Revised: 2017-05-06 20:38:09 +0200 (Sat, 06 May 2017) -* Revision: 48921 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_prcm.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_prcm.h index eaf43ab1c..1aa7f034e 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_prcm.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_prcm.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_prcm_h -* Revised: 2017-09-14 10:33:07 +0200 (Thu, 14 Sep 2017) -* Revision: 49733 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_rfc_dbell.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_rfc_dbell.h index c586325f0..612d3ec24 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_rfc_dbell.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_rfc_dbell.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_rfc_dbell_h -* Revised: 2018-04-16 11:16:52 +0200 (Mon, 16 Apr 2018) -* Revision: 51887 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_rfc_pwr.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_rfc_pwr.h index d6313bcdf..355626efd 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_rfc_pwr.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_rfc_pwr.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_rfc_pwr_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_rfc_rat.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_rfc_rat.h index f3f6f1dcc..4f68d8d27 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_rfc_rat.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_rfc_rat.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_rfc_rat_h -* Revised: 2018-04-16 11:16:52 +0200 (Mon, 16 Apr 2018) -* Revision: 51887 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_rfc_ullram.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_rfc_ullram.h index c410c728f..0159b94b7 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_rfc_ullram.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_rfc_ullram.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_rfc_ullram_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_smph.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_smph.h index 06ee2f730..7bbdcd610 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_smph.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_smph.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_smph_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_sram_mmr.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_sram_mmr.h index c57de092e..80d642200 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_sram_mmr.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_sram_mmr.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_sram_mmr_h -* Revised: 2018-04-16 11:16:52 +0200 (Mon, 16 Apr 2018) -* Revision: 51887 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ssi.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ssi.h index 525f64ce2..403d6620a 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ssi.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_ssi.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_ssi_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_trng.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_trng.h index f02cb2bcd..44d4eb26d 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_trng.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_trng.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_trng_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_uart.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_uart.h index 3f3f9e056..b35541fb8 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_uart.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_uart.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_uart_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_udma.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_udma.h index e1aa1d9e2..2a4b161e3 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_udma.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_udma.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_udma_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_vims.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_vims.h index 70420b50f..e3de5ea6e 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_vims.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_vims.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_vims_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_wdt.h b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_wdt.h index 5125b9172..2c826ea81 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/inc/hw_wdt.h +++ b/third_party/ti/devices/cc13x2_cc26x2/inc/hw_wdt.h @@ -1,7 +1,7 @@ /****************************************************************************** * Filename: hw_wdt_h -* Revised: 2017-01-10 11:54:43 +0100 (Tue, 10 Jan 2017) -* Revision: 48190 +* Revised: 2018-05-14 12:24:52 +0200 (Mon, 14 May 2018) +* Revision: 51990 * * Copyright (c) 2015 - 2017, Texas Instruments Incorporated * All rights reserved. diff --git a/third_party/ti/devices/cc13x2_cc26x2/linker_files/cc26x2r1f.cmd b/third_party/ti/devices/cc13x2_cc26x2/linker_files/cc26x2r1f.cmd index fef203bb5..4362abdce 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/linker_files/cc26x2r1f.cmd +++ b/third_party/ti/devices/cc13x2_cc26x2/linker_files/cc26x2r1f.cmd @@ -1,9 +1,9 @@ //***************************************************************************** //! @file cc26x2r1f.cmd -//! @brief CC26x2R1F linker file for Code Composer Studio. +//! @brief CC26x2R1F rev2 linker file for Code Composer Studio. //! -//! Revised $Date: 2017-03-28 15:32:09 +0200 (ti, 28 mar 2017) $ -//! Revision $Revision: 17730 $ +//! Revised $Date$ +//! Revision $Revision$ // // This file is auto-generated. // diff --git a/third_party/ti/devices/cc13x2_cc26x2/linker_files/cc26x2r1f.icf b/third_party/ti/devices/cc13x2_cc26x2/linker_files/cc26x2r1f.icf index 181aa27f4..ef2d9888f 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/linker_files/cc26x2r1f.icf +++ b/third_party/ti/devices/cc13x2_cc26x2/linker_files/cc26x2r1f.icf @@ -1,9 +1,9 @@ //***************************************************************************** //! @file cc26x2r1f.icf -//! @brief CC26x2R1F linker file for IAR EWARM. +//! @brief CC26x2R1F rev2 linker file for IAR EWARM. //! -//! Revised $Date: 2017-02-06 11:55:41 +0100 (ma, 06 feb 2017) $ -//! Revision $Revision: 17642 $ +//! Revised $Date$ +//! Revision $Revision$ // // This file is auto-generated. // diff --git a/third_party/ti/devices/cc13x2_cc26x2/linker_files/cc26x2r1f.lds b/third_party/ti/devices/cc13x2_cc26x2/linker_files/cc26x2r1f.lds index c7523613b..2d36722e6 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/linker_files/cc26x2r1f.lds +++ b/third_party/ti/devices/cc13x2_cc26x2/linker_files/cc26x2r1f.lds @@ -1,9 +1,9 @@ /* @file cc26x2r1f.lds - @brief CC26x2R1F linker configuration file for GNU compiler. + @brief CC26x2R1F rev2 linker configuration file for GNU compiler. - Revised $Date: 2017-08-07 11:45:00 +0200 (ma, 07 aug 2017) $ - Revision $Revision: 17871 $ + Revised $Date$ + Revision $Revision$ This file is auto-generated. diff --git a/third_party/ti/devices/cc13x2_cc26x2/linker_files/cc26x2r1f.sct b/third_party/ti/devices/cc13x2_cc26x2/linker_files/cc26x2r1f.sct index b248f3fa5..f0ae96ed15 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/linker_files/cc26x2r1f.sct +++ b/third_party/ti/devices/cc13x2_cc26x2/linker_files/cc26x2r1f.sct @@ -1,9 +1,9 @@ ; /**************************************************************************** ; * @file cc26x2r1f.sct -; * @brief CC26x2R1F scatter loading file for ARM linker. +; * @brief CC26x2R1F rev2 scatter loading file for ARM linker. ; * -; * Revised $Date: 2017-02-06 11:55:41 +0100 (ma, 06 feb 2017) $ -; * Revision $Revision: 17642 $ +; * Revised $Date$ +; * Revision $Revision$ ; * ; * This file is auto-generated. ; * diff --git a/third_party/ti/devices/cc13x2_cc26x2/linker_files/cc26x2r1f_ram.icf b/third_party/ti/devices/cc13x2_cc26x2/linker_files/cc26x2r1f_ram.icf deleted file mode 100644 index 742819ec1..000000000 --- a/third_party/ti/devices/cc13x2_cc26x2/linker_files/cc26x2r1f_ram.icf +++ /dev/null @@ -1,143 +0,0 @@ -//***************************************************************************** -//! @file cc26x2r1f.icf -//! @brief CC26x2R1F linker file for IAR EWARM. -//! -//! Revised $Date: 2017-02-06 11:55:41 +0100 (ma, 06 feb 2017) $ -//! Revision $Revision: 17642 $ -// -// This file is auto-generated. -// -// Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/ -// -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Texas Instruments Incorporated nor the names of -// its contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -//****************************************************************************/ - - -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x20000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x00057FFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20013FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x800; -define symbol __ICFEDIT_size_heap__ = 0x1000; -/**** End of ICF editor section. ###ICF###*/ - -define symbol __GPRAM_START__ = 0x11000000; -define symbol __GPRAM_END__ = 0x11001FFF; - -// -// Define a memory region that covers the entire 4 GB addressable space of the -// processor. -// -define memory mem with size = 4G; - -// -// Define a region for the on-chip flash. -// -define region FLASH_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; - -// -// Define a region for the on-chip SRAM. -// -define region SRAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -// -// Place the interrupt vectors at the start of flash. -// -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -keep { section .intvec }; - -// -// Place the CCFG area at the end of flash -// -//place at end of FLASH_region { readonly section .ccfg }; -//keep { section .ccfg }; - -// -// Place remaining 'read only' in RAM -// -place in SRAM_region { readonly }; - - -// -// Place .vtable_ram in start of RAM -// -//place at start of SRAM_region { section .vtable_ram }; - -// -// Define CSTACK block to contain .stack section. This enables the IAR IDE -// to properly show the stack content during debug. Place stack at end of -// retention RAM, do not initialize (initializing the stack will destroy the -// return address from the initialization code, causing the processor to branch -// to zero and fault) -// -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { section .stack }; -place at end of SRAM_region { block CSTACK }; -do not initialize { section .stack, section .noinit}; - -// -// Export stack top symbol. Used by startup file. -// -define exported symbol STACK_TOP = __ICFEDIT_region_RAM_end__ + 1; - -// -// Define a block for the heap. The size should be set to something other -// than zero if things in the C library that require the heap are used. -// -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; -place in SRAM_region { block HEAP }; - -// -// Place all read/write items into RAM. -// -place in SRAM_region { readwrite }; -//initialize by copy { readwrite }; - -// -// The USE_TIRTOS_ROM symbol is defined internally in the build flow (using -// --config_def USE_TIRTOS_ROM=1) for TI-RTOS applications whose app.cfg file -// specifies to use the ROM. -// -if (isdefinedsymbol(USE_TIRTOS_ROM)) { - include "TIRTOS_ROM.icf"; -} - -// -// Define a region for the on-chip GPRAM/cache. -// Application can use this region as RAM if cache is disabled in the CCFG -// (DEFAULT_CCFG_SIZE_AND_DIS_FLAGS.SET_CCFG_SIZE_AND_DIS_FLAGS_DIS_GPRAM = 0) -// -define region GPRAM_region = mem:[from __GPRAM_START__ to __GPRAM_END__]; -place in GPRAM_region {section .gpram}; diff --git a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_ble.h b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_ble.h deleted file mode 100644 index bf7a27935..000000000 --- a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_ble.h +++ /dev/null @@ -1,321 +0,0 @@ -/****************************************************************************** -* Filename: rf_patch_cpe_ble.h -* Revised: $Date: 2018-05-07 15:02:01 +0200 (ma, 07 mai 2018) $ -* Revision: $Revision: 18438 $ -* -* Description: RF core patch for Bluetooth low energy version 4.0, 4.1, and 4.2 support ("BLE" API command set) in CC13x2 and CC26x2 -* -* Copyright (c) 2015-2018, Texas Instruments Incorporated -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* -* 1) Redistributions of source code must retain the above copyright notice, -* this list of conditions and the following disclaimer. -* -* 2) Redistributions in binary form must reproduce the above copyright notice, -* this list of conditions and the following disclaimer in the documentation -* and/or other materials provided with the distribution. -* -* 3) Neither the name of the ORGANIZATION nor the names of its contributors may -* be used to endorse or promote products derived from this software without -* specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -******************************************************************************/ -#ifndef _RF_PATCH_CPE_BLE_H -#define _RF_PATCH_CPE_BLE_H - -//***************************************************************************** -// -// If building with a C++ compiler, make all of the definitions in this header -// have a C binding. -// -//***************************************************************************** -#ifdef __cplusplus -extern "C" -{ -#endif - -#include -#include - -#ifndef CPE_PATCH_TYPE -#define CPE_PATCH_TYPE static const uint32_t -#endif - -#ifndef SYS_PATCH_TYPE -#define SYS_PATCH_TYPE static const uint32_t -#endif - -#ifndef PATCH_FUN_SPEC -#define PATCH_FUN_SPEC static inline -#endif - -#ifndef _APPLY_PATCH_TAB -#define _APPLY_PATCH_TAB -#endif - - -CPE_PATCH_TYPE patchImageBle[] = { - 0x210040c9, - 0x21004141, - 0x21004073, - 0x21004061, - 0x21004209, - 0x2100421d, - 0x21004237, - 0x210040ad, - 0xb081b5ff, - 0x9d0a4803, - 0xb5f84700, - 0x48024684, - 0x47004613, - 0x00007f43, - 0x00005145, - 0x2270480b, - 0x43916801, - 0x43112240, - 0x48096001, - 0x48094700, - 0x460c7801, - 0x43912208, - 0xf0007001, - 0x4805f803, - 0xbd107004, - 0x4804b510, - 0x00004700, - 0x40043018, - 0x0000710f, - 0x210000b3, - 0x00005603, - 0x4801b510, - 0x00004700, - 0x000009df, - 0x49044803, - 0x05c068c0, - 0x47880fc0, - 0x47084902, - 0x21000340, - 0x000087d1, - 0x000053cd, - 0x4614b5f8, - 0x9b06461a, - 0x46139300, - 0xf7ff4622, - 0x9000ffb5, - 0xd12d2800, - 0x6848492e, - 0xd0292800, - 0x00498809, - 0x43411b09, - 0x68c0482b, - 0x00640844, - 0x20187922, - 0xb2c61a80, - 0x04802001, - 0x0cc71808, - 0x46317965, - 0xf0004825, - 0x4824f8a1, - 0x19832201, - 0x408a1e69, - 0x21182000, - 0xe0071b8e, - 0x19090041, - 0x437988c9, - 0x40e91889, - 0x1c405419, - 0xdcf54286, - 0x4780481b, - 0xbdf89800, - 0xf7ffb510, - 0x4604ff84, - 0x20004914, - 0x60484a17, - 0x88006810, - 0x28030b00, - 0x0760d01d, - 0x6810d41b, - 0x28007bc0, - 0x2802d001, - 0x2013d115, - 0x4a0c01c0, - 0x68d08008, - 0xd00428c0, - 0xd00428d8, - 0x383938ff, - 0x480bd109, - 0x480be000, - 0x480b6048, - 0x211860d0, - 0xf0004804, - 0x4620f85f, - 0x0000bd10, - 0x21004260, - 0x21000028, - 0x21000000, - 0x0000764d, - 0x21000108, - 0x00063b91, - 0x0003fd29, - 0x000090fd, - 0x480eb570, - 0x4c0e6ac0, - 0x0f000700, - 0x28012502, - 0x2804d005, - 0x280cd00b, - 0x280dd001, - 0x6960d106, - 0x616043a8, - 0x49072001, - 0x60080280, - 0x4906bd70, - 0x47882001, - 0x43286960, - 0xbd706160, - 0x40046000, - 0x40041100, - 0xe000e180, - 0x00007d05, - 0x4c03b510, - 0xff48f7ff, - 0x28006820, - 0xbd10d1fa, - 0x40041100, - 0x780a490b, - 0xd1042aff, - 0x7ad24a0a, - 0x0f120712, - 0x4908700a, - 0x75883140, - 0x49054770, - 0x29ff7809, - 0x0900d005, - 0x43080100, - 0x31404902, - 0x47707588, - 0x210002a5, - 0x40086200, - 0x4801b403, - 0xbd019001, - 0x000089dd, - 0x00000000, - 0x00000000, -}; -#define _NWORD_PATCHIMAGE_BLE 145 - -#define _NWORD_PATCHSYS_BLE 0 - -#define _IRQ_PATCH_0 0x210041bd - - -#ifndef _BLE_SYSRAM_START -#define _BLE_SYSRAM_START 0x20000000 -#endif - -#ifndef _BLE_CPERAM_START -#define _BLE_CPERAM_START 0x21000000 -#endif - -#define _BLE_SYS_PATCH_FIXED_ADDR 0x20000000 - -#define _BLE_PARSER_PATCH_TAB_OFFSET 0x0390 -#define _BLE_PATCH_TAB_OFFSET 0x0398 -#define _BLE_IRQPATCH_OFFSET 0x0434 -#define _BLE_PATCH_VEC_OFFSET 0x4024 - -#ifndef _BLE_NO_PROG_STATE_VAR -static uint8_t bBlePatchEntered = 0; -#endif - -PATCH_FUN_SPEC void enterBleCpePatch(void) -{ -#if (_NWORD_PATCHIMAGE_BLE > 0) - uint32_t *pPatchVec = (uint32_t *) (_BLE_CPERAM_START + _BLE_PATCH_VEC_OFFSET); - - memcpy(pPatchVec, patchImageBle, sizeof(patchImageBle)); -#endif -} - -PATCH_FUN_SPEC void enterBleSysPatch(void) -{ -} - -PATCH_FUN_SPEC void configureBlePatch(void) -{ - uint8_t *pPatchTab = (uint8_t *) (_BLE_CPERAM_START + _BLE_PATCH_TAB_OFFSET); - uint32_t *pIrqPatch = (uint32_t *) (_BLE_CPERAM_START + _BLE_IRQPATCH_OFFSET); - - - pPatchTab[142] = 0; - pPatchTab[66] = 1; - pPatchTab[73] = 2; - pPatchTab[117] = 3; - pPatchTab[28] = 4; - pPatchTab[105] = 5; - pPatchTab[106] = 6; - pPatchTab[70] = 7; - - pIrqPatch[21] = _IRQ_PATCH_0; -} - -PATCH_FUN_SPEC void applyBlePatch(void) -{ -#ifdef _BLE_NO_PROG_STATE_VAR - enterBleSysPatch(); - enterBleCpePatch(); -#else - if (!bBlePatchEntered) - { - enterBleSysPatch(); - enterBleCpePatch(); - bBlePatchEntered = 1; - } -#endif - configureBlePatch(); -} - -PATCH_FUN_SPEC void refreshBlePatch(void) -{ - configureBlePatch(); -} - -#ifndef _BLE_NO_PROG_STATE_VAR -PATCH_FUN_SPEC void cleanBlePatch(void) -{ - bBlePatchEntered = 0; -} -#endif - -PATCH_FUN_SPEC void rf_patch_cpe_ble(void) -{ - applyBlePatch(); -} - -#undef _IRQ_PATCH_0 - -//***************************************************************************** -// -// Mark the end of the C bindings section for C++ compilers. -// -//***************************************************************************** -#ifdef __cplusplus -} -#endif - -#endif // _RF_PATCH_CPE_BLE_H - diff --git a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_bt5.h b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_bt5.h index a676d3d34..b293749a2 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_bt5.h +++ b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_bt5.h @@ -1,11 +1,11 @@ /****************************************************************************** * Filename: rf_patch_cpe_bt5.h -* Revised: $Date: 2018-05-07 15:02:01 +0200 (ma, 07 mai 2018) $ -* Revision: $Revision: 18438 $ +* Revised: $Date: 2019-02-27 16:13:01 +0100 (on, 27 feb 2019) $ +* Revision: $Revision: 18889 $ * * Description: RF core patch for Bluetooth 5 support ("BLE" and "BLE5" API command sets) in CC13x2 and CC26x2 * -* Copyright (c) 2015-2018, Texas Instruments Incorporated +* Copyright (c) 2015-2019, Texas Instruments Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -70,477 +70,50 @@ extern "C" CPE_PATCH_TYPE patchImageBt5[] = { - 0x21004161, - 0x210041d9, - 0x21004255, - 0x2100440b, - 0x2100445b, - 0x21004091, - 0x2100409d, - 0x210040b5, - 0x210044df, - 0x210040d9, - 0x2100410b, - 0x210040f9, - 0x21004651, - 0x21004665, - 0x2100467f, - 0x21004145, - 0x21004701, - 0xb081b5ff, - 0x9d0a4803, - 0xb5f84700, - 0x48024684, - 0x47004613, - 0x00007f43, - 0x00005145, - 0x461db570, - 0x47204c00, - 0x00022281, - 0x0a804670, - 0x288d4a05, - 0x4710d004, - 0x32e44a03, - 0x90042001, - 0x20004902, - 0x47107008, - 0x00006f69, - 0x210001f8, - 0x88084903, - 0x46714a03, - 0xd0004290, - 0x47081c89, - 0x210001a6, - 0x00001404, - 0xb083b5f3, - 0x47004800, - 0x00020b17, - 0x68024805, - 0xd3030852, - 0x60da4b04, - 0x60022200, - 0x1d004670, - 0x00004700, - 0x21004764, - 0x21000340, - 0x2270480b, - 0x43916801, - 0x43112240, - 0x48096001, - 0x48094700, - 0x460c7801, - 0x43912208, - 0xf0007001, - 0x4805f803, - 0xbd107004, - 0x4804b510, - 0x00004700, - 0x40043018, - 0x0000710f, - 0x210000b3, - 0x00005603, - 0x4801b510, - 0x00004700, - 0x000009df, - 0x49044803, - 0x05c068c0, - 0x47880fc0, + 0x21004059, + 0x210040a5, + 0x21004085, + 0x79654c07, + 0xf809f000, + 0x40697961, + 0xd5030749, + 0x4a042101, + 0x60110389, + 0xb570bd70, 0x47084902, - 0x21000340, - 0x000087d1, - 0x000053cd, - 0x4614b5f8, - 0x9b06461a, - 0x46139300, - 0xf7ff4622, - 0x9000ff7b, - 0xd12d2800, - 0x6848492e, - 0xd0292800, - 0x00498809, - 0x43411b09, - 0x68c0482b, - 0x00640844, - 0x20187922, - 0xb2c61a80, - 0x04802001, - 0x0cc71808, - 0x46317965, - 0xf0004825, - 0x4824fad3, - 0x19832201, - 0x408a1e69, - 0x21182000, - 0xe0071b8e, - 0x19090041, - 0x437988c9, - 0x40e91889, - 0x1c405419, - 0xdcf54286, - 0x4780481b, - 0xbdf89800, - 0xf7ffb510, - 0x4604ff4a, - 0x20004914, - 0x60484a17, - 0x88006810, - 0x28030b00, - 0x0760d01d, - 0x6810d41b, - 0x28007bc0, - 0x2802d001, - 0x2013d115, - 0x4a0c01c0, - 0x68d08008, - 0xd00428c0, - 0xd00428d8, - 0x383938ff, - 0x480bd109, - 0x480be000, - 0x480b6048, - 0x211860d0, - 0xf0004804, - 0x4620fa91, - 0x0000bd10, - 0x2100475c, - 0x21000028, - 0x21000000, - 0x0000764d, - 0x21000108, - 0x00063b91, - 0x0003fd29, - 0x000090fd, - 0x4abb8801, - 0x29031889, - 0x48bad806, - 0x8501217c, - 0x624149b9, - 0x47702001, - 0x470849b8, - 0xb43048b8, - 0x31404601, - 0x2a027c0a, - 0x6802d116, - 0x754a79d2, - 0x68936802, - 0x32804602, - 0x7d486093, - 0xd00b2802, - 0xd0092800, - 0x2c061ec4, - 0x49aad809, - 0x18400080, - 0x6b803840, - 0x60901818, - 0xbc3048aa, - 0x20034700, - 0x80c802c0, - 0x72082002, - 0x2003bc30, - 0xb5704770, - 0x460448a3, - 0x7da53440, - 0xd0122d01, - 0x06497d01, - 0x21800fca, - 0x7c21540a, - 0xd10a2900, - 0x78403060, - 0x07c00880, - 0x7ce0d002, - 0xd5020700, - 0x75a02001, - 0x2000e000, - 0x489873a0, - 0x75a54780, - 0xb570bd70, - 0x48964c93, - 0x35504625, - 0x28024780, - 0x3440d109, - 0x4a9388e1, - 0xd1044291, - 0x06897ce9, - 0x1d91d401, - 0xbd7080e1, - 0x498ab570, - 0x4608890a, - 0xb2d23050, - 0xd1072a28, - 0x68d2680a, - 0x7a936142, - 0x02127ad2, - 0x8302189a, - 0x4a877803, - 0xd0102b00, - 0x2b017983, - 0x7c03d10d, - 0x07db095b, - 0x7d09d009, - 0x74c14d82, - 0x20207f6c, - 0x77684320, - 0x776c4790, - 0x21ffbd70, - 0x479074c1, - 0xb510bd70, - 0x4c75487c, - 0x28024780, - 0x4621d10e, - 0x88ca3140, - 0x429a4b75, - 0x7ccad108, - 0x07d20952, - 0x7d22d004, - 0xd4010692, - 0x80ca1d9a, - 0xb570bd10, - 0x4972486a, - 0x7cc03040, - 0x07c00940, - 0x4d6dd007, - 0x8b2c486f, - 0x83284320, - 0x832c4788, - 0x4788bd70, - 0xb570bd70, - 0x496b4c61, - 0x36404626, - 0x00a87935, - 0x6b401840, - 0x2d0a4780, - 0xd0104621, - 0x780a3154, - 0x07db0993, - 0x73b2d004, - 0x2303780a, - 0x700a431a, - 0xb2ca8921, - 0xd3012a2b, - 0x81213928, - 0x3153bd70, - 0x4952e7ed, - 0x71083140, - 0xd01a2825, - 0x280adc08, - 0x280bd011, - 0x2818d011, - 0x281ed011, - 0xe014d106, - 0xd010282a, - 0xd006283c, - 0xd010283d, - 0x00804951, - 0x6b401840, - 0x48504770, - 0x48504770, - 0x48504770, - 0x48504770, - 0x48504770, - 0x48504770, - 0x48504770, - 0xb5f84770, - 0x4c3d4607, - 0x5d00204e, - 0x07ee0985, - 0x2e0025fb, - 0x7d26d017, - 0x0f240734, - 0xd0032c05, - 0x42202401, - 0xe012d002, - 0xe7fa2402, - 0xd00509c0, - 0xd5030670, - 0x0f806848, - 0xd0082801, - 0x005b085b, - 0x00520852, - 0x2800e003, - 0x402bd001, - 0x2b06402a, - 0x2010d003, - 0xd0102b02, - 0x2302e010, - 0x4638402a, - 0xfde4f7ff, - 0xda072800, - 0x1ab900c2, - 0x7e493920, - 0x42112214, - 0x2000d100, - 0x4302bdf8, - 0x46384303, - 0xfdd4f7ff, - 0xb570bdf8, - 0xfdf4f7ff, - 0xd12b0005, - 0x481a4917, - 0x30406809, - 0x4b2a8982, - 0xd123429a, - 0x210169cc, - 0x22000709, - 0xd20c428c, - 0x794b4926, - 0xd506075b, - 0x4a2568c8, - 0x1c400040, - 0x60cc6010, - 0x8182e012, - 0x8182e010, - 0x49212075, - 0x478800c0, - 0x46204606, - 0xf8b6f000, - 0xd0012800, - 0x02ed2503, - 0xb2b0491b, - 0x47883912, - 0xbd704628, - 0xffffe7d5, - 0x21000108, - 0x00020619, - 0x00020625, - 0x21000160, - 0x000245a5, - 0x00022cfd, - 0x00023b49, - 0x00001404, - 0x000238fd, - 0x210000a8, - 0x000224fb, - 0x00021d4f, - 0x00002020, - 0x00024fc0, - 0x210043cb, - 0x210043a7, - 0x2100437b, - 0x21004329, - 0x21004303, - 0x210042c3, - 0x21004271, - 0x0000ffff, - 0x21000340, - 0x21004764, - 0x000040e5, - 0x4d20b5f8, - 0x882c4820, - 0x4e206ac0, - 0x20010701, - 0x02400f09, - 0x0b222702, - 0xd0202908, - 0x2901dc0d, - 0x2904d00f, - 0x491ad114, - 0xd01207d2, - 0x43824622, - 0x2001802a, - 0x802c4788, - 0x290ce00d, - 0x290dd001, - 0x6970d106, - 0x617043b8, - 0x49122001, - 0x60080280, - 0x2001bdf8, - 0x69704788, - 0x61704338, - 0x0a61bdf8, - 0xd0fb07c9, - 0xd0f907d1, - 0x47a04c0b, - 0x2201490b, - 0x03926a48, - 0x62484310, - 0x63484909, - 0x47a02000, - 0x0000bdf8, - 0x21000068, + 0x21000380, + 0x40041108, + 0x0000592d, + 0x21014805, + 0x438a6802, + 0x6b836002, + 0x6383438b, + 0x6002430a, + 0x47004801, 0x40046000, - 0x40041100, - 0x00007d05, - 0xe000e180, - 0x000045b7, - 0x210002c0, - 0x40044000, - 0x4c03b510, - 0xfd70f7ff, - 0x28006820, - 0xbd10d1fa, - 0x40041100, - 0x780a490b, - 0xd1042aff, - 0x7ad24a0a, - 0x0f120712, - 0x4908700a, - 0x75883140, - 0x49054770, - 0x29ff7809, - 0x0900d005, - 0x43080100, - 0x31404902, - 0x47707588, - 0x210002a5, - 0x40086200, - 0x4e26b5f1, - 0x79742000, - 0x60f068f7, - 0x46254824, - 0x05c08800, - 0x2004d502, - 0x71744304, - 0x4b21221d, - 0x98002100, - 0x28004798, - 0x68f1d109, - 0x29001f03, - 0x9900d004, - 0xb2ca6809, - 0xd0032a2b, - 0x60f74618, - 0xbdf87175, - 0x0f890589, - 0xd1022902, - 0x400c21fb, - 0x21047174, - 0x400d400c, - 0xd0f242ac, - 0x03094a12, - 0xbdf86091, - 0x4604b570, - 0x28158800, - 0x490fd003, - 0x47884620, - 0x2075bd70, - 0x00c0490d, - 0x46054788, - 0xf7ff6860, - 0x2800ffbd, - 0x2487d001, - 0x2401e000, - 0x46284907, - 0x4788311c, - 0xbd704620, - 0x21000340, - 0x21000284, - 0x00004a99, - 0x40041100, - 0x0000270f, - 0x000045c7, - 0x4801b403, - 0xbd019001, - 0x000089dd, - 0x00000000, - 0x00000000, - 0x00000000, + 0x00005b3f, + 0x490cb510, + 0x4a0c4788, + 0x5e512106, + 0xd0072900, + 0xd0052902, + 0xd0032909, + 0xd0012910, + 0xd1072911, + 0x43c92177, + 0xdd014288, + 0xdd012800, + 0x43c0207f, + 0x0000bd10, + 0x000065a9, + 0x21000380, }; -#define _NWORD_PATCHIMAGE_BT5 465 +#define _NWORD_PATCHIMAGE_BT5 37 + +#define _NWORD_PATCHCPEHD_BT5 0 #define _NWORD_PATCHSYS_BT5 0 -#define _IRQ_PATCH_0 0x210045ad #ifndef _BT5_SYSRAM_START @@ -553,10 +126,12 @@ CPE_PATCH_TYPE patchImageBt5[] = { #define _BT5_SYS_PATCH_FIXED_ADDR 0x20000000 -#define _BT5_PARSER_PATCH_TAB_OFFSET 0x0390 -#define _BT5_PATCH_TAB_OFFSET 0x0398 -#define _BT5_IRQPATCH_OFFSET 0x0434 -#define _BT5_PATCH_VEC_OFFSET 0x4024 +#define _BT5_PATCH_VEC_ADDR_OFFSET 0x03D0 +#define _BT5_PATCH_TAB_OFFSET 0x03D4 +#define _BT5_IRQPATCH_OFFSET 0x0480 +#define _BT5_PATCH_VEC_OFFSET 0x404C + +#define _BT5_PATCH_CPEHD_OFFSET 0x04E0 #ifndef _BT5_NO_PROG_STATE_VAR static uint8_t bBt5PatchEntered = 0; @@ -571,36 +146,27 @@ PATCH_FUN_SPEC void enterBt5CpePatch(void) #endif } +PATCH_FUN_SPEC void enterBt5CpeHdPatch(void) +{ +#if (_NWORD_PATCHCPEHD_BT5 > 0) + uint32_t *pPatchCpeHd = (uint32_t *) (_BT5_CPERAM_START + _BT5_PATCH_CPEHD_OFFSET); + + memcpy(pPatchCpeHd, patchCpeHd, sizeof(patchCpeHd)); +#endif +} + PATCH_FUN_SPEC void enterBt5SysPatch(void) { } PATCH_FUN_SPEC void configureBt5Patch(void) { - uint8_t *pParserPatchTab = (uint8_t *) (_BT5_CPERAM_START + _BT5_PARSER_PATCH_TAB_OFFSET); uint8_t *pPatchTab = (uint8_t *) (_BT5_CPERAM_START + _BT5_PATCH_TAB_OFFSET); - uint32_t *pIrqPatch = (uint32_t *) (_BT5_CPERAM_START + _BT5_IRQPATCH_OFFSET); - pPatchTab[142] = 0; - pPatchTab[66] = 1; - pParserPatchTab[1] = 2; - pPatchTab[1] = 3; - pPatchTab[18] = 4; - pPatchTab[112] = 5; - pPatchTab[115] = 6; - pPatchTab[22] = 7; - pPatchTab[10] = 8; - pPatchTab[36] = 9; - pPatchTab[73] = 10; - pPatchTab[117] = 11; - pPatchTab[28] = 12; - pPatchTab[105] = 13; - pPatchTab[106] = 14; - pPatchTab[70] = 15; - pParserPatchTab[0] = 16; - - pIrqPatch[21] = _IRQ_PATCH_0; + pPatchTab[76] = 0; + pPatchTab[91] = 1; + pPatchTab[79] = 2; } PATCH_FUN_SPEC void applyBt5Patch(void) @@ -616,11 +182,13 @@ PATCH_FUN_SPEC void applyBt5Patch(void) bBt5PatchEntered = 1; } #endif + enterBt5CpeHdPatch(); configureBt5Patch(); } PATCH_FUN_SPEC void refreshBt5Patch(void) { + enterBt5CpeHdPatch(); configureBt5Patch(); } @@ -636,7 +204,6 @@ PATCH_FUN_SPEC void rf_patch_cpe_bt5(void) applyBt5Patch(); } -#undef _IRQ_PATCH_0 //***************************************************************************** // diff --git a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_ieee_802_15_4.h b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_ieee_802_15_4.h index f1ba1dd08..855993da2 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_ieee_802_15_4.h +++ b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_ieee_802_15_4.h @@ -1,11 +1,11 @@ /****************************************************************************** * Filename: rf_patch_cpe_ieee_802_15_4.h -* Revised: $Date: 2018-05-07 15:02:01 +0200 (ma, 07 mai 2018) $ -* Revision: $Revision: 18438 $ +* Revised: $Date: 2019-02-27 16:13:01 +0100 (on, 27 feb 2019) $ +* Revision: $Revision: 18889 $ * * Description: RF core patch for IEEE 802.15.4-2006 support ("IEEE" API command set) in CC13x2 and CC26x2 * -* Copyright (c) 2015-2018, Texas Instruments Incorporated +* Copyright (c) 2015-2019, Texas Instruments Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -70,121 +70,25 @@ extern "C" CPE_PATCH_TYPE patchImageIeee802154[] = { - 0x2100403d, - 0x210040d9, - 0x210040ed, - 0x21004107, - 0x21004071, - 0x21004189, - 0x6ac34807, - 0xf808f000, - 0x009b089b, - 0x6ac14804, - 0xd10007c9, - 0xbdf862c3, - 0xb5f84902, - 0x00004708, - 0x40045040, - 0x00029dd3, - 0x4801b510, - 0x00004700, - 0x000009df, - 0x49044803, - 0x05c068c0, - 0x47880fc0, + 0x21004051, + 0x79654c07, + 0xf809f000, + 0x40697961, + 0xd5030749, + 0x4a042101, + 0x60110389, + 0xb570bd70, 0x47084902, - 0x21000340, - 0x000087d1, - 0x000053cd, - 0x480eb570, - 0x4c0e6ac0, - 0x0f000700, - 0x28012502, - 0x2804d005, - 0x280cd00b, - 0x280dd001, - 0x6960d106, - 0x616043a8, - 0x49072001, - 0x60080280, - 0x4906bd70, - 0x47882001, - 0x43286960, - 0xbd706160, - 0x40046000, - 0x40041100, - 0xe000e180, - 0x00007d05, - 0x4c03b510, - 0xffc2f7ff, - 0x28006820, - 0xbd10d1fa, - 0x40041100, - 0x780a490b, - 0xd1042aff, - 0x7ad24a0a, - 0x0f120712, - 0x4908700a, - 0x75883140, - 0x49054770, - 0x29ff7809, - 0x0900d005, - 0x43080100, - 0x31404902, - 0x47707588, - 0x210002a5, - 0x40086200, - 0x4e26b5f1, - 0x79742000, - 0x60f068f7, - 0x46254824, - 0x05c08800, - 0x2004d502, - 0x71744304, - 0x4b21221d, - 0x98002100, - 0x28004798, - 0x68f1d109, - 0x29001f03, - 0x9900d004, - 0xb2ca6809, - 0xd0032a2b, - 0x60f74618, - 0xbdf87175, - 0x0f890589, - 0xd1022902, - 0x400c21fb, - 0x21047174, - 0x400d400c, - 0xd0f242ac, - 0x03094a12, - 0xbdf86091, - 0x4604b570, - 0x28158800, - 0x490fd003, - 0x47884620, - 0x2075bd70, - 0x00c0490d, - 0x46054788, - 0xf7ff6860, - 0x2800ffbd, - 0x2487d001, - 0x2401e000, - 0x46284907, - 0x4788311c, - 0xbd704620, - 0x21000340, - 0x21000284, - 0x00004a99, - 0x40041100, - 0x0000270f, - 0x000045c7, + 0x21000380, + 0x40041108, + 0x0000592d, }; -#define _NWORD_PATCHIMAGE_IEEE_802_15_4 109 +#define _NWORD_PATCHIMAGE_IEEE_802_15_4 12 + +#define _NWORD_PATCHCPEHD_IEEE_802_15_4 0 #define _NWORD_PATCHSYS_IEEE_802_15_4 0 -#define _IRQ_PATCH_0 0x2100408d #ifndef _IEEE_802_15_4_SYSRAM_START @@ -197,10 +101,12 @@ CPE_PATCH_TYPE patchImageIeee802154[] = { #define _IEEE_802_15_4_SYS_PATCH_FIXED_ADDR 0x20000000 -#define _IEEE_802_15_4_PARSER_PATCH_TAB_OFFSET 0x0390 -#define _IEEE_802_15_4_PATCH_TAB_OFFSET 0x0398 -#define _IEEE_802_15_4_IRQPATCH_OFFSET 0x0434 -#define _IEEE_802_15_4_PATCH_VEC_OFFSET 0x4024 +#define _IEEE_802_15_4_PATCH_VEC_ADDR_OFFSET 0x03D0 +#define _IEEE_802_15_4_PATCH_TAB_OFFSET 0x03D4 +#define _IEEE_802_15_4_IRQPATCH_OFFSET 0x0480 +#define _IEEE_802_15_4_PATCH_VEC_OFFSET 0x404C + +#define _IEEE_802_15_4_PATCH_CPEHD_OFFSET 0x04E0 #ifndef _IEEE_802_15_4_NO_PROG_STATE_VAR static uint8_t bIeee802154PatchEntered = 0; @@ -215,25 +121,25 @@ PATCH_FUN_SPEC void enterIeee802154CpePatch(void) #endif } +PATCH_FUN_SPEC void enterIeee802154CpeHdPatch(void) +{ +#if (_NWORD_PATCHCPEHD_IEEE_802_15_4 > 0) + uint32_t *pPatchCpeHd = (uint32_t *) (_IEEE_802_15_4_CPERAM_START + _IEEE_802_15_4_PATCH_CPEHD_OFFSET); + + memcpy(pPatchCpeHd, patchCpeHd, sizeof(patchCpeHd)); +#endif +} + PATCH_FUN_SPEC void enterIeee802154SysPatch(void) { } PATCH_FUN_SPEC void configureIeee802154Patch(void) { - uint8_t *pParserPatchTab = (uint8_t *) (_IEEE_802_15_4_CPERAM_START + _IEEE_802_15_4_PARSER_PATCH_TAB_OFFSET); uint8_t *pPatchTab = (uint8_t *) (_IEEE_802_15_4_CPERAM_START + _IEEE_802_15_4_PATCH_TAB_OFFSET); - uint32_t *pIrqPatch = (uint32_t *) (_IEEE_802_15_4_CPERAM_START + _IEEE_802_15_4_IRQPATCH_OFFSET); - pPatchTab[53] = 0; - pPatchTab[28] = 1; - pPatchTab[105] = 2; - pPatchTab[106] = 3; - pPatchTab[70] = 4; - pParserPatchTab[0] = 5; - - pIrqPatch[21] = _IRQ_PATCH_0; + pPatchTab[76] = 0; } PATCH_FUN_SPEC void applyIeee802154Patch(void) @@ -249,11 +155,13 @@ PATCH_FUN_SPEC void applyIeee802154Patch(void) bIeee802154PatchEntered = 1; } #endif + enterIeee802154CpeHdPatch(); configureIeee802154Patch(); } PATCH_FUN_SPEC void refreshIeee802154Patch(void) { + enterIeee802154CpeHdPatch(); configureIeee802154Patch(); } @@ -269,7 +177,6 @@ PATCH_FUN_SPEC void rf_patch_cpe_ieee_802_15_4(void) applyIeee802154Patch(); } -#undef _IRQ_PATCH_0 //***************************************************************************** // diff --git a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_multi_protocol.h b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_multi_protocol.h index d6b9c9ddd..6a197337c 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_multi_protocol.h +++ b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_multi_protocol.h @@ -1,11 +1,11 @@ /****************************************************************************** * Filename: rf_patch_cpe_multi_protocol.h -* Revised: $Date: 2018-05-07 15:02:01 +0200 (ma, 07 mai 2018) $ -* Revision: $Revision: 18438 $ +* Revised: $Date: 2019-02-27 16:13:01 +0100 (on, 27 feb 2019) $ +* Revision: $Revision: 18889 $ * * Description: RF core patch for multi-protocol support (all available API command sets) in CC13x2 and CC26x2 * -* Copyright (c) 2015-2018, Texas Instruments Incorporated +* Copyright (c) 2015-2019, Texas Instruments Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -70,626 +70,76 @@ extern "C" CPE_PATCH_TYPE patchImageMultiProtocol[] = { - 0x21004245, - 0x21004265, - 0x210042dd, - 0x21004385, - 0x2100442d, - 0x210045e3, - 0x21004633, - 0x210040bd, - 0x210040c9, - 0x210040e1, - 0x210046b7, - 0x21004105, - 0x21004125, - 0x21004785, - 0x21004159, - 0x2100417d, - 0x2100419f, - 0x2100418d, - 0x2100483d, - 0x21004857, - 0x210041d1, - 0x210041ed, - 0x210041fd, - 0x21004955, - 0x2100420d, - 0xb081b5ff, - 0x9d0a4803, - 0xb5f84700, - 0x48024684, - 0x47004613, - 0x00007f43, - 0x00005145, - 0x460cb5f7, - 0x47084900, - 0x0000681d, - 0x461db570, - 0x47204c00, - 0x00022281, - 0x0a804670, - 0x288d4a05, - 0x4710d004, - 0x32e44a03, - 0x90042001, - 0x20004902, - 0x47107008, - 0x00006f69, - 0x210001f8, - 0x88084903, - 0x46714a03, - 0xd0004290, - 0x47081c89, - 0x210001a6, - 0x00001404, - 0xb083b5f3, - 0x47004800, - 0x00020b17, - 0x68024805, - 0xd3030852, - 0x60da4b04, - 0x60022200, - 0x1d004670, - 0x00004700, - 0x210049b8, - 0x21000340, - 0x6ac34807, - 0xf808f000, - 0x009b089b, - 0x6ac14804, - 0xd10007c9, - 0xbdf862c3, - 0xb5f84902, - 0x00004708, - 0x40045040, - 0x00029dd3, - 0x4801b510, - 0x00004700, - 0x000009df, - 0x460db5f8, - 0x4b0a4616, - 0x290c6d59, - 0x4b03d104, - 0x78192408, - 0x70194321, - 0x47084901, - 0x21000340, - 0x0000699d, - 0x46864810, - 0x21804801, - 0x47706041, - 0x40045000, - 0x2270480d, - 0x43916801, - 0x43112240, - 0x480b6001, - 0x480b4700, - 0x460c7801, - 0x43912208, - 0xf0007001, - 0x4807f803, - 0xbd107004, - 0xf7ffb510, - 0x4801ffe3, - 0x470038c8, - 0x000056cb, - 0x40043018, - 0x0000710f, - 0x210000b3, - 0x49044803, - 0x05c068c0, - 0x47880fc0, + 0x21004061, + 0x210040cb, + 0x2100408d, + 0x2100410d, + 0x210040ed, + 0x79654c07, + 0xf809f000, + 0x40697961, + 0xd5030749, + 0x4a042101, + 0x60110389, + 0xb570bd70, 0x47084902, - 0x21000340, - 0x000087d1, - 0x000053cd, - 0xf0002000, - 0x4604fb41, - 0x47004800, - 0x0000545b, - 0xf0002004, - 0x4605fb39, - 0x47004800, - 0x0000533b, - 0xf811f000, + 0x21000380, + 0x40041108, + 0x0000592d, + 0xf819f000, 0x296cb2e1, 0x2804d00b, 0x2806d001, - 0x4907d107, + 0x490ed107, 0x07c97809, 0x7821d103, 0xd4000709, - 0xb0032002, + 0x490b2002, + 0x210c780a, + 0xd0024211, + 0x22804909, + 0xb003600a, 0xb5f0bdf0, - 0x4902b083, - 0x00004708, + 0x4907b083, + 0x48044708, + 0x22407801, + 0x70014391, + 0x47004804, 0x210000c8, - 0x0003071b, - 0x4905b672, - 0x22206808, - 0x600a4302, - 0x6ad24a03, - 0xb6626008, - 0x4770b250, - 0x40040000, - 0x40046040, - 0x4614b5f8, - 0x9b06461a, - 0x46139300, - 0xf7ff4622, - 0x9000ff09, - 0xd12d2800, - 0x6848495f, - 0xd0292800, - 0x00498809, - 0x43411b09, - 0x68c0485c, - 0x00640844, - 0x20187922, - 0xb2c61a80, - 0x04802001, - 0x0cc71808, - 0x46317965, - 0xf0004856, - 0x4855fb7b, - 0x19832201, - 0x408a1e69, - 0x21182000, - 0xe0071b8e, - 0x19090041, - 0x437988c9, - 0x40e91889, - 0x1c405419, - 0xdcf54286, - 0x4780484c, - 0xbdf89800, - 0xf7ffb570, - 0x4a46fed8, - 0x49492300, - 0x60534604, - 0x25136808, - 0x01ed8800, - 0x2e030b06, - 0x0760d00d, - 0x6808d43f, - 0x290c7bc1, - 0xdc0fd028, - 0xd0132904, - 0xd0142905, - 0xd10d290a, - 0xb2c0e01d, - 0xd0032806, - 0x8c006808, - 0xe02d8010, - 0xe02b8015, - 0xd018290f, - 0xd019291e, - 0xe0048015, - 0x01802013, - 0x4835e000, - 0x48308010, - 0x29c068c1, - 0x29d8d010, - 0x39ffd010, - 0xd1173939, - 0x20ffe00a, - 0xe7f130e7, - 0x309620ff, - 0x20ffe7ee, - 0xe7eb3045, - 0xe7e920a2, - 0xe000492a, - 0x6051492a, - 0x60c1492a, - 0x48232118, - 0xfb14f000, - 0x8013e000, - 0xbd704620, - 0x4604b5f8, - 0x4e1c481d, - 0x88003040, - 0x0a80460d, - 0xd00407c0, - 0x08644821, - 0x43447900, - 0x8830e025, - 0xd0222800, - 0x19000960, - 0xfe7af7ff, - 0x20014607, - 0x0240491b, - 0x46024788, - 0x1bc02005, - 0x40848831, - 0x18230848, - 0x62034817, - 0x21016241, - 0x430d61c1, - 0x60cd490a, - 0x07c969c1, - 0x6a80d1fc, - 0x60704910, - 0x39124610, - 0x46384788, - 0x2000bdf8, - 0x46206070, - 0xfe56f7ff, - 0x0000bdf8, - 0x210049b0, - 0x21000028, - 0x21000000, - 0x0000764d, - 0x21000108, - 0x000003cd, - 0x00063b91, - 0x0003fd29, - 0x000090fd, - 0x21000340, - 0x000040e5, - 0x40044100, - 0x4abb8801, - 0x29031889, - 0x48bad806, - 0x8501217c, - 0x624149b9, - 0x47702001, - 0x470849b8, - 0xb43048b8, - 0x31404601, - 0x2a027c0a, - 0x6802d116, - 0x754a79d2, - 0x68936802, - 0x32804602, - 0x7d486093, - 0xd00b2802, - 0xd0092800, - 0x2c061ec4, - 0x49aad809, - 0x18400080, - 0x6b803840, - 0x60901818, - 0xbc3048aa, - 0x20034700, - 0x80c802c0, - 0x72082002, - 0x2003bc30, - 0xb5704770, - 0x460448a3, - 0x7da53440, - 0xd0122d01, - 0x06497d01, - 0x21800fca, - 0x7c21540a, - 0xd10a2900, - 0x78403060, - 0x07c00880, - 0x7ce0d002, - 0xd5020700, - 0x75a02001, - 0x2000e000, - 0x489873a0, - 0x75a54780, - 0xb570bd70, - 0x48964c93, - 0x35504625, - 0x28024780, - 0x3440d109, - 0x4a9388e1, - 0xd1044291, - 0x06897ce9, - 0x1d91d401, - 0xbd7080e1, - 0x498ab570, - 0x4608890a, - 0xb2d23050, - 0xd1072a28, - 0x68d2680a, - 0x7a936142, - 0x02127ad2, - 0x8302189a, - 0x4a877803, - 0xd0102b00, - 0x2b017983, - 0x7c03d10d, - 0x07db095b, - 0x7d09d009, - 0x74c14d82, - 0x20207f6c, - 0x77684320, - 0x776c4790, - 0x21ffbd70, - 0x479074c1, - 0xb510bd70, - 0x4c75487c, - 0x28024780, - 0x4621d10e, - 0x88ca3140, - 0x429a4b75, - 0x7ccad108, - 0x07d20952, - 0x7d22d004, - 0xd4010692, - 0x80ca1d9a, - 0xb570bd10, - 0x4972486a, - 0x7cc03040, - 0x07c00940, - 0x4d6dd007, - 0x8b2c486f, - 0x83284320, - 0x832c4788, - 0x4788bd70, - 0xb570bd70, - 0x496b4c61, - 0x36404626, - 0x00a87935, - 0x6b401840, - 0x2d0a4780, - 0xd0104621, - 0x780a3154, - 0x07db0993, - 0x73b2d004, - 0x2303780a, - 0x700a431a, - 0xb2ca8921, - 0xd3012a2b, - 0x81213928, - 0x3153bd70, - 0x4952e7ed, - 0x71083140, - 0xd01a2825, - 0x280adc08, - 0x280bd011, - 0x2818d011, - 0x281ed011, - 0xe014d106, - 0xd010282a, - 0xd006283c, - 0xd010283d, - 0x00804951, - 0x6b401840, - 0x48504770, - 0x48504770, - 0x48504770, - 0x48504770, - 0x48504770, - 0x48504770, - 0x48504770, - 0xb5f84770, - 0x4c3d4607, - 0x5d00204e, - 0x07ee0985, - 0x2e0025fb, - 0x7d26d017, - 0x0f240734, - 0xd0032c05, - 0x42202401, - 0xe012d002, - 0xe7fa2402, - 0xd00509c0, - 0xd5030670, - 0x0f806848, - 0xd0082801, - 0x005b085b, - 0x00520852, - 0x2800e003, - 0x402bd001, - 0x2b06402a, - 0x2010d003, - 0xd0102b02, - 0x2302e010, - 0x4638402a, - 0xfd0ef7ff, - 0xda072800, - 0x1ab900c2, - 0x7e493920, - 0x42112214, - 0x2000d100, - 0x4302bdf8, - 0x46384303, - 0xfcfef7ff, - 0xb570bdf8, - 0xfd1ef7ff, - 0xd12b0005, - 0x481a4917, - 0x30406809, - 0x4b2a8982, - 0xd123429a, - 0x210169cc, - 0x22000709, - 0xd20c428c, - 0x794b4926, - 0xd506075b, - 0x4a2568c8, - 0x1c400040, - 0x60cc6010, - 0x8182e012, - 0x8182e010, - 0x49212075, - 0x478800c0, - 0x46204606, - 0xf8f4f000, - 0xd0012800, - 0x02ed2503, - 0xb2b0491b, - 0x47883912, - 0xbd704628, - 0xffffe7d5, - 0x21000108, - 0x00020619, - 0x00020625, - 0x21000160, - 0x000245a5, - 0x00022cfd, - 0x00023b49, - 0x00001404, - 0x000238fd, - 0x210000a8, - 0x000224fb, - 0x00021d4f, - 0x00002020, - 0x00024fc0, - 0x210045a3, - 0x2100457f, - 0x21004553, - 0x21004501, - 0x210044db, - 0x2100449b, - 0x21004449, - 0x0000ffff, - 0x21000340, - 0x210049b8, - 0x000040e5, - 0x4c03b510, - 0xfce0f7ff, - 0x28006820, - 0xbd10d1fa, - 0x40041100, - 0x4d20b5f8, - 0x882c4820, - 0x4e206ac0, - 0x20010701, - 0x02400f09, - 0x0b222702, - 0xd0202908, - 0x2901dc0d, - 0x2904d00f, - 0x491ad114, - 0xd01207d2, - 0x43824622, - 0x2001802a, - 0x802c4788, - 0x290ce00d, - 0x290dd001, - 0x6970d106, - 0x617043b8, - 0x49122001, - 0x60080280, - 0x2001bdf8, - 0x69704788, - 0x61704338, - 0x0a61bdf8, - 0xd0fb07c9, - 0xd0f907d1, - 0x47a04c0b, - 0x2201490b, - 0x03926a48, - 0x62484310, - 0x63484909, - 0x47a02000, - 0x0000bdf8, - 0x21000068, + 0x21000133, + 0xe000e200, + 0x00031641, + 0x00031b23, + 0x21014805, + 0x438a6802, + 0x6b836002, + 0x6383438b, + 0x6002430a, + 0x47004801, 0x40046000, - 0x40041100, - 0x00007d05, - 0xe000e180, - 0x000045b7, - 0x210002c0, - 0x40044000, - 0x780a490b, - 0xd1042aff, - 0x7ad24a0a, - 0x0f120712, - 0x4908700a, - 0x75883140, - 0x49054770, - 0x29ff7809, - 0x0900d005, - 0x43080100, - 0x31404902, - 0x47707588, - 0x210002a5, - 0x40086200, - 0x4c19b570, - 0x7ba14606, - 0xf820f000, - 0x7be14605, - 0xf0004630, - 0x4915f81b, - 0x78094604, - 0x070a2028, - 0x2d01d401, - 0x2038d100, - 0xd40106c9, - 0xd1012c01, - 0x43082140, - 0x4788490e, - 0xd0012dff, - 0x6145480d, - 0xd0012cff, - 0x61c4480c, - 0xbd704808, - 0xd0082900, - 0xd00629ff, - 0x070840c1, - 0x281c0ec0, - 0x2001d100, - 0x20ff4770, - 0x00004770, - 0x210000a8, - 0x21000340, - 0x000040e5, - 0x40045040, - 0x40046000, - 0x4e26b5f1, - 0x79742000, - 0x60f068f7, - 0x46254824, - 0x05c08800, - 0x2004d502, - 0x71744304, - 0x4b21221d, - 0x98002100, - 0x28004798, - 0x68f1d109, - 0x29001f03, - 0x9900d004, - 0xb2ca6809, - 0xd0032a2b, - 0x60f74618, - 0xbdf87175, - 0x0f890589, - 0xd1022902, - 0x400c21fb, - 0x21047174, - 0x400d400c, - 0xd0f242ac, - 0x03094a12, - 0xbdf86091, - 0x4604b570, - 0x28158800, - 0x490fd003, - 0x47884620, - 0x2075bd70, - 0x00c0490d, - 0x46054788, - 0xf7ff6860, - 0x2800ffbd, - 0x2487d001, - 0x2401e000, - 0x46284907, - 0x4788311c, - 0xbd704620, - 0x21000340, - 0x21000284, - 0x00004a99, - 0x40041100, - 0x0000270f, - 0x000045c7, - 0x4801b403, - 0xbd019001, - 0x000089dd, - 0x00000000, - 0x00000000, - 0x00000000, + 0x00005b3f, + 0x490cb510, + 0x4a0c4788, + 0x5e512106, + 0xd0072900, + 0xd0052902, + 0xd0032909, + 0xd0012910, + 0xd1072911, + 0x43c92177, + 0xdd014288, + 0xdd012800, + 0x43c0207f, + 0x0000bd10, + 0x000065a9, + 0x21000380, }; -#define _NWORD_PATCHIMAGE_MULTI_PROTOCOL 614 +#define _NWORD_PATCHIMAGE_MULTI_PROTOCOL 63 + +#define _NWORD_PATCHCPEHD_MULTI_PROTOCOL 0 #define _NWORD_PATCHSYS_MULTI_PROTOCOL 0 -#define _IRQ_PATCH_0 0x21004799 #ifndef _MULTI_PROTOCOL_SYSRAM_START @@ -702,10 +152,12 @@ CPE_PATCH_TYPE patchImageMultiProtocol[] = { #define _MULTI_PROTOCOL_SYS_PATCH_FIXED_ADDR 0x20000000 -#define _MULTI_PROTOCOL_PARSER_PATCH_TAB_OFFSET 0x0390 -#define _MULTI_PROTOCOL_PATCH_TAB_OFFSET 0x0398 -#define _MULTI_PROTOCOL_IRQPATCH_OFFSET 0x0434 -#define _MULTI_PROTOCOL_PATCH_VEC_OFFSET 0x4024 +#define _MULTI_PROTOCOL_PATCH_VEC_ADDR_OFFSET 0x03D0 +#define _MULTI_PROTOCOL_PATCH_TAB_OFFSET 0x03D4 +#define _MULTI_PROTOCOL_IRQPATCH_OFFSET 0x0480 +#define _MULTI_PROTOCOL_PATCH_VEC_OFFSET 0x404C + +#define _MULTI_PROTOCOL_PATCH_CPEHD_OFFSET 0x04E0 #ifndef _MULTI_PROTOCOL_NO_PROG_STATE_VAR static uint8_t bMultiProtocolPatchEntered = 0; @@ -720,44 +172,29 @@ PATCH_FUN_SPEC void enterMultiProtocolCpePatch(void) #endif } +PATCH_FUN_SPEC void enterMultiProtocolCpeHdPatch(void) +{ +#if (_NWORD_PATCHCPEHD_MULTI_PROTOCOL > 0) + uint32_t *pPatchCpeHd = (uint32_t *) (_MULTI_PROTOCOL_CPERAM_START + _MULTI_PROTOCOL_PATCH_CPEHD_OFFSET); + + memcpy(pPatchCpeHd, patchCpeHd, sizeof(patchCpeHd)); +#endif +} + PATCH_FUN_SPEC void enterMultiProtocolSysPatch(void) { } PATCH_FUN_SPEC void configureMultiProtocolPatch(void) { - uint8_t *pParserPatchTab = (uint8_t *) (_MULTI_PROTOCOL_CPERAM_START + _MULTI_PROTOCOL_PARSER_PATCH_TAB_OFFSET); uint8_t *pPatchTab = (uint8_t *) (_MULTI_PROTOCOL_CPERAM_START + _MULTI_PROTOCOL_PATCH_TAB_OFFSET); - uint32_t *pIrqPatch = (uint32_t *) (_MULTI_PROTOCOL_CPERAM_START + _MULTI_PROTOCOL_IRQPATCH_OFFSET); - pPatchTab[84] = 0; - pPatchTab[142] = 1; - pPatchTab[66] = 2; - pPatchTab[102] = 3; - pParserPatchTab[1] = 4; - pPatchTab[1] = 5; - pPatchTab[18] = 6; - pPatchTab[112] = 7; - pPatchTab[115] = 8; - pPatchTab[22] = 9; - pPatchTab[10] = 10; - pPatchTab[36] = 11; - pPatchTab[53] = 12; - pPatchTab[28] = 13; - pPatchTab[104] = 14; - pPatchTab[75] = 15; - pPatchTab[73] = 16; - pPatchTab[117] = 17; - pPatchTab[105] = 18; - pPatchTab[106] = 19; - pPatchTab[70] = 20; - pPatchTab[71] = 21; - pPatchTab[69] = 22; - pParserPatchTab[0] = 23; - pPatchTab[60] = 24; - - pIrqPatch[21] = _IRQ_PATCH_0; + pPatchTab[76] = 0; + pPatchTab[62] = 1; + pPatchTab[64] = 2; + pPatchTab[91] = 3; + pPatchTab[79] = 4; } PATCH_FUN_SPEC void applyMultiProtocolPatch(void) @@ -773,11 +210,13 @@ PATCH_FUN_SPEC void applyMultiProtocolPatch(void) bMultiProtocolPatchEntered = 1; } #endif + enterMultiProtocolCpeHdPatch(); configureMultiProtocolPatch(); } PATCH_FUN_SPEC void refreshMultiProtocolPatch(void) { + enterMultiProtocolCpeHdPatch(); configureMultiProtocolPatch(); } @@ -793,7 +232,6 @@ PATCH_FUN_SPEC void rf_patch_cpe_multi_protocol(void) applyMultiProtocolPatch(); } -#undef _IRQ_PATCH_0 //***************************************************************************** // diff --git a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_multi_protocol_rtls.h b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_multi_protocol_rtls.h new file mode 100644 index 000000000..6c6ddc9b5 --- /dev/null +++ b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_multi_protocol_rtls.h @@ -0,0 +1,1452 @@ +/****************************************************************************** +* Filename: rf_patch_cpe_multi_protocol_rtls.h +* Revised: $Date: 2019-02-27 16:13:01 +0100 (on, 27 feb 2019) $ +* Revision: $Revision: 18889 $ +* +* Description: RF core patch for multi-protocol support (all available API command sets) with RTLS components in CC13x2 and CC26x2 +* +* Copyright (c) 2015-2019, Texas Instruments Incorporated +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* 1) Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* +* 2) Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* 3) Neither the name of the ORGANIZATION nor the names of its contributors may +* be used to endorse or promote products derived from this software without +* specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +******************************************************************************/ +#ifndef _RF_PATCH_CPE_MULTI_PROTOCOL_RTLS_H +#define _RF_PATCH_CPE_MULTI_PROTOCOL_RTLS_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +#include +#include + +#ifndef CPE_PATCH_TYPE +#define CPE_PATCH_TYPE static const uint32_t +#endif + +#ifndef SYS_PATCH_TYPE +#define SYS_PATCH_TYPE static const uint32_t +#endif + +#ifndef PATCH_FUN_SPEC +#define PATCH_FUN_SPEC static inline +#endif + +#ifndef _APPLY_PATCH_TAB +#define _APPLY_PATCH_TAB +#endif + + +CPE_PATCH_TYPE patchImageMultiProtocolRtls[] = { + 0x21004631, + 0x21004683, + 0x21004075, + 0x2100486f, + 0x210040ad, + 0x21004117, + 0x210040d9, + 0x2100492d, + 0x21004139, + 0x21005349, + 0x68084908, + 0x43902221, + 0x48076008, + 0x68c34700, + 0x230260c3, + 0xd1fd1e5b, + 0x68c32210, + 0x60c34393, + 0x4770618a, + 0x40048000, + 0x00005c01, + 0x4801b430, + 0x00004700, + 0x00020efd, + 0x79654c07, + 0xf809f000, + 0x40697961, + 0xd5030749, + 0x4a042101, + 0x60110389, + 0xb570bd70, + 0x47084902, + 0x21000380, + 0x40041108, + 0x0000592d, + 0xf819f000, + 0x296cb2e1, + 0x2804d00b, + 0x2806d001, + 0x490ed107, + 0x07c97809, + 0x7821d103, + 0xd4000709, + 0x490b2002, + 0x210c780a, + 0xd0024211, + 0x22804909, + 0xb003600a, + 0xb5f0bdf0, + 0x4907b083, + 0x48044708, + 0x22407801, + 0x70014391, + 0x47004804, + 0x210000c8, + 0x21000133, + 0xe000e200, + 0x00031641, + 0x00031b23, + 0x21014805, + 0x438a6802, + 0x6b836002, + 0x6383438b, + 0x6002430a, + 0x47004801, + 0x40046000, + 0x00005b3f, + 0x4803b510, + 0x30106800, + 0xfe72f000, + 0x47084901, + 0x21000108, + 0x000095e3, + 0x4cffb570, + 0x5d002044, + 0x008049fe, + 0x68801840, + 0x46054780, + 0xd0112801, + 0x5d00207e, + 0xd30d2805, + 0x06002021, + 0x00897e41, + 0x7f0a1809, + 0xd0072a02, + 0x77082003, + 0x49f43480, + 0x478888a0, + 0xbd704628, + 0x77012104, + 0x700148f1, + 0xb5ffe7f4, + 0x7e934aec, + 0x49ef185b, + 0x3280600b, + 0x09897891, + 0x49edd16e, + 0x29006909, + 0x680bd06a, + 0x041bb2da, + 0x4be40e1c, + 0x7edb3360, + 0xd01b2c01, + 0x005b2410, + 0x1edb46a6, + 0x4be5469c, + 0x681b684d, + 0x00923108, + 0x1f121852, + 0x9202402b, + 0x4ae13030, + 0x93002401, + 0x60549103, + 0x26224adf, + 0x27106914, + 0x6114433c, + 0xe0302200, + 0x009b2408, + 0x1f9b46a6, + 0xc910e7e2, + 0x40634fd9, + 0x9301402b, + 0x24014623, + 0x603c0364, + 0x34404cd3, + 0x4cd26060, + 0x68643c40, + 0xd5061a24, + 0x3c804cd1, + 0x04bf6827, + 0xbf20d401, + 0x4fcbe7fa, + 0x633c9c01, + 0x44709c02, + 0xd90042a1, + 0x4cc59903, + 0x42346864, + 0x4cc3d006, + 0x68263c80, + 0x43be2702, + 0x26006026, + 0x45621c52, + 0x9c00d3d1, + 0x405c49c0, + 0x3940402c, + 0x1a12684a, + 0x48bcd4fc, + 0x48bc6304, + 0x60412100, + 0x690248bb, + 0x438a2110, + 0xbdff6102, + 0x212248b4, + 0x420a6842, + 0x4ab2d0fc, + 0x68103a80, + 0x43882102, + 0xbdff6010, + 0x4daab5f3, + 0x5d46202f, + 0xb08148b2, + 0x05806900, + 0x2e011600, + 0x1c40d002, + 0xe0001040, + 0x49ad301e, + 0x6a093140, + 0x4ba14aac, + 0x691a4351, + 0x6a1b0e09, + 0xd0222e01, + 0x01591852, + 0x316731ff, + 0x18544b9f, + 0x68d93340, + 0xb2894fa0, + 0xb2821a08, + 0x68783f40, + 0xd4fc1b00, + 0x462860da, + 0x90003060, + 0x49958381, + 0x31122050, + 0x35804788, + 0x980180a8, + 0xd0082800, + 0x990278aa, + 0xfabef000, + 0x1852e007, + 0x31ce0119, + 0x4896e7dc, + 0x99006ac0, + 0x489577c8, + 0x68407829, + 0x08c14348, + 0xd00b2e01, + 0x38134620, + 0x687a340e, + 0xd4fc1b12, + 0x0c0b4a8f, + 0xb2896193, + 0xbdfe6151, + 0x38114620, + 0xe7f23409, + 0x4c7cb570, + 0x35604625, + 0x1e407fa8, + 0xd80d2802, + 0x28006aa0, + 0x2182d004, + 0x70015d09, + 0x62a01c40, + 0x1e406a60, + 0x7fa86260, + 0x77a81cc0, + 0x28057fa8, + 0xd112d322, + 0x28026a60, + 0x497ddd08, + 0x47881e80, + 0x62611c81, + 0xd0012800, + 0xbd702001, + 0x46082100, + 0xff7af7ff, + 0xf7ff2110, + 0x486afef2, + 0x6ac13840, + 0xd0fc07c9, + 0x38804867, + 0x22026801, + 0x60014311, + 0x8ba84964, + 0x60c83140, + 0x36404626, + 0x495e7930, + 0x18400080, + 0x47806880, + 0xd1de2800, + 0x29057fa9, + 0x7fead301, + 0x29047172, + 0x7de1d3d7, + 0xd1022900, + 0x29007e21, + 0x7eead0d1, + 0x015268e1, + 0x60e11889, + 0xb570bd70, + 0x20444d4f, + 0x48535d46, + 0x3820494e, + 0x00b07ec4, + 0x68801840, + 0x4b5a4780, + 0x781a09a1, + 0xd10a4211, + 0x21ff2221, + 0x76510612, + 0x22004948, + 0x600a1f09, + 0x2101604a, + 0x212f7019, + 0x29025d49, + 0x2e31d008, + 0x07e1d003, + 0xd0032900, + 0x0861e003, + 0xe7f907c9, + 0x35802400, + 0xbd70706c, + 0x4c39b5f8, + 0x46272500, + 0x723d3760, + 0x5d00202f, + 0xd03a2802, + 0x47804845, + 0x36404626, + 0x7ff04937, + 0x62203920, + 0x43087849, + 0x48347560, + 0x38406265, + 0x2d007fc5, + 0x7d20d006, + 0x43082120, + 0x06e87520, + 0x72380ec0, + 0x7f30493a, + 0x4a3a4788, + 0xd0112d00, + 0x61c54839, + 0x20074b28, + 0x63983b40, + 0x21054d26, + 0x07806950, + 0x6868d1fc, + 0xd0f94208, + 0x30404831, + 0x63186800, + 0x28007f30, + 0x6e60d001, + 0x6be16210, + 0x47882039, + 0x20006420, + 0x482cbdf8, + 0xb5f0e7fa, + 0x20444915, + 0x2b045c43, + 0x460ad00a, + 0x78103268, + 0x28004f12, + 0x28ffd070, + 0x2b04d012, + 0xe006d003, + 0x327b460a, + 0x68cce7f3, + 0x19640145, + 0x242f60cc, + 0x2c015c64, + 0x0640d101, + 0x62480e00, + 0x701020ff, + 0x4c09202f, + 0x60200200, + 0x6a484d07, + 0x68623d40, + 0xd03f07d2, + 0xe02b220f, + 0x21000160, + 0x00025500, + 0x0000423d, + 0x21000020, + 0x40045080, + 0x210000e8, + 0x40022080, + 0x40043040, + 0xe000ed00, + 0xe000e280, + 0x400452c0, + 0x00155556, + 0x40046040, + 0x210002c0, + 0x40045180, + 0x0002175f, + 0x210004e0, + 0x00020749, + 0x00020e45, + 0x40042000, + 0x40042100, + 0x0002469d, + 0x4ec363aa, + 0x2801e003, + 0x632edd07, + 0x28001e80, + 0x6862dd1a, + 0xd1f607d2, + 0x2007e006, + 0x20ff63a8, + 0xe0116328, + 0xdd0f2800, + 0x26146862, + 0xd0b64232, + 0x7b524ab8, + 0x60220212, + 0x22084bb7, + 0x4bb7601a, + 0x6248601a, + 0xbdf02001, + 0x19c00098, + 0x64086880, + 0xbdf02000, + 0x460148b2, + 0x7bca3120, + 0x76823060, + 0x73c82002, + 0x470048af, + 0xb50049ad, + 0x71083140, + 0xd01c2831, + 0x4603dc08, + 0xfec0f000, + 0x0e13190a, + 0x0e0e150e, + 0x0e1d1b0e, + 0xd0122835, + 0xd0122836, + 0xd00a2838, + 0xd006283b, + 0x008049a3, + 0x68801840, + 0x48a2bd00, + 0x48a2bd00, + 0x48a2bd00, + 0x48a2bd00, + 0x48a2bd00, + 0x48a2bd00, + 0xb5f0bd00, + 0xb0854c98, + 0x31204621, + 0x7bce9103, + 0x5d092144, + 0xd0012907, + 0xd17e2934, + 0x35804625, + 0x2a00786a, + 0x7d21d07a, + 0xd5770689, + 0x3180498b, + 0x7f09468e, + 0xd0282e01, + 0x0f090709, + 0x702b004b, + 0x025b2301, + 0x2300469c, + 0x93029300, + 0xd0302900, + 0x4f8e0993, + 0xd00b07db, + 0x2b007f3b, + 0x23f7d001, + 0x4b8a401a, + 0x781b3320, + 0xd0012b00, + 0x401a23ef, + 0x0f5b0693, + 0xd00b2b07, + 0x07db08d3, + 0x2200d00c, + 0x4a82767a, + 0x9200321c, + 0x0909e013, + 0xe7d77029, + 0x02922201, + 0xe7f24694, + 0x07d20912, + 0x2201d008, + 0x4a7a767a, + 0x92003220, + 0x02522201, + 0xe0009202, + 0x4a772100, + 0x63d32307, + 0x4a752322, + 0x68523240, + 0xd0fa421a, + 0x6b524a72, + 0x61da4b72, + 0x693b4f72, + 0x43932210, + 0x4b71613b, + 0x0792695a, + 0x4a6fd1fc, + 0x68123240, + 0x06d370aa, + 0x1e9a0edb, + 0xd3002a13, + 0x46222302, + 0x92013260, + 0x76d33008, + 0xd0552900, + 0x7f7f4677, + 0x469600da, + 0x2a041bd2, + 0x2204da00, + 0xd0232e01, + 0x330e0093, + 0xe052e001, + 0x4e60e04e, + 0x467362b3, + 0x485a181b, + 0x434a6203, + 0x45624617, + 0x4667dd00, + 0x9902485b, + 0x99026041, + 0x1e4919c9, + 0x68016081, + 0x43112221, + 0x6a266001, + 0x62261c76, + 0x98036266, + 0x28017bc0, + 0xe00ad006, + 0x4f5000d6, + 0x62be3616, + 0xe7dd011b, + 0x494f4849, + 0xf7ff3040, + 0x2e02fc48, + 0x78aadd06, + 0x98004639, + 0xf85cf000, + 0xe00f2102, + 0x98004639, + 0xfd5cf7ff, + 0x31404946, + 0x9a016ac9, + 0x210077d1, + 0xd0002e01, + 0xf7ff2108, + 0x2103fccc, + 0x77819801, + 0xbdf0b005, + 0x21019a01, + 0x6a217791, + 0x62211c49, + 0xe0026261, + 0x34602100, + 0x4a3777a1, + 0x62912100, + 0x62084931, + 0x7bc09803, + 0xd1e92801, + 0x3040482e, + 0x06c968c1, + 0x2100d5fc, + 0x29021c49, + 0x4930dbfc, + 0xfc0bf7ff, + 0x481ee7dc, + 0x4601b510, + 0x460a3160, + 0x232f7e89, + 0x29025419, + 0x7d01d010, + 0xd5130689, + 0x29016a01, + 0x6ec1dd10, + 0x06c97849, + 0x1e8b0ec9, + 0xd8092b12, + 0x1e5b7d43, + 0xe0067543, + 0xfbfcf7ff, + 0xd0002800, + 0xbd102001, + 0x76d12100, + 0xbd102000, + 0x33804b1b, + 0x7083695b, + 0x22017042, + 0x42910252, + 0x2102dd03, + 0x71017001, + 0x21014770, + 0x47707001, + 0x0000ffff, + 0x21000048, + 0xe000e280, + 0xe000e100, + 0x21000160, + 0x00020f47, + 0x00025500, + 0x2100461d, + 0x21004517, + 0x21004489, + 0x2100442f, + 0x2100437d, + 0x21004171, + 0x21000000, + 0x40045040, + 0x40042100, + 0x400451c0, + 0x40042000, + 0x40045300, + 0x40048000, + 0x40046000, + 0x490cb510, + 0x4a0c4788, + 0x5e512106, + 0xd0072900, + 0xd0052902, + 0xd0032909, + 0xd0012910, + 0xd1072911, + 0x43c92177, + 0xdd014288, + 0xdd012800, + 0x43c0207f, + 0x0000bd10, + 0x000065a9, + 0x21000380, + 0x2500b570, + 0x614548ff, + 0xf000207d, + 0x4cfefcfd, + 0x07c06ae0, + 0x62e5d0fc, + 0xf0002082, + 0x48fbfcf5, + 0x07c96ac1, + 0x62c5d0fc, + 0x60a12101, + 0x60a56025, + 0x384048f6, + 0x60056081, + 0xbd706085, + 0x4bf4b530, + 0x68db685b, + 0xd00d2b00, + 0x189c0852, + 0x4def4aef, + 0xe0053240, + 0x079b6853, + 0x6b6bd5fc, + 0x1c405423, + 0xdbf74288, + 0xb5f7bd30, + 0x2400468e, + 0x00c9214b, + 0x49e8468c, + 0x684e4627, + 0x46254623, + 0x62544ae6, + 0x6ad24ae1, + 0x4ae307d1, + 0x68520fc9, + 0x42821b92, + 0x2701d900, + 0x6a524ae0, + 0xd006429a, + 0x684648dd, + 0x46604bde, + 0xb29d6adb, + 0x29014613, + 0x2f00d001, + 0x4ad6d0e6, + 0x6ad16ad0, + 0x0fc006c0, + 0x0fc90689, + 0x29014ed3, + 0x2801d101, + 0x210fd011, + 0x020968b0, + 0x1d404008, + 0x48cc6190, + 0x62c12100, + 0x62012101, + 0x68784fcc, + 0x99026130, + 0xd00e2902, + 0x9802e013, + 0xd1032802, + 0x684048c7, + 0x61486871, + 0x20004671, + 0xf7ff9a02, + 0x2401ff9b, + 0x6871e7ea, + 0x8d892c01, + 0x1a40d01c, + 0x48c160f0, + 0x0a2a6ac0, + 0x0a08b281, + 0xb2c91880, + 0x1889b2ea, + 0x084a0840, + 0x23ff1811, + 0x1a103301, + 0x02001a59, + 0xfc6cf000, + 0x68706170, + 0x8d828873, + 0x18d56931, + 0xe00468f0, + 0x30f01a40, + 0x6879e7e0, + 0x1a096131, + 0xd3fa42a9, + 0x21009d02, + 0xd0052d02, + 0xd1032c01, + 0x1a086931, + 0x1ac11a80, + 0x1a406930, + 0x2c0160f0, + 0x2000d002, + 0xbdfe43c0, + 0xbdfe2000, + 0x4ba6b510, + 0x2402499e, + 0x28002201, + 0x48a4d007, + 0x694861d8, + 0x61484390, + 0x43206948, + 0x48a1e006, + 0x694861d8, + 0x61484310, + 0x43a06948, + 0x499b6148, + 0x6bc83940, + 0x40184b9c, + 0x43032303, + 0x431063cb, + 0xbd1063c8, + 0x9c02b510, + 0x02240112, + 0x3c013cff, + 0x43143a10, + 0x430c1e49, + 0x61cc498b, + 0x4b8a624b, + 0x3b402202, + 0x2200605a, + 0x620a62ca, + 0x02004a87, + 0x79926852, + 0xd0022a02, + 0x61881cc0, + 0x1d00bd10, + 0x7808e7fb, + 0x62c84983, + 0x49804770, + 0x68896849, + 0xd0042900, + 0x18080840, + 0x7800497e, + 0x487a62c8, + 0x38402103, + 0x60416001, + 0x20014976, + 0x60486008, + 0xb5384770, + 0xf7ff4605, + 0x4872ffe8, + 0x62c12100, + 0x62012108, + 0x78234c71, + 0x68a09300, + 0x05004b77, + 0x78620f00, + 0xffb6f7ff, + 0xf7ff2000, + 0x6861ff91, + 0x68082d02, + 0x8dc8d100, + 0x2101462a, + 0xfef9f7ff, + 0xb5f7bd38, + 0x46154966, + 0x684a2000, + 0x46944607, + 0x6ac94960, + 0x496207ce, + 0x68490ff6, + 0x1a8a4662, + 0x428a9900, + 0x2701d900, + 0x6a4c495e, + 0xd0074284, + 0xd0012c00, + 0xe0002001, + 0xf7ff2000, + 0x4620ff69, + 0xd0012e01, + 0xd0e32f00, + 0x21004851, + 0x4a526141, + 0x4e526ad0, + 0x0fc006c0, + 0xd1032d00, + 0x685b4b50, + 0x61636874, + 0xd0012f00, + 0xd01d2800, + 0x462a2401, + 0x99012000, + 0xfea8f7ff, + 0x6ac0484b, + 0xb2810223, + 0xb2ca0a08, + 0x1a101811, + 0x02001a59, + 0xfb88f000, + 0x4a436170, + 0x61316851, + 0x79836870, + 0x432f461f, + 0x2b01d00e, + 0xe01ad014, + 0x68b0230f, + 0x4018021b, + 0x61901d40, + 0x62c14837, + 0x62012101, + 0xe7e82400, + 0x2c008d83, + 0x1ac9d002, + 0xe00731f0, + 0xe0051ac9, + 0xd1042d00, + 0x1ac98d83, + 0x310531ff, + 0x8d8160f1, + 0x23008877, + 0x19c9468c, + 0x68f06932, + 0x4a2ce002, + 0x61326852, + 0x428a1a12, + 0x2d00d3f9, + 0x2c00d006, + 0x6931d004, + 0x46601a09, + 0x1bc31a08, + 0x1ac06930, + 0x2c0060f0, + 0x2000d001, + 0x2000bdfe, + 0xbdfe43c0, + 0x4605b538, + 0xff39f7ff, + 0x2100481a, + 0x210862c1, + 0x4c1a6201, + 0x93007823, + 0x4b2068a0, + 0x0f000500, + 0xf7ff7862, + 0x2000ff07, + 0xfee2f7ff, + 0x2d006861, + 0xd1006808, + 0x462a8dc8, + 0xf7ff2101, + 0xbd38ff52, + 0x4c0db530, + 0x62e52500, + 0x3a100112, + 0x430a1e49, + 0x626361e2, + 0x1c800200, + 0x480961a0, + 0x60012101, + 0x61456942, + 0x32404a06, + 0x68406011, + 0xe0173028, + 0x40041100, + 0x40046000, + 0x40045040, + 0x210053e8, + 0x40043000, + 0x40045300, + 0x400451c0, + 0x40044040, + 0x08180532, + 0x0818070e, + 0xfff000ff, + 0x0000aaaa, + 0x318049ff, + 0xbd306008, + 0x4605b538, + 0xfee5f7ff, + 0x210048fc, + 0x210662c1, + 0x4cfb6201, + 0x78232108, + 0x68a09300, + 0x05004bf9, + 0x78620f00, + 0xffb8f7ff, + 0x48f749f8, + 0x200161c8, + 0xfe8af7ff, + 0x462a6860, + 0x21016800, + 0xfefdf7ff, + 0xb530bd38, + 0x4bf24df2, + 0x35804cf2, + 0xd00e2a40, + 0x58420089, + 0x625a0c12, + 0xb2925842, + 0x1808629a, + 0x0c096841, + 0x684062a1, + 0x6328b280, + 0x00c9bd30, + 0x0c125842, + 0x584262da, + 0x631ab292, + 0x68411808, + 0x62590c09, + 0xb2896841, + 0x68816299, + 0x49e00c0a, + 0x634a31c0, + 0xb2926882, + 0x68c1638a, + 0x62a10c09, + 0xe7e168c0, + 0x4606b5f0, + 0x2080b089, + 0xfa8ef000, + 0x2500b662, + 0x204f4cd2, + 0x60e56066, + 0x00c049d6, + 0x47889501, + 0x68606125, + 0x290079c1, + 0x21ffd001, + 0x30203101, + 0x4acf60a1, + 0x62117901, + 0x21207902, + 0xd1002a00, + 0x70212140, + 0x21027980, + 0xd1002800, + 0x48ca2101, + 0x47807061, + 0x49c06860, + 0x79403020, + 0x62c83180, + 0x478048c6, + 0x80602000, + 0x384048bf, + 0x48c56bc0, + 0x610149c3, + 0x90002000, + 0x684849b8, + 0x24003020, + 0x46267c40, + 0x46259405, + 0x90029403, + 0x48b3e20c, + 0x4ab02700, + 0x68506147, + 0x31504601, + 0x48ade001, + 0x42886840, + 0x48b8d3fb, + 0x48b64780, + 0x48b76147, + 0x7ac07ac1, + 0x0fc907c9, + 0x40102202, + 0xd0024301, + 0xb00948b3, + 0x48a5bdf0, + 0x80412100, + 0x97076847, + 0x7cf93720, + 0x90060860, + 0xfa32f000, + 0xd1142900, + 0x42a09805, + 0x9802d011, + 0xd03b2800, + 0x07c09902, + 0x0fc00849, + 0x28009102, + 0x7cb8d002, + 0x90024048, + 0x98027c39, + 0xfa1cf000, + 0x9807460d, + 0x6b409405, + 0x5bc200ef, + 0x428a9900, + 0x1db9d02e, + 0x1d395a43, + 0x5c439300, + 0x5c421cb9, + 0x5c411cf9, + 0xf000200e, + 0x488afa0d, + 0x68402201, + 0x6b402300, + 0x5bc04611, + 0xf0000400, + 0x488dfa09, + 0x48924780, + 0x29037801, + 0x4882d1fc, + 0x8f096841, + 0x497e8041, + 0x46026848, + 0xe0073238, + 0x7c381c6d, + 0x42a8b2ed, + 0x2500d8cd, + 0x6848e7cb, + 0xd3fc4290, + 0x68404878, + 0x5bc06b40, + 0x48799000, + 0x68813840, + 0xf000207e, + 0x4873f9eb, + 0x6a386847, + 0xd0062800, + 0x46200041, + 0xf9d0f000, + 0xd0052900, + 0x496de014, + 0x780a69b8, + 0xe0334621, + 0xd00b2c00, + 0x30204638, + 0x07ca7fc1, + 0x2201d018, + 0x43917782, + 0x496f77c1, + 0x608802d0, + 0x900469b8, + 0x90076a38, + 0x46200041, + 0xf9b2f000, + 0x42819807, + 0x2c00d113, + 0x4638d00f, + 0x7fc13020, + 0xd401078a, + 0xe7664869, + 0x77822202, + 0x401122fd, + 0x200177c1, + 0x02c04960, + 0x69f86088, + 0x46209004, + 0xf0006a39, + 0x4852f997, + 0x98047802, + 0xfec1f7ff, + 0xd1042c00, + 0x6840484e, + 0x28027980, + 0x9806d00c, + 0x484b9001, + 0x79806840, + 0xd0072801, + 0x28004f48, + 0x2802d058, + 0xe078d07e, + 0xe12f2402, + 0xf7ff4620, + 0xb280fe87, + 0x48414684, + 0x6ac33040, + 0x68504a40, + 0x98016907, + 0x1d4800c1, + 0x6850543b, + 0x1d086903, + 0x4660541d, + 0xd00e2800, + 0x20006852, + 0x691243c0, + 0x50502c00, + 0xe002d167, + 0xb2a41ca4, + 0x9803e053, + 0x90031c40, + 0x6857e04f, + 0x5dc02027, + 0xd0012801, + 0xe0146950, + 0x30804832, + 0x071b6a83, + 0x61530f1b, + 0x05806a80, + 0x2b070e80, + 0x3b10dd01, + 0x281f6153, + 0x3840dd01, + 0x0100b200, + 0x010018c0, + 0x30ff6150, + 0x30014b33, + 0xd3014298, + 0x61502000, + 0x30804824, + 0x69536a40, + 0x18c00200, + 0x5058693b, + 0xb2816950, + 0xe0ca207f, + 0xf7ff4620, + 0xb281fddf, + 0x30404817, + 0x48176ac3, + 0x69076840, + 0x00c09801, + 0x54bb1d42, + 0x1d034a13, + 0x29006852, + 0x54d56912, + 0x4910d04e, + 0x68492200, + 0x690943d2, + 0x500a2c00, + 0x1c76d0af, + 0x2c01b2b6, + 0xf7ffd8a8, + 0x4809fbf5, + 0x8d386847, + 0xe00042b0, + 0xd303e040, + 0x99038d7a, + 0xd27e428a, + 0x42884914, + 0xe054e028, + 0x40043000, + 0x40046000, + 0x210053e8, + 0x0000aaaa, + 0x08180532, + 0x40044040, + 0x40045140, + 0x40045300, + 0x0000424f, + 0x00009083, + 0x00004be3, + 0x0000c210, + 0x40041100, + 0x00000de5, + 0x21000128, + 0x04040003, + 0x210002e4, + 0x04060003, + 0x00000201, + 0x0000ffff, + 0x8d78d102, + 0xd06f4288, + 0x484d2101, + 0x60810449, + 0xe684484c, + 0x21004a4c, + 0x69126852, + 0xe75f5011, + 0xf7ff4620, + 0xb282fcc6, + 0x46946878, + 0x98016903, + 0x00c04639, + 0x549d1d02, + 0x6ad34a44, + 0x6917687a, + 0x54bb1d42, + 0x2a004662, + 0x6849d00a, + 0x43d22200, + 0x2c026909, + 0xd800500a, + 0x1c76e745, + 0xe73fb2b6, + 0x68494939, + 0x3120468c, + 0x290179c9, + 0x4938d125, + 0x07136a8a, + 0x0f1b4a37, + 0x6a896997, + 0x0f3f073f, + 0x69920589, + 0x05920e89, + 0x2b070e92, + 0x3b10dd00, + 0xdd002f07, + 0x291f3f10, + 0x3940dd01, + 0x2a1fb209, + 0x3a40dd03, + 0xe01fe000, + 0x0109b212, + 0x19c918c9, + 0x18890112, + 0x4924010a, + 0x4923614a, + 0x694a4b26, + 0x320132ff, + 0xd301429a, + 0x614a2200, + 0x6a524a20, + 0x0212694b, + 0x466218d3, + 0x50136912, + 0xb2816948, + 0xf0002083, + 0xe6fbf873, + 0x98018fb9, + 0xf856f000, + 0xd1072900, + 0x28009801, + 0x8778d004, + 0x48102101, + 0x608103c9, + 0x68414810, + 0x42a18889, + 0xe5ecd900, + 0x480b2101, + 0x60810409, + 0x1e49480b, + 0x8d026840, + 0xd103428a, + 0x42888d40, + 0xe5d3d100, + 0x98014906, + 0x87486849, + 0xf0002081, + 0x2000f825, + 0x0000e5ef, + 0x40041100, + 0x04030003, + 0x210053e8, + 0x40046040, + 0x400451c0, + 0x40045080, + 0x00000201, + 0x49068800, + 0xd1064288, + 0x21004805, + 0x49058501, + 0x20016241, + 0x20824770, + 0x00004770, + 0x00006801, + 0x21000108, + 0x21004159, + 0x4801b403, + 0xbd019001, + 0x00003cc3, + 0x4801b403, + 0xbd019001, + 0x0000937d, + 0x4801b403, + 0xbd019001, + 0x00009361, + 0x4801b403, + 0xbd019001, + 0x0000867b, + 0x4801b403, + 0xbd019001, + 0x000049a3, + 0x4801b403, + 0xbd019001, + 0x00003c8f, + 0x4801b403, + 0xbd019001, + 0x00003ca9, + 0x4674b430, + 0x78251e64, + 0x42ab1c64, + 0x461dd200, + 0x005b5d63, + 0xbc3018e3, + 0x00004718, + 0x08180532, + 0x0818070e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, +}; +#define _NWORD_PATCHIMAGE_MULTI_PROTOCOL_RTLS 1261 + +CPE_PATCH_TYPE patchCpeHd[] = { + 0x00000000, +}; +#define _NWORD_PATCHCPEHD_MULTI_PROTOCOL_RTLS 1 + +#define _NWORD_PATCHSYS_MULTI_PROTOCOL_RTLS 0 + + + +#ifndef _MULTI_PROTOCOL_RTLS_SYSRAM_START +#define _MULTI_PROTOCOL_RTLS_SYSRAM_START 0x20000000 +#endif + +#ifndef _MULTI_PROTOCOL_RTLS_CPERAM_START +#define _MULTI_PROTOCOL_RTLS_CPERAM_START 0x21000000 +#endif + +#define _MULTI_PROTOCOL_RTLS_SYS_PATCH_FIXED_ADDR 0x20000000 + +#define _MULTI_PROTOCOL_RTLS_PATCH_VEC_ADDR_OFFSET 0x03D0 +#define _MULTI_PROTOCOL_RTLS_PATCH_TAB_OFFSET 0x03D4 +#define _MULTI_PROTOCOL_RTLS_IRQPATCH_OFFSET 0x0480 +#define _MULTI_PROTOCOL_RTLS_PATCH_VEC_OFFSET 0x404C + +#define _MULTI_PROTOCOL_RTLS_PATCH_CPEHD_OFFSET 0x04E0 + +#ifndef _MULTI_PROTOCOL_RTLS_NO_PROG_STATE_VAR +static uint8_t bMultiProtocolRtlsPatchEntered = 0; +#endif + +PATCH_FUN_SPEC void enterMultiProtocolRtlsCpePatch(void) +{ +#if (_NWORD_PATCHIMAGE_MULTI_PROTOCOL_RTLS > 0) + uint32_t *pPatchVec = (uint32_t *) (_MULTI_PROTOCOL_RTLS_CPERAM_START + _MULTI_PROTOCOL_RTLS_PATCH_VEC_OFFSET); + + memcpy(pPatchVec, patchImageMultiProtocolRtls, sizeof(patchImageMultiProtocolRtls)); +#endif +} + +PATCH_FUN_SPEC void enterMultiProtocolRtlsCpeHdPatch(void) +{ +#if (_NWORD_PATCHCPEHD_MULTI_PROTOCOL_RTLS > 0) + uint32_t *pPatchCpeHd = (uint32_t *) (_MULTI_PROTOCOL_RTLS_CPERAM_START + _MULTI_PROTOCOL_RTLS_PATCH_CPEHD_OFFSET); + + memcpy(pPatchCpeHd, patchCpeHd, sizeof(patchCpeHd)); +#endif +} + +PATCH_FUN_SPEC void enterMultiProtocolRtlsSysPatch(void) +{ +} + +PATCH_FUN_SPEC void configureMultiProtocolRtlsPatch(void) +{ + uint8_t *pPatchTab = (uint8_t *) (_MULTI_PROTOCOL_RTLS_CPERAM_START + _MULTI_PROTOCOL_RTLS_PATCH_TAB_OFFSET); + + + pPatchTab[1] = 0; + pPatchTab[18] = 1; + pPatchTab[81] = 2; + pPatchTab[26] = 3; + pPatchTab[76] = 4; + pPatchTab[62] = 5; + pPatchTab[64] = 6; + pPatchTab[91] = 7; + pPatchTab[79] = 8; + pPatchTab[168] = 9; +} + +PATCH_FUN_SPEC void applyMultiProtocolRtlsPatch(void) +{ +#ifdef _MULTI_PROTOCOL_RTLS_NO_PROG_STATE_VAR + enterMultiProtocolRtlsSysPatch(); + enterMultiProtocolRtlsCpePatch(); +#else + if (!bMultiProtocolRtlsPatchEntered) + { + enterMultiProtocolRtlsSysPatch(); + enterMultiProtocolRtlsCpePatch(); + bMultiProtocolRtlsPatchEntered = 1; + } +#endif + enterMultiProtocolRtlsCpeHdPatch(); + configureMultiProtocolRtlsPatch(); +} + +PATCH_FUN_SPEC void refreshMultiProtocolRtlsPatch(void) +{ + enterMultiProtocolRtlsCpeHdPatch(); + configureMultiProtocolRtlsPatch(); +} + +#ifndef _MULTI_PROTOCOL_RTLS_NO_PROG_STATE_VAR +PATCH_FUN_SPEC void cleanMultiProtocolRtlsPatch(void) +{ + bMultiProtocolRtlsPatchEntered = 0; +} +#endif + +PATCH_FUN_SPEC void rf_patch_cpe_multi_protocol_rtls(void) +{ + applyMultiProtocolRtlsPatch(); +} + + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // _RF_PATCH_CPE_MULTI_PROTOCOL_RTLS_H + diff --git a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_prop.h b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_prop.h index c0ee68329..e9baefae1 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_prop.h +++ b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_cpe_prop.h @@ -1,11 +1,11 @@ /****************************************************************************** * Filename: rf_patch_cpe_prop.h -* Revised: $Date: 2018-05-07 15:02:01 +0200 (ma, 07 mai 2018) $ -* Revision: $Revision: 18438 $ +* Revised: $Date: 2019-02-27 16:13:01 +0100 (on, 27 feb 2019) $ +* Revision: $Revision: 18889 $ * * Description: RF core patch for proprietary radio support ("PROP" API command set) in CC13x2 and CC26x2 * -* Copyright (c) 2015-2018, Texas Instruments Incorporated +* Copyright (c) 2015-2019, Texas Instruments Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -70,341 +70,51 @@ extern "C" CPE_PATCH_TYPE patchImageProp[] = { - 0x21004185, - 0x210041a5, - 0x2100421d, - 0x210042c5, - 0x2100436d, - 0x21004099, - 0x210040bd, - 0x210040df, - 0x210040cd, - 0x210043cd, - 0x210043e7, - 0x21004111, - 0x2100412d, - 0x2100413d, - 0x210044e5, - 0x2100414d, - 0xb081b5ff, - 0x9d0a4803, - 0xb5f84700, - 0x48024684, - 0x47004613, - 0x00007f43, - 0x00005145, - 0x460cb5f7, - 0x47084900, - 0x0000681d, - 0x4801b510, - 0x00004700, - 0x000009df, - 0x460db5f8, - 0x4b0a4616, - 0x290c6d59, - 0x4b03d104, - 0x78192408, - 0x70194321, - 0x47084901, - 0x21000340, - 0x0000699d, - 0x46864810, - 0x21804801, - 0x47706041, - 0x40045000, - 0x2270480d, - 0x43916801, - 0x43112240, - 0x480b6001, - 0x480b4700, - 0x460c7801, - 0x43912208, - 0xf0007001, - 0x4807f803, - 0xbd107004, - 0xf7ffb510, - 0x4801ffe3, - 0x470038c8, - 0x000056cb, - 0x40043018, - 0x0000710f, - 0x210000b3, - 0x49044803, - 0x05c068c0, - 0x47880fc0, + 0x21004059, + 0x210040c3, + 0x21004085, + 0x79654c07, + 0xf809f000, + 0x40697961, + 0xd5030749, + 0x4a042101, + 0x60110389, + 0xb570bd70, 0x47084902, - 0x21000340, - 0x000087d1, - 0x000053cd, - 0xf0002000, - 0x4604f969, - 0x47004800, - 0x0000545b, - 0xf0002004, - 0x4605f961, - 0x47004800, - 0x0000533b, - 0xf811f000, + 0x21000380, + 0x40041108, + 0x0000592d, + 0xf819f000, 0x296cb2e1, 0x2804d00b, 0x2806d001, - 0x4907d107, + 0x490ed107, 0x07c97809, 0x7821d103, 0xd4000709, - 0xb0032002, + 0x490b2002, + 0x210c780a, + 0xd0024211, + 0x22804909, + 0xb003600a, 0xb5f0bdf0, - 0x4902b083, - 0x00004708, + 0x4907b083, + 0x48044708, + 0x22407801, + 0x70014391, + 0x47004804, 0x210000c8, - 0x0003071b, - 0x4905b672, - 0x22206808, - 0x600a4302, - 0x6ad24a03, - 0xb6626008, - 0x4770b250, - 0x40040000, - 0x40046040, - 0x4614b5f8, - 0x9b06461a, - 0x46139300, - 0xf7ff4622, - 0x9000ff57, - 0xd12d2800, - 0x6848495f, - 0xd0292800, - 0x00498809, - 0x43411b09, - 0x68c0485c, - 0x00640844, - 0x20187922, - 0xb2c61a80, - 0x04802001, - 0x0cc71808, - 0x46317965, - 0xf0004856, - 0x4855f9a3, - 0x19832201, - 0x408a1e69, - 0x21182000, - 0xe0071b8e, - 0x19090041, - 0x437988c9, - 0x40e91889, - 0x1c405419, - 0xdcf54286, - 0x4780484c, - 0xbdf89800, - 0xf7ffb570, - 0x4a46ff26, - 0x49492300, - 0x60534604, - 0x25136808, - 0x01ed8800, - 0x2e030b06, - 0x0760d00d, - 0x6808d43f, - 0x290c7bc1, - 0xdc0fd028, - 0xd0132904, - 0xd0142905, - 0xd10d290a, - 0xb2c0e01d, - 0xd0032806, - 0x8c006808, - 0xe02d8010, - 0xe02b8015, - 0xd018290f, - 0xd019291e, - 0xe0048015, - 0x01802013, - 0x4835e000, - 0x48308010, - 0x29c068c1, - 0x29d8d010, - 0x39ffd010, - 0xd1173939, - 0x20ffe00a, - 0xe7f130e7, - 0x309620ff, - 0x20ffe7ee, - 0xe7eb3045, - 0xe7e920a2, - 0xe000492a, - 0x6051492a, - 0x60c1492a, - 0x48232118, - 0xf93cf000, - 0x8013e000, - 0xbd704620, - 0x4604b5f8, - 0x4e1c481d, - 0x88003040, - 0x0a80460d, - 0xd00407c0, - 0x08644821, - 0x43447900, - 0x8830e025, - 0xd0222800, - 0x19000960, - 0xfec8f7ff, - 0x20014607, - 0x0240491b, - 0x46024788, - 0x1bc02005, - 0x40848831, - 0x18230848, - 0x62034817, - 0x21016241, - 0x430d61c1, - 0x60cd490a, - 0x07c969c1, - 0x6a80d1fc, - 0x60704910, - 0x39124610, - 0x46384788, - 0x2000bdf8, - 0x46206070, - 0xfea4f7ff, - 0x0000bdf8, - 0x21004540, - 0x21000028, - 0x21000000, - 0x0000764d, - 0x21000108, - 0x000003cd, - 0x00063b91, - 0x0003fd29, - 0x000090fd, - 0x21000340, - 0x000040e5, - 0x40044100, - 0x4c03b510, - 0xfe8cf7ff, - 0x28006820, - 0xbd10d1fa, - 0x40041100, - 0x480eb570, - 0x4c0e6ac0, - 0x0f000700, - 0x28012502, - 0x2804d005, - 0x280cd00b, - 0x280dd001, - 0x6960d106, - 0x616043a8, - 0x49072001, - 0x60080280, - 0x4906bd70, - 0x47882001, - 0x43286960, - 0xbd706160, - 0x40046000, - 0x40041100, - 0xe000e180, - 0x00007d05, - 0x780a490b, - 0xd1042aff, - 0x7ad24a0a, - 0x0f120712, - 0x4908700a, - 0x75883140, - 0x49054770, - 0x29ff7809, - 0x0900d005, - 0x43080100, - 0x31404902, - 0x47707588, - 0x210002a5, - 0x40086200, - 0x4c19b570, - 0x7ba14606, - 0xf820f000, - 0x7be14605, - 0xf0004630, - 0x4915f81b, - 0x78094604, - 0x070a2028, - 0x2d01d401, - 0x2038d100, - 0xd40106c9, - 0xd1012c01, - 0x43082140, - 0x4788490e, - 0xd0012dff, - 0x6145480d, - 0xd0012cff, - 0x61c4480c, - 0xbd704808, - 0xd0082900, - 0xd00629ff, - 0x070840c1, - 0x281c0ec0, - 0x2001d100, - 0x20ff4770, - 0x00004770, - 0x210000a8, - 0x21000340, - 0x000040e5, - 0x40045040, - 0x40046000, - 0x4e26b5f1, - 0x79742000, - 0x60f068f7, - 0x46254824, - 0x05c08800, - 0x2004d502, - 0x71744304, - 0x4b21221d, - 0x98002100, - 0x28004798, - 0x68f1d109, - 0x29001f03, - 0x9900d004, - 0xb2ca6809, - 0xd0032a2b, - 0x60f74618, - 0xbdf87175, - 0x0f890589, - 0xd1022902, - 0x400c21fb, - 0x21047174, - 0x400d400c, - 0xd0f242ac, - 0x03094a12, - 0xbdf86091, - 0x4604b570, - 0x28158800, - 0x490fd003, - 0x47884620, - 0x2075bd70, - 0x00c0490d, - 0x46054788, - 0xf7ff6860, - 0x2800ffbd, - 0x2487d001, - 0x2401e000, - 0x46284907, - 0x4788311c, - 0xbd704620, - 0x21000340, - 0x21000284, - 0x00004a99, - 0x40041100, - 0x0000270f, - 0x000045c7, - 0x4801b403, - 0xbd019001, - 0x000089dd, - 0x00000000, - 0x00000000, + 0x21000133, + 0xe000e200, + 0x00031641, + 0x00031b23, }; -#define _NWORD_PATCHIMAGE_PROP 329 +#define _NWORD_PATCHIMAGE_PROP 38 + +#define _NWORD_PATCHCPEHD_PROP 0 #define _NWORD_PATCHSYS_PROP 0 -#define _IRQ_PATCH_0 0x21004381 #ifndef _PROP_SYSRAM_START @@ -417,10 +127,12 @@ CPE_PATCH_TYPE patchImageProp[] = { #define _PROP_SYS_PATCH_FIXED_ADDR 0x20000000 -#define _PROP_PARSER_PATCH_TAB_OFFSET 0x0390 -#define _PROP_PATCH_TAB_OFFSET 0x0398 -#define _PROP_IRQPATCH_OFFSET 0x0434 -#define _PROP_PATCH_VEC_OFFSET 0x4024 +#define _PROP_PATCH_VEC_ADDR_OFFSET 0x03D0 +#define _PROP_PATCH_TAB_OFFSET 0x03D4 +#define _PROP_IRQPATCH_OFFSET 0x0480 +#define _PROP_PATCH_VEC_OFFSET 0x404C + +#define _PROP_PATCH_CPEHD_OFFSET 0x04E0 #ifndef _PROP_NO_PROG_STATE_VAR static uint8_t bPropPatchEntered = 0; @@ -435,35 +147,27 @@ PATCH_FUN_SPEC void enterPropCpePatch(void) #endif } +PATCH_FUN_SPEC void enterPropCpeHdPatch(void) +{ +#if (_NWORD_PATCHCPEHD_PROP > 0) + uint32_t *pPatchCpeHd = (uint32_t *) (_PROP_CPERAM_START + _PROP_PATCH_CPEHD_OFFSET); + + memcpy(pPatchCpeHd, patchCpeHd, sizeof(patchCpeHd)); +#endif +} + PATCH_FUN_SPEC void enterPropSysPatch(void) { } PATCH_FUN_SPEC void configurePropPatch(void) { - uint8_t *pParserPatchTab = (uint8_t *) (_PROP_CPERAM_START + _PROP_PARSER_PATCH_TAB_OFFSET); uint8_t *pPatchTab = (uint8_t *) (_PROP_CPERAM_START + _PROP_PATCH_TAB_OFFSET); - uint32_t *pIrqPatch = (uint32_t *) (_PROP_CPERAM_START + _PROP_IRQPATCH_OFFSET); - pPatchTab[84] = 0; - pPatchTab[142] = 1; - pPatchTab[66] = 2; - pPatchTab[102] = 3; - pPatchTab[28] = 4; - pPatchTab[104] = 5; - pPatchTab[75] = 6; - pPatchTab[73] = 7; - pPatchTab[117] = 8; - pPatchTab[105] = 9; - pPatchTab[106] = 10; - pPatchTab[70] = 11; - pPatchTab[71] = 12; - pPatchTab[69] = 13; - pParserPatchTab[0] = 14; - pPatchTab[60] = 15; - - pIrqPatch[21] = _IRQ_PATCH_0; + pPatchTab[76] = 0; + pPatchTab[62] = 1; + pPatchTab[64] = 2; } PATCH_FUN_SPEC void applyPropPatch(void) @@ -479,11 +183,13 @@ PATCH_FUN_SPEC void applyPropPatch(void) bPropPatchEntered = 1; } #endif + enterPropCpeHdPatch(); configurePropPatch(); } PATCH_FUN_SPEC void refreshPropPatch(void) { + enterPropCpeHdPatch(); configurePropPatch(); } @@ -499,7 +205,6 @@ PATCH_FUN_SPEC void rf_patch_cpe_prop(void) applyPropPatch(); } -#undef _IRQ_PATCH_0 //***************************************************************************** // diff --git a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_bt5.h b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_bt5.h deleted file mode 100644 index 951834610..000000000 --- a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_bt5.h +++ /dev/null @@ -1,623 +0,0 @@ -/****************************************************************************** -* Filename: rf_patch_mce_bt5.h -* Revised: $Date: 2017-12-01 13:47:22 +0100 (fr, 01 des 2017) $ -* Revision: $Revision: 18103 $ -* -* Description: RF core patch for Bluetooth 5 support in CC13x2 and CC26x2 -* -* Copyright (c) 2015-2017, Texas Instruments Incorporated -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* -* 1) Redistributions of source code must retain the above copyright notice, -* this list of conditions and the following disclaimer. -* -* 2) Redistributions in binary form must reproduce the above copyright notice, -* this list of conditions and the following disclaimer in the documentation -* and/or other materials provided with the distribution. -* -* 3) Neither the name of the ORGANIZATION nor the names of its contributors may -* be used to endorse or promote products derived from this software without -* specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -******************************************************************************/ -#ifndef _RF_PATCH_MCE_BT5_H -#define _RF_PATCH_MCE_BT5_H - -#include -#include "../inc/hw_types.h" - -#ifndef MCE_PATCH_TYPE -#define MCE_PATCH_TYPE static const uint32_t -#endif - -#ifndef PATCH_FUN_SPEC -#define PATCH_FUN_SPEC static inline -#endif - -#ifndef RFC_MCERAM_BASE -#define RFC_MCERAM_BASE 0x21008000 -#endif - -#ifndef MCE_PATCH_MODE -#define MCE_PATCH_MODE 0 -#endif - -MCE_PATCH_TYPE patchBt5Mce[511] = { - 0x2dee609e, - 0x2dc22dce, - 0x2fef0f54, - 0x5f970fef, - 0x5000179d, - 0x048005a0, - 0x40007f40, - 0x0f080128, - 0x04000800, - 0x404003ff, - 0x00002e20, - 0x00130003, - 0x00210010, - 0x00320022, - 0x00430031, - 0x00500040, - 0x00620053, - 0x00710061, - 0x005f0072, - 0x005d0060, - 0x005b005e, - 0x0059005c, - 0x0055005a, - 0x00570056, - 0x00cc0058, - 0x003c00c3, - 0x00000033, - 0x00020001, - 0x04000003, - 0x00180800, - 0x00030008, - 0x000a001a, - 0x0011002c, - 0x0003003e, - 0x00180008, - 0x0011001a, - 0x000a002c, - 0x4000003e, - 0x0000000c, - 0x00091488, - 0x000105f9, - 0x008b8000, - 0x0f500080, - 0x0a1d0000, - 0x00000590, - 0x04000005, - 0x00c17b20, - 0x000f0000, - 0x017f7f27, - 0x000c8000, - 0x14980000, - 0x05f90009, - 0x80000000, - 0x0080008b, - 0x00000f70, - 0x0590121d, - 0x00050000, - 0x7b200400, - 0x000000c1, - 0x7f26000f, - 0x4000017f, - 0x000ca00c, - 0x00030387, - 0x050140cd, - 0x01ee8000, - 0x06700080, - 0x091e0000, - 0x00560500, - 0x0000000c, - 0x00505014, - 0x001f0000, - 0x00007f7f, - 0x7f7f8804, - 0x00002c7f, - 0x00000000, - 0x009f0000, - 0x2e204040, - 0xfd900c03, - 0x0000783c, - 0x720e720d, - 0x7210720f, - 0xa4e5a35d, - 0xb63c67d8, - 0x7100b0d0, - 0xb110a0d0, - 0x8162721b, - 0x39621020, - 0x00200630, - 0x11011630, - 0x6c011401, - 0x60cb60c2, - 0x613c60f2, - 0x60cd60c2, - 0x624e61d9, - 0x60d360c2, - 0x616460f2, - 0x60c31220, - 0x73111210, - 0x73137312, - 0x001081b1, - 0xb07091b0, - 0xc4b160a5, - 0xc79160d4, - 0xc1fb78bc, - 0xc540c302, - 0xc62160d8, - 0xc5fb78ac, - 0xc460c302, - 0x6f131820, - 0x16116e23, - 0x68d91612, - 0x9c8c94eb, - 0x1e008170, - 0xc03044c2, - 0xc1f092b0, - 0xc63292d0, - 0x1820c9c0, - 0x120340ef, - 0x16126e23, - 0x830068ec, - 0x60c29990, - 0x7291b005, - 0x91f0c100, - 0xb120b128, - 0xb111b113, - 0x7100b0e8, - 0xa0e8b128, - 0xb910b230, - 0x99308c80, - 0x84a2b111, - 0xc0f384b4, - 0x7100b0d1, - 0xb002b012, - 0xa0d1b111, - 0x722c7291, - 0xb013b630, - 0xb0e0b003, - 0xb1207100, - 0x92c08170, - 0x96408190, - 0xb1207100, - 0x964292c3, - 0xb1207100, - 0x71009644, - 0xa0e0b120, - 0xb633a630, - 0x7100b0d3, - 0xa0d3b113, - 0x9910c030, - 0x9930c020, - 0x7100b0d1, - 0xa0d1b111, - 0xa0037291, - 0x7263a002, - 0x73067305, - 0x72917391, - 0xc7c0a230, - 0x60c29010, - 0x65bd658d, - 0x710065c4, - 0x7393a910, - 0x8b4fb910, - 0x3d8f316f, - 0x7313720f, - 0x00000000, - 0xb231b074, - 0x970fb35d, - 0xa044a4e5, - 0x67d0b064, - 0x67e5c2b1, - 0x455722f3, - 0x971f7100, - 0x9933c0a3, - 0xa2359117, - 0xb0787100, - 0x67d4c243, - 0xc030453c, - 0x60c267f7, - 0x7860658d, - 0xc5f065be, - 0x65c46968, - 0xb115b0d5, - 0x7100c031, - 0x22508090, - 0xb07445ce, - 0x7393a910, - 0x720fb910, - 0xb2317313, - 0xb35da0d5, - 0x39208b40, - 0xa4e59700, - 0xb064a044, - 0xb23467d0, - 0x67e5c261, - 0x458722f3, - 0xb0787100, - 0x67d4c2a3, - 0x67f7c040, - 0x84b060c2, - 0x997095a0, - 0x100e8980, - 0x959084a0, - 0x89809970, - 0xc080140e, - 0xc080180e, - 0x8351180e, - 0x39213981, - 0x16310661, - 0x14101100, - 0x311e6c00, - 0x318e311e, - 0x972e398e, - 0x22308240, - 0xb0d545b0, - 0xb1157100, - 0x61a8a0d5, - 0x91e0c100, - 0x99107810, - 0x789a13e7, - 0xc540b4e5, - 0xb0029010, - 0xb006b004, - 0x78507000, - 0x90309050, - 0x90607870, - 0x70009040, - 0xb06cb235, - 0xb089b011, - 0xa0d1b4e5, - 0xb13da0d0, - 0x7000b0fd, - 0x8a439a31, - 0x31338a54, - 0x31343d63, - 0x96933d64, - 0xb05396a4, - 0x8990616b, - 0x73119300, - 0x721f7312, - 0x81707291, - 0x819092c0, - 0xc0509640, - 0xc15c67f7, - 0xc07ec31d, - 0xb0e8c008, - 0xb1287100, - 0xb230a0e8, - 0x8c80b910, - 0xb1119930, - 0x7100b0d1, - 0xb634a0d1, - 0xb002b0e1, - 0xb003b012, - 0xb121b013, - 0xa0e17100, - 0xb630a634, - 0xb0d3b113, - 0xb0e0b120, - 0xc0f084a4, - 0x663f104f, - 0x6a063914, - 0xc0f084b4, - 0x663f104f, - 0x6a0c3914, - 0xc0408c94, - 0x663f104f, - 0x6a123914, - 0x22048c94, - 0x81df4624, - 0x8210663f, - 0x421f2210, - 0xc0306219, - 0x663fc00f, - 0x62316a20, - 0xc01ec35d, - 0x663f81df, - 0x22108210, - 0x6224422c, - 0xc00fc030, - 0x6a2d663f, - 0xa0e16231, - 0x9910c030, - 0x9930c040, - 0xb0d1b111, - 0xa0d17100, - 0xa0037291, - 0x7223a002, - 0x061f60c2, - 0x148f313f, - 0x6ff214cf, - 0x39481028, - 0x14d20632, - 0x71006f23, - 0x92ceb120, - 0x70009643, - 0x67f7c060, - 0x93008990, - 0xdb007265, - 0xb31d9660, - 0x91e0c100, - 0x9320c0c0, - 0x97507b90, - 0xc3b1c100, - 0x6f13c7d2, - 0x16116e23, - 0x6a5f1612, - 0x677b67a8, - 0x22308240, - 0xb0d54670, - 0xb1157100, - 0x6266a0d5, - 0x67f7c070, - 0x7840b235, - 0x00018001, - 0x90109001, - 0x90307850, - 0x78809050, - 0x90609040, - 0x9380df20, - 0xb4e5b072, - 0xb63bb3f0, - 0x99107820, - 0x67f7c080, - 0xb10c7393, - 0xb13db14c, - 0xb10fb0fd, - 0xb008b14f, - 0xa0087100, - 0xa914b914, - 0xa910b14c, - 0x7100791e, - 0x894fb910, - 0x22c080c0, - 0x22f047f1, - 0xa0fd468c, - 0xa0447210, - 0xb074b064, - 0xb230b231, - 0x720f7232, - 0xa049a048, - 0xa009a04a, - 0x9930c200, - 0xb0d1b111, - 0xa0d17100, - 0x22208780, - 0xb0e74716, - 0xb127c1f0, - 0x6ab57100, - 0xa4e5b04f, - 0xb073a31d, - 0x9320c0c0, - 0xb041b04b, - 0x67f7c090, - 0x1e038183, - 0x895b42c2, - 0x18b08940, - 0x063c100c, - 0x31333920, - 0xc3201803, - 0x99331803, - 0x7830a910, - 0xb1119910, - 0xb0d1b910, - 0x46ff22f3, - 0x398a830a, - 0x866b395a, - 0x8650313b, - 0x39503980, - 0x1204000b, - 0x80907100, - 0x46ff2210, - 0x86528301, - 0xba3a8663, - 0x31858b25, - 0x1c543125, - 0x4af542fc, - 0x14b214a1, - 0x16135ef9, - 0x18a162f9, - 0x5af918b2, - 0x93011a13, - 0x96639652, - 0xb1271054, - 0xb23362e2, - 0x78d4b750, - 0x78c49794, - 0xc0e097a4, - 0x6b06b760, - 0x7223a0d1, - 0x8af473a3, - 0x9a14d0a0, - 0xa0e767f7, - 0x72047203, - 0x73067305, - 0x60c27291, - 0xc0d0a4e5, - 0x1cfe9930, - 0xd6a0471d, - 0xd690631f, - 0x93800000, - 0xb072b073, - 0x7ba0b04b, - 0xa0e79750, - 0xb0d1b111, - 0x7100b1b3, - 0xb04fb06f, - 0xb041b04d, - 0x9320c0c0, - 0x8af0ba39, - 0x97003110, - 0x7393b960, - 0x6b37cf00, - 0xa00ab01a, - 0x67f7c0b0, - 0x1e038183, - 0x895b433c, - 0x18b08940, - 0x18033133, - 0x180378e0, - 0xa9109933, - 0xb910b111, - 0x476722f3, - 0x89a189a0, - 0x434d1c10, - 0xb127b0e7, - 0x1201b750, - 0x80a07100, - 0x43632270, - 0x1e11b127, - 0x1611435d, - 0x89a06354, - 0x89b09790, - 0xb76097a0, - 0x80901201, - 0x43542210, - 0xb233a0e7, - 0xb750a04d, - 0x97a478f4, - 0x97947904, - 0xb760c0e0, - 0xa0d16b6f, - 0xc0c07223, - 0x720367f7, - 0x73057204, - 0x72917306, - 0xc15c60c2, - 0xc00ac00d, - 0xc070c008, - 0xc2db84ae, - 0x67996fb7, - 0x161b6b83, - 0xc0706fb7, - 0x6799c00a, - 0x84be6b89, - 0x6fb7161b, - 0xc00ac070, - 0x6b906799, - 0x6fb7161b, - 0xc00ac070, - 0x6b966799, - 0x10ef7000, - 0x313f061f, - 0x14cf148f, - 0x10286ff2, - 0x06323948, - 0x3f1a002a, - 0x6e7a3f1a, - 0x7000391e, - 0xc00dc15c, - 0xc0e0c008, - 0xc25b84ae, - 0x061f10ef, - 0x148f313f, - 0x6ff214cf, - 0x39481028, - 0x47ba0632, - 0x63c3ccca, - 0x47be1e12, - 0x63c3cc3a, - 0x47c21e22, - 0x63c3c3ca, - 0x2200c33a, - 0x10a643c7, - 0x6fb763cc, - 0x006a318a, - 0x161b6e7a, - 0x6bae391e, - 0x7000b064, - 0x1e038183, - 0x700043d0, - 0x91179933, - 0xa35d7100, - 0x73917223, - 0x72037291, - 0x72637204, - 0x9000c030, - 0x9010ffc0, - 0x73067305, - 0x895b7000, - 0x18b08940, - 0x18033123, - 0x99331813, - 0xb111a910, - 0xb0d1b910, - 0xb9147000, - 0xb14ca914, - 0x792ea910, - 0x9a006295, - 0x220089f0, - 0xb9e047f8, - 0x00007000 -}; - -PATCH_FUN_SPEC void rf_patch_mce_bt5(void) -{ -#ifdef __PATCH_NO_UNROLLING - uint32_t i; - for (i = 0; i < 511; i++) { - HWREG(RFC_MCERAM_BASE + 4 * i) = patchBt5Mce[i]; - } -#else - const uint32_t *pS = patchBt5Mce; - volatile unsigned long *pD = &HWREG(RFC_MCERAM_BASE); - uint32_t t1, t2, t3, t4, t5, t6, t7, t8; - uint32_t nIterations = 63; - - do { - t1 = *pS++; - t2 = *pS++; - t3 = *pS++; - t4 = *pS++; - t5 = *pS++; - t6 = *pS++; - t7 = *pS++; - t8 = *pS++; - *pD++ = t1; - *pD++ = t2; - *pD++ = t3; - *pD++ = t4; - *pD++ = t5; - *pD++ = t6; - *pD++ = t7; - *pD++ = t8; - } while (--nIterations); - - t1 = *pS++; - t2 = *pS++; - t3 = *pS++; - t4 = *pS++; - t5 = *pS++; - t6 = *pS++; - t7 = *pS++; - *pD++ = t1; - *pD++ = t2; - *pD++ = t3; - *pD++ = t4; - *pD++ = t5; - *pD++ = t6; - *pD++ = t7; -#endif -} - -#endif diff --git a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_genfsk.h b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_genfsk.h deleted file mode 100644 index d6074376a..000000000 --- a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_genfsk.h +++ /dev/null @@ -1,591 +0,0 @@ -/****************************************************************************** -* Filename: rf_patch_mce_genfsk.h -* Revised: $Date: 2018-01-15 06:15:14 +0100 (ma, 15 jan 2018) $ -* Revision: $Revision: 18170 $ -* -* Description: RF core patch for Generic FSK support in CC13x2 and CC26x2 -* -* Copyright (c) 2015-2017, Texas Instruments Incorporated -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* -* 1) Redistributions of source code must retain the above copyright notice, -* this list of conditions and the following disclaimer. -* -* 2) Redistributions in binary form must reproduce the above copyright notice, -* this list of conditions and the following disclaimer in the documentation -* and/or other materials provided with the distribution. -* -* 3) Neither the name of the ORGANIZATION nor the names of its contributors may -* be used to endorse or promote products derived from this software without -* specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -******************************************************************************/ - -#ifndef _RF_PATCH_MCE_GENFSK_H -#define _RF_PATCH_MCE_GENFSK_H - -#include -#include "../inc/hw_types.h" - -#ifndef MCE_PATCH_TYPE -#define MCE_PATCH_TYPE static const uint32_t -#endif - -#ifndef PATCH_FUN_SPEC -#define PATCH_FUN_SPEC static inline -#endif - -#ifndef RFC_MCERAM_BASE -#define RFC_MCERAM_BASE 0x21008000 -#endif - -#ifndef MCE_PATCH_MODE -#define MCE_PATCH_MODE 0 -#endif - -MCE_PATCH_TYPE patchGenfskMce[484] = { - 0x2fcf603c, - 0x030c3f9d, - 0x070c680a, - 0xfff0003f, - 0xff0000ff, - 0x00c08080, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00070003, - 0x00003d1f, - 0x04000000, - 0x0000000f, - 0x000b0387, - 0x004340f4, - 0x00828000, - 0x06700080, - 0x091e0000, - 0x00540510, - 0x02000005, - 0x00613e10, - 0x002f0000, - 0x027f3030, - 0x00000000, - 0x00000000, - 0x00000000, - 0x0000aa00, - 0x00000000, - 0x00000000, - 0x72637223, - 0xa4e5a35d, - 0x73057303, - 0x73047203, - 0x72047306, - 0x72917391, - 0xffc0b008, - 0xa0089010, - 0x720e720d, - 0x7210720f, - 0x7100b0d0, - 0xa0d0b110, - 0x8162721b, - 0x39521020, - 0x00200670, - 0x11011630, - 0x6c011401, - 0x60796078, - 0x637960f8, - 0x60786078, - 0x60786078, - 0x60796078, - 0x637960f8, - 0x60786078, - 0x60786078, - 0x72231210, - 0x73127311, - 0x81b17313, - 0x91b00010, - 0x6050b070, - 0xc030606e, - 0xc14167c1, - 0xc4e0c2b2, - 0x6f131820, - 0x16116e23, - 0x687f1612, - 0x9c807830, - 0x9c907840, - 0x9ca07850, - 0x948078a0, - 0xc4f29490, - 0x1820c750, - 0x12034095, - 0x16126e23, - 0x78b06892, - 0x606e9990, - 0x81907291, - 0x81709640, - 0x2a703980, - 0x16111001, - 0x84b484a2, - 0xc0f5c0f3, - 0x1c01c200, - 0xc10040bd, - 0x40b31c10, - 0x10134cb5, - 0x18301803, - 0x1a101a13, - 0x68b03912, - 0x13f360bd, - 0x13f360bd, - 0xc1001015, - 0x1a151850, - 0x39141a10, - 0xb0e868bb, - 0xb1287100, - 0xb230a0e8, - 0x8990b910, - 0xb1119930, - 0x7100b0d1, - 0xb012b002, - 0xa0d1b111, - 0xb6307291, - 0xb013b003, - 0xb0e0722c, - 0xb1207100, - 0x92c08170, - 0xb1207100, - 0x22f08170, - 0x13f044d6, - 0x40e21c03, - 0x964292c3, - 0xb1207100, - 0x964492c5, - 0xb1207100, - 0xa630b0e0, - 0xa0e17000, - 0x9910c030, - 0x9930c040, - 0xb0d1b111, - 0xb1117100, - 0x7291a0d1, - 0xa002a003, - 0x7000a230, - 0x73127311, - 0x67c1c040, - 0x91f0c100, - 0xb6336498, - 0xb0d3b113, - 0xa0d37100, - 0x606e64e9, - 0xb016b006, - 0xb014b004, - 0xb012b002, - 0x78628440, - 0x81730420, - 0x2a733983, - 0xc1f294e3, - 0x31621832, - 0x31511021, - 0x00200012, - 0x10309440, - 0x10011610, - 0x39303121, - 0x41232210, - 0x31501220, - 0x31801003, - 0x16300010, - 0x12029380, - 0x22731204, - 0x84a04136, - 0x89829970, - 0x84c01a82, - 0x89849970, - 0x61381a84, - 0x41432263, - 0x997084b0, - 0x1a808980, - 0x84d01402, - 0x89809970, - 0x14041a80, - 0x84b0614f, - 0x04107891, - 0x89829970, - 0x84d01a42, - 0x04107891, - 0x89849970, - 0x31521a44, - 0x39633154, - 0x16130633, - 0x38343832, - 0x39823182, - 0x00423184, - 0x84a09722, - 0x84b09590, - 0x84c095a0, - 0x84d095b0, - 0x781095c0, - 0x90509030, - 0x90407820, - 0xb2359060, - 0x83338cb2, - 0xb0199332, - 0xc00cb018, - 0x8170c00b, - 0x39803180, - 0x81713940, - 0x0431c0f3, - 0x1441c014, - 0x1412c002, - 0x3122697b, - 0xc01084ed, - 0x312d140d, - 0x8c9e142d, - 0x311e318e, - 0x8c99397e, - 0x39793149, - 0x31293949, - 0x81a0109a, - 0x41922200, - 0xb008b009, - 0x720e720d, - 0xb121720f, - 0x7100b0e1, - 0xa0e1b072, - 0xb06ea04e, - 0xb06cb011, - 0x993ab089, - 0xb9147291, - 0xc662a914, - 0xc04f9912, - 0x8c8166fa, - 0x45ae22f1, - 0x22f18ca1, - 0x625845ae, - 0xb0737100, - 0x80b7b910, - 0x45e52207, - 0x8c81a910, - 0x41bf22f1, - 0x41bf2237, - 0x80b0b133, - 0x45ba2230, - 0x22e161cd, - 0x809041d2, - 0x41d22250, - 0x8240b115, - 0x41ae2220, - 0xb9149939, - 0xb116a914, - 0x993d61ae, - 0xa914b914, - 0x61aeb116, - 0x22f08ca0, - 0x223741de, - 0xb07541de, - 0x80b0b133, - 0x45d82230, - 0x61aeb087, - 0x433d22d1, - 0x22208090, - 0x66c0433d, - 0x993f61ae, - 0x8450c7f3, - 0x39803180, - 0x00303183, - 0xb0879450, - 0xb112a0f3, - 0xb115a0d2, - 0xb111a0d5, - 0xa0d6b0d1, - 0xb133b130, - 0x220080b0, - 0x223045f6, - 0x710045f6, - 0x99301260, - 0xba3fb111, - 0x87208b11, - 0x97011801, - 0x8c418c30, - 0xa009a008, - 0xa637a638, - 0x1801c022, - 0x4e181c21, - 0x4a161412, - 0x1c016219, - 0x4e184219, - 0x6219b637, - 0xb041b638, - 0x8ca0b061, - 0x422122e0, - 0x22208240, - 0x7100458d, - 0xb06eb04e, - 0x220180b1, - 0x223146b2, - 0x729146b2, - 0x84e1b116, - 0xc2603121, - 0x99301410, - 0x9910c7e0, - 0x9910c6f0, - 0xb0d6b116, - 0xb960a0d1, - 0x8c448c33, - 0x8c648c53, - 0x80b17100, - 0x46b22201, - 0x46b22231, - 0x22c08c80, - 0x8b414648, - 0x418d2201, - 0xc00081f1, - 0x84e091f0, - 0x6a4c81d2, - 0xc30091f1, - 0xb2319070, - 0x67c1c050, - 0xa0f3a0f0, - 0x7000a044, - 0xb0737100, - 0x80b7b910, - 0x46772207, - 0x46952237, - 0x8c81a910, - 0x427022e1, - 0x22508090, - 0xb1154270, - 0x22208240, - 0x993d4258, - 0xa914b914, - 0x6258b116, - 0x433d22d1, - 0x22208090, - 0x66c0433d, - 0x993f6258, - 0xa0d2b112, - 0xa0d5b115, - 0xb0d1b111, - 0xb130a0d6, - 0x80b0b133, - 0x467f2200, - 0x467f2230, - 0x12607100, - 0xb1119930, - 0x8b11ba3f, - 0x31808720, - 0x18013d80, - 0x8c309701, - 0xa1b28c41, - 0x993f6208, - 0xa0d2b112, - 0xa0d5b115, - 0xb0d1b111, - 0xb130a0d6, - 0x80b0b133, - 0x469d2200, - 0x469d2230, - 0x12607100, - 0xb1119930, - 0x8b11ba3f, - 0x3d808720, - 0x97011801, - 0x8c618c50, - 0x6208b1b2, - 0xa910b073, - 0xa960b910, - 0xa04eb072, - 0xb011b06e, - 0x22f08c80, - 0x220145e5, - 0x62954677, - 0x22b08c80, - 0x1e3b46c6, - 0x62c846f8, - 0x46f81e7b, - 0xba39c00b, - 0x31808af0, - 0x16103d80, - 0x140c3d30, - 0x220080b0, - 0x700042d4, - 0x39838c83, - 0x8c8106f3, - 0x0401cff0, - 0x1c1c3031, - 0x12004ef0, - 0x1c0c1810, - 0x80b04af2, - 0x42e52200, - 0x10c27000, - 0x3c321612, - 0x83508cb1, - 0x42f42210, - 0x933162f6, - 0x7000b112, - 0x62e1101c, - 0x62e1100c, - 0x62ed1821, - 0x62ed1421, - 0x62ee161b, - 0xb111b116, - 0xb133b130, - 0xb112b115, - 0x720e720d, - 0xb0f0720f, - 0x8c82b0f3, - 0x430b22f2, - 0xb913b0d6, - 0x8ca0630e, - 0x432e22f0, - 0xa444b445, - 0xa469b468, - 0x3180caa0, - 0x0001caa1, - 0x94d194c1, - 0x31838ca3, - 0x84503983, - 0x39803180, - 0x00303183, - 0x84409450, - 0x39503150, - 0x39838ca3, - 0xc1f406f3, - 0x31841834, - 0x00403134, - 0xb0899440, - 0x433822e2, - 0x394a8c9a, - 0x312a398a, - 0xb0d5993a, - 0xb913b0d6, - 0x22d28c82, - 0xb0d2433c, - 0xb23f7000, - 0xa0f3a0f0, - 0xb914993e, - 0xb116a914, - 0xb133b130, - 0x22f08240, - 0xb1154346, - 0xa0048002, - 0xa001a006, - 0x72047203, - 0x67c1c060, - 0xb9147100, - 0xb0d5b116, - 0x7100a23f, - 0xa0d5b115, - 0x90307810, - 0x78209002, - 0x90609040, - 0xa23fb072, - 0x993a66fa, - 0xb116a914, - 0xba3c61a7, - 0x8b5481b0, - 0x31843924, - 0x91b40004, - 0x67c1c070, - 0x72917391, - 0x72067263, - 0x72047202, - 0x73067305, - 0x8240606e, - 0x47812230, - 0x7100b0d5, - 0xa0d5b115, - 0x13006379, - 0xb63c91e0, - 0xc080b35d, - 0xb11867c1, - 0x12006506, - 0x99301a10, - 0x9910c380, - 0x9910c280, - 0xb0d6a0d1, - 0x22008090, - 0x81844450, - 0x43921e04, - 0xb1169934, - 0xd0908702, - 0x67c19a12, - 0x22118b41, - 0x8c5243a8, - 0xe0a08c63, - 0x9a239a12, - 0x63ae67c1, - 0x8c438c32, - 0x9a12e0b0, - 0x67c19a23, - 0x89318940, - 0x4bbe1c01, - 0x1ef11801, - 0x89314bbc, - 0x99311af1, - 0xb1167100, - 0x993116f1, - 0x7100a235, - 0xa0d6b116, - 0x9a006367, - 0x220089f0, - 0xb9e047c2, - 0x00007000 -}; - -PATCH_FUN_SPEC void rf_patch_mce_genfsk(void) -{ -#ifdef __PATCH_NO_UNROLLING - uint32_t i; - for (i = 0; i < 484; i++) { - HWREG(RFC_MCERAM_BASE + 4 * i) = patchGenfskMce[i]; - } -#else - const uint32_t *pS = patchGenfskMce; - volatile unsigned long *pD = &HWREG(RFC_MCERAM_BASE); - uint32_t t1, t2, t3, t4, t5, t6, t7, t8; - uint32_t nIterations = 60; - - do { - t1 = *pS++; - t2 = *pS++; - t3 = *pS++; - t4 = *pS++; - t5 = *pS++; - t6 = *pS++; - t7 = *pS++; - t8 = *pS++; - *pD++ = t1; - *pD++ = t2; - *pD++ = t3; - *pD++ = t4; - *pD++ = t5; - *pD++ = t6; - *pD++ = t7; - *pD++ = t8; - } while (--nIterations); - - t1 = *pS++; - t2 = *pS++; - t3 = *pS++; - t4 = *pS++; - *pD++ = t1; - *pD++ = t2; - *pD++ = t3; - *pD++ = t4; -#endif -} - -#endif diff --git a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_ieee_802_15_4.h b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_ieee_802_15_4.h deleted file mode 100644 index f72c7afb4..000000000 --- a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_ieee_802_15_4.h +++ /dev/null @@ -1,479 +0,0 @@ -/****************************************************************************** -* Filename: rf_patch_mce_ieee_802_15_4.h -* Revised: $Date: 2018-01-15 06:15:14 +0100 (ma, 15 jan 2018) $ -* Revision: $Revision: 18170 $ -* -* Description: RF core patch for IEEE 802.15.4-2006 support in CC13x2 and CC26x2 -* -* Copyright (c) 2015-2017, Texas Instruments Incorporated -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* -* 1) Redistributions of source code must retain the above copyright notice, -* this list of conditions and the following disclaimer. -* -* 2) Redistributions in binary form must reproduce the above copyright notice, -* this list of conditions and the following disclaimer in the documentation -* and/or other materials provided with the distribution. -* -* 3) Neither the name of the ORGANIZATION nor the names of its contributors may -* be used to endorse or promote products derived from this software without -* specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -******************************************************************************/ -#ifndef _RF_PATCH_MCE_IEEE_802_15_4_H -#define _RF_PATCH_MCE_IEEE_802_15_4_H - -#include -#include "../inc/hw_types.h" - -#ifndef MCE_PATCH_TYPE -#define MCE_PATCH_TYPE static const uint32_t -#endif - -#ifndef PATCH_FUN_SPEC -#define PATCH_FUN_SPEC static inline -#endif - -#ifndef RFC_MCERAM_BASE -#define RFC_MCERAM_BASE 0x21008000 -#endif - -#ifndef MCE_PATCH_MODE -#define MCE_PATCH_MODE 0 -#endif - -MCE_PATCH_TYPE patchIeee_802_15_4Mce[367] = { - 0xf7036064, - 0x70399b3a, - 0x039bb3af, - 0x39b33af7, - 0x9b3aaf70, - 0xb3aff703, - 0x3af77039, - 0xaf70039b, - 0x08fcb9b3, - 0x8fc664c5, - 0xfc644c50, - 0xc64cc508, - 0x64c5508f, - 0x4c5008fc, - 0xc5088fc6, - 0x508ffc64, - 0x2fc0c64c, - 0x079c0fcf, - 0x7f7f01e0, - 0x0000dead, - 0x00000003, - 0x0000001f, - 0x80000000, - 0x0004000c, - 0x00011400, - 0x00000009, - 0x00008000, - 0x06700000, - 0x16aa002b, - 0x00000a11, - 0x00000b60, - 0x00404010, - 0x00060000, - 0x001e1e1e, - 0x00000000, - 0x00000003, - 0x0000001f, - 0x80000000, - 0x0004000c, - 0x000114c4, - 0x00000009, - 0x00008000, - 0x0f900000, - 0x121d0000, - 0x00000a11, - 0x00000b60, - 0x00404010, - 0x00060000, - 0x00202020, - 0x00000000, - 0x720d7223, - 0x720f720e, - 0x72637210, - 0x7203a35d, - 0x73057204, - 0x73917306, - 0xc7c07291, - 0xb0d09010, - 0xa0d07100, - 0x721bb110, - 0x10208162, - 0x06703952, - 0x16300020, - 0x14011101, - 0x60a16c01, - 0x60ca60b2, - 0x61466119, - 0x60a160a1, - 0x60a160a1, - 0x60ca60ad, - 0x61466119, - 0x60a160a1, - 0x60a160a1, - 0x60ca60b2, - 0x61466119, - 0x60a160a1, - 0x60a160a1, - 0x60ca60ad, - 0x61466119, - 0x60a160a1, - 0x60a460a1, - 0x60a51220, - 0x73111210, - 0x73137312, - 0x001081b1, - 0xb07091b0, - 0xc4616073, - 0xc460c2b2, - 0x60b61820, - 0xc2b2c281, - 0x1820c460, - 0x6e236f13, - 0x16121611, - 0xc63268b6, - 0x1820c9c0, - 0x120340c3, - 0x16126e23, - 0x7a4068c0, - 0xc1409c80, - 0x12209c90, - 0x60a49990, - 0xc1307291, - 0xb11391f0, - 0x81621213, - 0xd0303982, - 0x66d89a12, - 0x40e41e02, - 0x40e41e12, - 0x40dd1e22, - 0x00238992, - 0xb00560e4, - 0x1e208990, - 0x60e444e2, - 0xa005b270, - 0xb0e8b128, - 0xb1287100, - 0x9233a0e8, - 0x1e008c80, - 0x993040f2, - 0xb111b910, - 0x7100b0d1, - 0xb002b012, - 0xb013b633, - 0xb111b003, - 0x7291a0d1, - 0x7100b0d3, - 0xa0d3b113, - 0xc0301000, - 0xc0209910, - 0xb0d19930, - 0xb1117100, - 0x7291a0d1, - 0x39828162, - 0x490d1a22, - 0x726366d1, - 0xa002a003, - 0x73057263, - 0x73917306, - 0xa2307291, - 0x9010c7c0, - 0xb63c60a4, - 0x94c07810, - 0x782095b0, - 0x95c094d0, - 0xc0f18190, - 0xc0120410, - 0x14023110, - 0x94a06f20, - 0x16129590, - 0x94b06f20, - 0x824095a0, - 0x45352230, - 0x7100b0d5, - 0xa0d5b115, - 0x7291612d, - 0x91e0c030, - 0xb004b002, - 0x8160b006, - 0x41402280, - 0x61417a20, - 0x90507a10, - 0x7a309030, - 0x90409060, - 0x8460b235, - 0x84613180, - 0x39813181, - 0x94500010, - 0x06f58195, - 0x1217120e, - 0x12f01206, - 0xc1909440, - 0xb0119440, - 0xb0f9b139, - 0xb089a0fc, - 0x12041203, - 0x39828162, - 0x9a12d040, - 0x1e2266d8, - 0x1e324227, - 0x7100421d, - 0xa0d17291, - 0xa0f9b139, - 0xb0fcb13c, - 0xc600a444, - 0x99303140, - 0xb111b910, - 0x7100b0d1, - 0x7291a0d1, - 0x22108090, - 0xb13c46d5, - 0x1e7665be, - 0x81904194, - 0x06f03940, - 0x45461c0f, - 0x1c908c90, - 0x12054d46, - 0x12761202, - 0x9070c300, - 0xc050b230, - 0xc0c066d8, - 0x7a509440, - 0x619b9450, - 0x91cf1647, - 0x1e008180, - 0x1c70419b, - 0x710049a0, - 0x22008090, - 0x617b4476, - 0x7291a235, - 0x72047203, - 0x73067305, - 0xa004a002, - 0x7263a006, - 0x73067305, - 0x72917391, - 0x9010c7c0, - 0x39808160, - 0x4dbb1a30, - 0x22508000, - 0x122045b9, - 0x124061bc, - 0x89c061bc, - 0x60a49990, - 0x120a1209, - 0x120dc0cc, - 0x8ad8ba3e, - 0x49c91c89, - 0x4dcf1c8a, - 0x108961d6, - 0x18801200, - 0x10db100a, - 0x108a61d6, - 0x18801200, - 0x10db1009, - 0x61d6168b, - 0x1e8d161d, - 0x908c41db, - 0x10bf61c2, - 0x41e61e82, - 0x16121495, - 0x45e61e82, - 0x81b03125, - 0x91b50005, - 0x49e91e8b, - 0xc0701a8b, - 0x163018b0, - 0x14011101, - 0x908c6c01, - 0x908c908c, - 0x908c908c, - 0x908c908c, - 0xb082908c, - 0xba3e1000, - 0xb0838ad3, - 0x1000b083, - 0x8ad4ba3e, - 0x4a071e8f, - 0x4a0c1ca3, - 0x4a0e1ca4, - 0x1c937000, - 0x1c944e0c, - 0x70004e0e, - 0x62101a1e, - 0x6210161e, - 0x1ce0c040, - 0x10e04a17, - 0x4a1a1640, - 0xc00e7000, - 0x7000b085, - 0xb084c00e, - 0xa3a77000, - 0x66acb3a5, - 0x6a21cbe0, - 0xc7f066ac, - 0xb3a76a24, - 0x8460a3a5, - 0x31801640, - 0x16418461, - 0x39813181, - 0x94500010, - 0x94b07810, - 0x782095a0, - 0x959094a0, - 0xb0d1a0f9, - 0xb258b005, - 0xc0307291, - 0xb1309910, - 0xc290b133, - 0x80b09440, - 0x465e2230, - 0x465e2200, - 0x9930c040, - 0xb910a910, - 0xa0f0a0f3, - 0x7100b111, - 0xc2f0b064, - 0xb1309930, - 0xb111b133, - 0x80b07100, - 0x465c2230, - 0x465c2200, - 0x623f66ac, - 0x625e66ac, - 0xc0408248, - 0xa9109930, - 0x3988b910, - 0x9a18d060, - 0xb11166d8, - 0xc2f07100, - 0xb0649930, - 0xb133b130, - 0x7100b111, - 0x220080b0, - 0x22304676, - 0x627d4676, - 0x39818241, - 0x9a11d070, - 0x1c1866d8, - 0x66ac4a86, - 0x9930c040, - 0xb910a910, - 0x66d8c080, - 0xb0647100, - 0x9440c190, - 0xb139b0f9, - 0xa0f0a0f3, - 0x06f08190, - 0x3110c012, - 0x6f201402, - 0x959094a0, - 0x6f201612, - 0x95a094b0, - 0x9930c5f0, - 0x31808460, - 0x31818461, - 0x00103981, - 0xa9109450, - 0xb111b910, - 0x7100b133, - 0x229080b0, - 0x22304568, - 0x622746a1, - 0x39808160, - 0x4eb81a30, - 0x22508000, - 0xb00546b5, - 0xb27062b7, - 0x7000a005, - 0x22128232, - 0x261246c0, - 0x92322a22, - 0x62c499c2, - 0x26222a12, - 0x99c29232, - 0x96a49693, - 0x9a30c030, - 0x8a548a43, - 0x82400662, - 0x1c020660, - 0xb05346cb, - 0x89907000, - 0x99900a60, - 0xc0907000, - 0x615366d8, - 0x89f09a00, - 0x46d92200, - 0x7000b9e0 -}; - -PATCH_FUN_SPEC void rf_patch_mce_ieee_802_15_4(void) -{ -#ifdef __PATCH_NO_UNROLLING - uint32_t i; - for (i = 0; i < 367; i++) { - HWREG(RFC_MCERAM_BASE + 4 * i) = patchIeee_802_15_4Mce[i]; - } -#else - const uint32_t *pS = patchIeee_802_15_4Mce; - volatile unsigned long *pD = &HWREG(RFC_MCERAM_BASE); - uint32_t t1, t2, t3, t4, t5, t6, t7, t8; - uint32_t nIterations = 45; - - do { - t1 = *pS++; - t2 = *pS++; - t3 = *pS++; - t4 = *pS++; - t5 = *pS++; - t6 = *pS++; - t7 = *pS++; - t8 = *pS++; - *pD++ = t1; - *pD++ = t2; - *pD++ = t3; - *pD++ = t4; - *pD++ = t5; - *pD++ = t6; - *pD++ = t7; - *pD++ = t8; - } while (--nIterations); - - t1 = *pS++; - t2 = *pS++; - t3 = *pS++; - t4 = *pS++; - t5 = *pS++; - t6 = *pS++; - t7 = *pS++; - *pD++ = t1; - *pD++ = t2; - *pD++ = t3; - *pD++ = t4; - *pD++ = t5; - *pD++ = t6; - *pD++ = t7; -#endif -} - -#endif diff --git a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_iqdump.h b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_iqdump.h new file mode 100644 index 000000000..12390d3b2 --- /dev/null +++ b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_iqdump.h @@ -0,0 +1,438 @@ +/****************************************************************************** +* Filename: rf_patch_mce_iqdump.h +* Revised: $Date: 2019-01-31 15:04:25 +0100 (to, 31 jan 2019) $ +* Revision: $Revision: 18842 $ +* +* Description: RF core patch for IQ-dump support in CC13x2 PG2.1 and CC26x2 PG2.1 +* +* Copyright (c) 2015-2019, Texas Instruments Incorporated +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* 1) Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* +* 2) Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* 3) Neither the name of the ORGANIZATION nor the names of its contributors may +* be used to endorse or promote products derived from this software without +* specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +******************************************************************************/ + +#ifndef _RF_PATCH_MCE_IQDUMP_H +#define _RF_PATCH_MCE_IQDUMP_H + +#include +#include "../inc/hw_types.h" + +#ifndef MCE_PATCH_TYPE +#define MCE_PATCH_TYPE static const uint32_t +#endif + +#ifndef PATCH_FUN_SPEC +#define PATCH_FUN_SPEC static inline +#endif + +#ifndef RFC_MCERAM_BASE +#define RFC_MCERAM_BASE 0x21008000 +#endif + +#ifndef MCE_PATCH_MODE +#define MCE_PATCH_MODE 0 +#endif + +MCE_PATCH_TYPE patchIqdumpMce[337] = { + 0x2fcf6030, + 0x00013f9d, + 0xff00003f, + 0x07ff0fff, + 0x0300f800, + 0x00068080, + 0x00170003, + 0x00003d1f, + 0x08000000, + 0x0000000f, + 0x00000387, + 0x00434074, + 0x00828000, + 0x06f00080, + 0x091e0000, + 0x00540510, + 0x00000007, + 0x00505014, + 0xc02f0000, + 0x017f0c30, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0000aa00, + 0x66957223, + 0xa4e5a35d, + 0x73057303, + 0x73047203, + 0x72047306, + 0x72917391, + 0xffc0b008, + 0xa0089010, + 0x720e720d, + 0x7210720f, + 0x7100b0d0, + 0xa0d0b110, + 0x8162721b, + 0x39521020, + 0x00200670, + 0x11011630, + 0x6c011401, + 0x60816080, + 0x610b60fd, + 0x60806080, + 0x60806080, + 0x60816080, + 0x61af60fd, + 0x60806080, + 0x60806080, + 0x60816080, + 0x611b60fd, + 0x60806080, + 0x60806080, + 0x60816080, + 0x61cb60fd, + 0x60806080, + 0x60806080, + 0x60816080, + 0x615360fd, + 0x72231210, + 0x73127311, + 0x81b17313, + 0x91b00010, + 0x6044b070, + 0xc0306076, + 0xc0c1669b, + 0xc4e0c2b2, + 0x6f131820, + 0x16116e23, + 0x68871612, + 0x99c07830, + 0x948078a0, + 0xc4f29490, + 0x1820c750, + 0x12034099, + 0x16126e23, + 0x78b06896, + 0x72639990, + 0x6076b63c, + 0x96408190, + 0x39808170, + 0x10012a70, + 0x84a21611, + 0xc0f384b4, + 0xc200c0f5, + 0x40c21c01, + 0x1c10c100, + 0x4cba40b8, + 0x18031013, + 0x1a131830, + 0x39121a10, + 0x60c268b5, + 0x60c213f3, + 0x101513f3, + 0x1850c100, + 0x1a101a15, + 0x68c03914, + 0x7100b0e8, + 0xa0e8b128, + 0xb910b230, + 0x99308990, + 0xb0d1b111, + 0xb0027100, + 0xb111b012, + 0x7291a0d1, + 0xb003b630, + 0x722cb013, + 0x7100b0e0, + 0x8170b120, + 0x710092c0, + 0x8170b120, + 0x44db22f0, + 0x1c0313f0, + 0x92c340e7, + 0x71009642, + 0x92c5b120, + 0x71009644, + 0xb0e0b120, + 0x7000a630, + 0xc030a0e1, + 0xc0409910, + 0xb1119930, + 0x7100b0d1, + 0xa0d1b111, + 0xa0037291, + 0xa230a002, + 0x73117000, + 0xc0407312, + 0xc100669b, + 0x649e91f0, + 0xb113b633, + 0x7100b0d3, + 0x64eea0d3, + 0xa0d26076, + 0xa0f3a0f0, + 0x73127311, + 0xc050660f, + 0xb0d2669b, + 0x7100c035, + 0xba389b75, + 0xb112b074, + 0xa0d26115, + 0xa0f3a0f0, + 0x73127311, + 0xc18b660f, + 0x91e0c000, + 0x1218120c, + 0x787d786a, + 0x10a9788e, + 0xb0d2b074, + 0xb112c020, + 0x692d7100, + 0x669bc060, + 0xb112c035, + 0x9b757100, + 0x65a48bf0, + 0x22018ca1, + 0x10804140, + 0x453f1ca8, + 0x16181208, + 0x8c00659b, + 0x8ca165a4, + 0x414b2201, + 0x1a191090, + 0x454b1e09, + 0x659b10a9, + 0x1e048184, + 0x14bc4133, + 0x4e7e1c4c, + 0xa0d26133, + 0xa0f3a0f0, + 0x73127311, + 0x721e660f, + 0x1205120c, + 0xb0d2b074, + 0xb112c020, + 0x695f7100, + 0x669bc070, + 0x89ce789d, + 0x7100b112, + 0x22008c90, + 0x8230416f, + 0x456f2210, + 0x9a3db231, + 0x31828ab2, + 0x8af03d82, + 0x3d803180, + 0x063e1802, + 0x41911e0e, + 0x41831e2e, + 0x418a1e3e, + 0x14261056, + 0x10653d16, + 0x10566192, + 0x18563126, + 0x3d261426, + 0x61921065, + 0x31361056, + 0x14261856, + 0x10653d36, + 0x10266192, + 0x91c63976, + 0x1e048184, + 0x161c4166, + 0x4e7e1c4c, + 0x10016166, + 0x91c1c0b0, + 0x10003911, + 0x10001000, + 0x7000699d, + 0x3d303130, + 0x4dab1cd0, + 0x49ad1ce0, + 0x10d07000, + 0x10e07000, + 0xc0807000, + 0xa0d2669b, + 0xa0f3a0f0, + 0x73127311, + 0xb130660f, + 0x7100b0f0, + 0x220080b0, + 0x61b945be, + 0xc090b231, + 0xb130669b, + 0xb0d2a0f0, + 0x7100c035, + 0xba389b75, + 0xb112b074, + 0xc0a061c5, + 0xa0d2669b, + 0xa0f3a0f0, + 0x73127311, + 0xc18b660f, + 0x91e0c000, + 0x1218120c, + 0x787d786a, + 0x10a9788e, + 0xb0f0b130, + 0x80b07100, + 0x45e32200, + 0xb07461de, + 0xc0b0b231, + 0xb130669b, + 0xb0d2a0f0, + 0xb112c020, + 0x69eb7100, + 0xb112c035, + 0x9b757100, + 0x65a48bf0, + 0x22018ca1, + 0x108041fc, + 0x45fb1ca8, + 0x16181208, + 0x8c00659b, + 0x8ca165a4, + 0x42072201, + 0x1a191090, + 0x46071e09, + 0x659b10a9, + 0x1e048184, + 0x14bc41ef, + 0x4e7e1c4c, + 0x824061ef, + 0x46172230, + 0x7100b0d5, + 0xa0d5b115, + 0xc0c0620f, + 0xb118669b, + 0xb016b006, + 0xb014b004, + 0xb012b002, + 0x78428440, + 0x81730420, + 0x2a733983, + 0xc1f294e3, + 0x31621832, + 0x31511021, + 0x00200012, + 0x10309440, + 0x39301610, + 0x42352210, + 0x31501220, + 0x31801003, + 0x93801630, + 0x12041202, + 0x42472273, + 0x997084a0, + 0x1a828982, + 0x997084c0, + 0x1a848984, + 0x22636249, + 0x84b04254, + 0x89809970, + 0x14021a80, + 0x997084d0, + 0x1a808980, + 0x62601404, + 0x785184b0, + 0x99700410, + 0x1a428982, + 0x785184d0, + 0x99700410, + 0x1a448984, + 0x31543152, + 0x06333963, + 0x38321613, + 0x31823834, + 0x31843982, + 0x97220042, + 0x959084a0, + 0x95a084b0, + 0x95b084c0, + 0x95c084d0, + 0x90307810, + 0x78209050, + 0x90609040, + 0xcd90b235, + 0x70009170, + 0xb112a235, + 0xa0d27100, + 0xba3cb112, + 0x8b5481b0, + 0x31843924, + 0x91b40004, + 0x669bc0d0, + 0x72917391, + 0x72066695, + 0x72047202, + 0x73067305, + 0x86306076, + 0x3151c801, + 0x96300410, + 0x9a007000, + 0x220089f0, + 0xb9e0469c, + 0x00007000 +}; + +PATCH_FUN_SPEC void rf_patch_mce_iqdump(void) +{ +#ifdef __PATCH_NO_UNROLLING + uint32_t i; + for (i = 0; i < 337; i++) { + HWREG(RFC_MCERAM_BASE + 4 * i) = patchIqdumpMce[i]; + } +#else + const uint32_t *pS = patchIqdumpMce; + volatile unsigned long *pD = &HWREG(RFC_MCERAM_BASE); + uint32_t t1, t2, t3, t4, t5, t6, t7, t8; + uint32_t nIterations = 42; + + do { + t1 = *pS++; + t2 = *pS++; + t3 = *pS++; + t4 = *pS++; + t5 = *pS++; + t6 = *pS++; + t7 = *pS++; + t8 = *pS++; + *pD++ = t1; + *pD++ = t2; + *pD++ = t3; + *pD++ = t4; + *pD++ = t5; + *pD++ = t6; + *pD++ = t7; + *pD++ = t8; + } while (--nIterations); + + t1 = *pS++; + *pD++ = t1; +#endif +} + +#endif diff --git a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_sl_longrange.h b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_sl_longrange.h deleted file mode 100644 index 02157e0a5..000000000 --- a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_sl_longrange.h +++ /dev/null @@ -1,335 +0,0 @@ -/****************************************************************************** -* Filename: rf_patch_mce_sl_longrange.h -* Revised: $Date: 2018-01-15 06:15:14 +0100 (ma, 15 jan 2018) $ -* Revision: $Revision: 18170 $ -* -* Description: RF core patch for SimpleLink Long Range support in CC13x2 and CC26x2 -* -* Copyright (c) 2015-2017, Texas Instruments Incorporated -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* -* 1) Redistributions of source code must retain the above copyright notice, -* this list of conditions and the following disclaimer. -* -* 2) Redistributions in binary form must reproduce the above copyright notice, -* this list of conditions and the following disclaimer in the documentation -* and/or other materials provided with the distribution. -* -* 3) Neither the name of the ORGANIZATION nor the names of its contributors may -* be used to endorse or promote products derived from this software without -* specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -******************************************************************************/ - -#ifndef _RF_PATCH_MCE_SL_LONGRANGE_H -#define _RF_PATCH_MCE_SL_LONGRANGE_H - -#include -#include "../inc/hw_types.h" - -#ifndef MCE_PATCH_TYPE -#define MCE_PATCH_TYPE static const uint32_t -#endif - -#ifndef PATCH_FUN_SPEC -#define PATCH_FUN_SPEC static inline -#endif - -#ifndef RFC_MCERAM_BASE -#define RFC_MCERAM_BASE 0x21008000 -#endif - -#ifndef MCE_PATCH_MODE -#define MCE_PATCH_MODE 0 -#endif - -MCE_PATCH_TYPE patchSimplelinkLrmMce[228] = { - 0x60466046, - 0x2fcf146f, - 0xdb3e0f9d, - 0x00007f7f, - 0x00020001, - 0x00000003, - 0x000c0003, - 0x00cc000f, - 0x003c00c3, - 0xcccc0033, - 0x33cccc33, - 0x0f003333, - 0x005f0f0f, - 0x005d0060, - 0x005b005e, - 0x0059005c, - 0x0003005a, - 0x001f0007, - 0x00000000, - 0x000f0400, - 0x03870000, - 0x40c00001, - 0x80000043, - 0x01000004, - 0x000006f0, - 0x0524091e, - 0x00050054, - 0x48200800, - 0x00000048, - 0x7f7f001f, - 0x8004004c, - 0x2e000000, - 0x00000000, - 0x00000000, - 0x10200000, - 0x65bb7223, - 0xa4e5a35d, - 0x73057303, - 0x73047203, - 0x72047306, - 0x72917391, - 0xffc0b008, - 0xa0089010, - 0x720e720d, - 0x7210720f, - 0x7100b0d0, - 0xa0d0b110, - 0x8162721b, - 0x39521020, - 0x00200670, - 0x11011630, - 0x6c011401, - 0x607e607d, - 0x60956095, - 0x607d607d, - 0x607d607d, - 0x60731220, - 0x72231210, - 0x73127311, - 0x73147313, - 0x001081b1, - 0xb07091b0, - 0x6072605a, - 0xc2b2c211, - 0x1820c4f0, - 0x6e236f13, - 0x16121611, - 0xc6326882, - 0x1820c9c0, - 0x1203408f, - 0x16126e23, - 0xb63c688c, - 0x91a0d000, - 0x9990c0c0, - 0xb1186072, - 0x409d8cb4, - 0xb0099334, - 0xb019b008, - 0x6594b018, - 0x94507860, - 0x81a7721e, - 0x39871076, - 0x99770677, - 0x16188988, - 0x9a17d030, - 0x64dc65c1, - 0x99c07850, - 0xb00764ef, - 0xb124b017, - 0xc205b0e4, - 0x657cc004, - 0x1c54658d, - 0x91c048ba, - 0x81811614, - 0x40b51e01, - 0x1c411671, - 0xa0e74cb5, - 0x798f797e, - 0x97af979e, - 0x658d1204, - 0x1c541614, - 0x91c040cd, - 0xa23560c7, - 0x65c1c040, - 0xa0e4a0e7, - 0x72027206, - 0x72037204, - 0x73057204, - 0x73917306, - 0x60727291, - 0x3181c061, - 0xcff3c002, - 0x16116e12, - 0x16116e12, - 0x6e13c7e0, - 0x6e121611, - 0x68e51611, - 0x6e12cff0, - 0x68eb1611, - 0xb0067000, - 0xb004b016, - 0xb002b014, - 0x7830b012, - 0x90509030, - 0x90407840, - 0xb2359060, - 0xc090b072, - 0xc60093f0, - 0x99303150, - 0x9910c060, - 0xb0f7b137, - 0xb10cb14c, - 0xb0d1b111, - 0x80b07100, - 0x45272270, - 0xa10cb073, - 0xb111a0f7, - 0xb127a0d1, - 0xba3eb0e7, - 0xb14c7100, - 0xb041b127, - 0xa044b061, - 0xa008a009, - 0xb1277100, - 0xb06db04d, - 0xb231b074, - 0xb1277100, - 0x80907000, - 0x41332210, - 0xa910b111, - 0x93308cb0, - 0x93f0c090, - 0xb008b009, - 0xb0e76104, - 0xa009a0f7, - 0xba39a008, - 0x93f0c0b0, - 0x31848af4, - 0x98d43d84, - 0x98e08990, - 0x6941c050, - 0xc40188f0, - 0x3d701410, - 0x31648334, - 0x18043d64, - 0x3520cff0, - 0x93340404, - 0x22c180c1, - 0xc060450e, - 0x80c17100, - 0x450e22c1, - 0x6952b127, - 0xb910b069, - 0xa0e7b127, - 0x12096104, - 0x6572120a, - 0x141a1409, - 0x416f1e17, - 0x14196572, - 0x1e37140a, - 0x6572416f, - 0x141a1409, - 0x14196572, - 0x3c89140a, - 0x70003c8a, - 0xb1277100, - 0xb1277100, - 0x318089a0, - 0x89b13980, - 0x70003981, - 0x109b655d, - 0x655d10ac, - 0x318d10bd, - 0x10cd14db, - 0x14dc318d, - 0x14a9318a, - 0x149c149b, - 0x97ac979b, - 0xa0e77000, - 0x7100b079, - 0xb0e7b124, - 0x700089d0, - 0x65c1c050, - 0xc0fcc19b, - 0xc07084a1, - 0x06321012, - 0x6f2314c2, - 0x41a22200, - 0x61a71034, - 0x00343183, - 0x6e746fb7, - 0x3921161b, - 0x84b1699a, - 0x1012c070, - 0x14c20632, - 0x22006f23, - 0x103441b3, - 0x318361b8, - 0x6fb70034, - 0x161b6e74, - 0x69ab3921, - 0x86307000, - 0x3151c801, - 0x96300410, - 0x9a007000, - 0x220089f0, - 0xb9e045c2, - 0x00007000 -}; - -PATCH_FUN_SPEC void rf_patch_mce_sl_longrange(void) -{ -#ifdef __PATCH_NO_UNROLLING - uint32_t i; - for (i = 0; i < 228; i++) { - HWREG(RFC_MCERAM_BASE + 4 * i) = patchSimplelinkLrmMce[i]; - } -#else - const uint32_t *pS = patchSimplelinkLrmMce; - volatile unsigned long *pD = &HWREG(RFC_MCERAM_BASE); - uint32_t t1, t2, t3, t4, t5, t6, t7, t8; - uint32_t nIterations = 28; - - do { - t1 = *pS++; - t2 = *pS++; - t3 = *pS++; - t4 = *pS++; - t5 = *pS++; - t6 = *pS++; - t7 = *pS++; - t8 = *pS++; - *pD++ = t1; - *pD++ = t2; - *pD++ = t3; - *pD++ = t4; - *pD++ = t5; - *pD++ = t6; - *pD++ = t7; - *pD++ = t8; - } while (--nIterations); - - t1 = *pS++; - t2 = *pS++; - t3 = *pS++; - t4 = *pS++; - *pD++ = t1; - *pD++ = t2; - *pD++ = t3; - *pD++ = t4; -#endif -} - -#endif diff --git a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_slr.h b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_slr.h deleted file mode 100644 index f114a7ab3..000000000 --- a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_slr.h +++ /dev/null @@ -1,365 +0,0 @@ -/****************************************************************************** -* Filename: rf_patch_mce_slr.h -* Revised: $Date: 2017-12-01 13:47:22 +0100 (fr, 01 des 2017) $ -* Revision: $Revision: 18103 $ -* -* Description: RF core patch for SimpleLink Long Range support in CC13x2 and CC26x2 -* -* Copyright (c) 2015-2017, Texas Instruments Incorporated -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* -* 1) Redistributions of source code must retain the above copyright notice, -* this list of conditions and the following disclaimer. -* -* 2) Redistributions in binary form must reproduce the above copyright notice, -* this list of conditions and the following disclaimer in the documentation -* and/or other materials provided with the distribution. -* -* 3) Neither the name of the ORGANIZATION nor the names of its contributors may -* be used to endorse or promote products derived from this software without -* specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -******************************************************************************/ - -#ifndef _RF_PATCH_MCE_SLR_H -#define _RF_PATCH_MCE_SLR_H - -#include -#include "../inc/hw_types.h" - -#ifndef MCE_PATCH_TYPE -#define MCE_PATCH_TYPE static const uint32_t -#endif - -#ifndef PATCH_FUN_SPEC -#define PATCH_FUN_SPEC static inline -#endif - -#ifndef RFC_MCERAM_BASE -#define RFC_MCERAM_BASE 0x21008000 -#endif - -#ifndef MCE_PATCH_MODE -#define MCE_PATCH_MODE 0 -#endif - -MCE_PATCH_TYPE patchSlrMce[254] = { - 0x60456045, - 0x2fcf146f, - 0xdb3e0f9d, - 0x3c337f7f, - 0xcccc333c, - 0x00003cc3, - 0x00020001, - 0x00000003, - 0x000c0003, - 0x00cc000f, - 0x003c00c3, - 0xcccc0033, - 0x33cccc33, - 0x0f003333, - 0x00000f0f, - 0x00070003, - 0x0000001f, - 0x04000000, - 0x0000000f, - 0x00010387, - 0x004348c0, - 0x00048000, - 0x06f00080, - 0x091e0000, - 0x04500524, - 0x08000005, - 0x00484820, - 0x001f0000, - 0x004c7f7f, - 0x00009000, - 0x00007f7f, - 0x00000000, - 0x00000000, - 0x00000000, - 0x72230000, - 0x73037263, - 0x72037305, - 0x73067304, - 0x73917204, - 0xc7c07291, - 0x00018001, - 0x90109001, - 0x90010801, - 0x720e720d, - 0x7210720f, - 0x7100b0d0, - 0xa0d0b110, - 0x8162721b, - 0x39521020, - 0x00200670, - 0x11011630, - 0x6c011401, - 0x6077606c, - 0x610b608b, - 0x72231210, - 0x73127311, - 0x73147313, - 0x001081b1, - 0xb07091b0, - 0xc1e1605a, - 0xc4e0c2b2, - 0x6f131820, - 0x16116e23, - 0x687b1612, - 0xc9c0c632, - 0x40881820, - 0x6e231203, - 0x68851612, - 0x91a0d000, - 0x7311606c, - 0xc0007312, - 0xc00991f0, - 0x398081a0, - 0x16100670, - 0x449a1e10, - 0xc008c0b7, - 0x60a9c01e, - 0x44a01e20, - 0xc018c0f7, - 0x60a9c03e, - 0x44a61e40, - 0xc038c137, - 0x60a9c07e, - 0xc078c177, - 0xc030c0fe, - 0xb0e865f6, - 0xb1287100, - 0xb230a0e8, - 0xb003b630, - 0xb002b013, - 0x8176b012, - 0x06f63946, - 0xb0e01616, - 0xc13cc004, - 0x92c0c070, - 0xc0707821, - 0x06321012, - 0x6f2314c2, - 0x71009643, - 0x3921b120, - 0x161468c0, - 0x44be1c64, - 0x0bf17821, - 0x1012c070, - 0x14c20632, - 0x96436f23, - 0xb1207100, - 0x68cf3921, - 0xc6d5c4f4, - 0x81dfc066, - 0x821064f4, - 0x40e12210, - 0xc07060db, - 0xc00f1a10, - 0x68e364f4, - 0xc030a0e1, - 0x99309910, - 0xb0d1b111, - 0xb1117100, - 0x7291a0d1, - 0xa002a003, - 0x606c7223, - 0x316f061f, - 0x109100f9, - 0x99710441, - 0x061a898a, - 0x04511091, - 0x898b9971, - 0x311b061b, - 0x391914ba, - 0x6fa3147a, - 0x92ce9643, - 0xb1207100, - 0xb1187000, - 0x410f8cb4, - 0xc1f09334, - 0x78609440, - 0x721e9450, - 0x107681a7, - 0x06773987, - 0x89889977, - 0xd0401618, - 0x65f69a17, - 0x95907870, - 0x95a07880, - 0x95b07890, - 0x95c078a0, - 0x78506557, - 0x656a99c0, - 0xb007b017, - 0xb0e4b124, - 0xc004c205, - 0x65ef65de, - 0x49351c54, - 0x161491c0, - 0x1e018181, - 0x16714130, - 0x4d301c41, - 0x79bea0e7, - 0x979e79cf, - 0x120497af, - 0x161465ef, - 0x41481c54, - 0x614291c0, - 0xc050a235, - 0xa0e765f6, - 0x7206a0e4, - 0x72047202, - 0x72047203, - 0x73067305, - 0x72917391, - 0xc061606c, - 0xc0023181, - 0x6e12cff3, - 0x6e121611, - 0xc7e01611, - 0x16116e13, - 0x16116e12, - 0xcff06960, - 0x16116e12, - 0x70006966, - 0xb016b006, - 0xb014b004, - 0xb012b002, - 0x90307830, - 0x78409050, - 0x90609040, - 0xb072b235, - 0x93f0c090, - 0xb0f7b137, - 0xb0f6b136, - 0xb0737100, - 0xa0f7b127, - 0x80b0a0f7, - 0x459f2270, - 0xa0f7a0f6, - 0xba3eb0e7, - 0xb1367100, - 0xb041b127, - 0xc0f0b061, - 0xba3f93f0, - 0x31148b14, - 0xa0449704, - 0xb1277100, - 0xb06db04d, - 0xb231b074, - 0xb1277100, - 0xb0e77000, - 0x8af4ba39, - 0x3d843184, - 0xc05098d4, - 0xc05098e0, - 0x88f069a8, - 0x1410c201, - 0x83343d60, - 0x3d643164, - 0xcff01804, - 0x04043520, - 0xc0b09334, - 0xb06993f0, - 0x9a14d060, - 0x710065f6, - 0xa0e7b127, - 0x1209617a, - 0x65d4120a, - 0x141a1409, - 0x41d11e17, - 0x141965d4, - 0x1e37140a, - 0x65d441d1, - 0x141a1409, - 0x141965d4, - 0x3c89140a, - 0x70003c8a, - 0xb1277100, - 0xb1277100, - 0x318089a0, - 0x89b13980, - 0x70003981, - 0x109b65bf, - 0x65bf10ac, - 0x318d10bd, - 0x10cd14db, - 0x14dc318d, - 0x14a9318a, - 0x149c149b, - 0x97ac979b, - 0xa0e77000, - 0x7100b079, - 0xb0e7b124, - 0x700089d0, - 0x89f09a00, - 0x45f72200, - 0x7000b9e0 -}; - -PATCH_FUN_SPEC void rf_patch_mce_slr(void) -{ -#ifdef __PATCH_NO_UNROLLING - uint32_t i; - for (i = 0; i < 254; i++) { - HWREG(RFC_MCERAM_BASE + 4 * i) = patchSlrMce[i]; - } -#else - const uint32_t *pS = patchSlrMce; - volatile unsigned long *pD = &HWREG(RFC_MCERAM_BASE); - uint32_t t1, t2, t3, t4, t5, t6, t7, t8; - uint32_t nIterations = 31; - - do { - t1 = *pS++; - t2 = *pS++; - t3 = *pS++; - t4 = *pS++; - t5 = *pS++; - t6 = *pS++; - t7 = *pS++; - t8 = *pS++; - *pD++ = t1; - *pD++ = t2; - *pD++ = t3; - *pD++ = t4; - *pD++ = t5; - *pD++ = t6; - *pD++ = t7; - *pD++ = t8; - } while (--nIterations); - - t1 = *pS++; - t2 = *pS++; - t3 = *pS++; - t4 = *pS++; - t5 = *pS++; - t6 = *pS++; - *pD++ = t1; - *pD++ = t2; - *pD++ = t3; - *pD++ = t4; - *pD++ = t5; - *pD++ = t6; -#endif -} - -#endif diff --git a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_tof.h b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_tof.h new file mode 100644 index 000000000..eeabf348d --- /dev/null +++ b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_mce_tof.h @@ -0,0 +1,609 @@ +/****************************************************************************** +* Filename: rf_patch_mce_tof.h +* Revised: $Date: 2019-01-31 15:04:59 +0100 (to, 31 jan 2019) $ +* Revision: $Revision: 18843 $ +* +* Description: RF core MCE patch for time of flight 2Mbps PHY for CC13x2 and CC26x2 +* +* Copyright (c) 2015-2019, Texas Instruments Incorporated +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* 1) Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* +* 2) Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* 3) Neither the name of the ORGANIZATION nor the names of its contributors may +* be used to endorse or promote products derived from this software without +* specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +******************************************************************************/ + +#ifndef _RF_PATCH_MCE_TOF_H +#define _RF_PATCH_MCE_TOF_H + +#include +#include "../inc/hw_types.h" + +#ifndef MCE_PATCH_TYPE +#define MCE_PATCH_TYPE static const uint32_t +#endif + +#ifndef PATCH_FUN_SPEC +#define PATCH_FUN_SPEC static inline +#endif + +#ifndef RFC_MCERAM_BASE +#define RFC_MCERAM_BASE 0x21008000 +#endif + +#ifndef MCE_PATCH_MODE +#define MCE_PATCH_MODE 0 +#endif + +MCE_PATCH_TYPE patchTofMce[506] = { + 0x0003605b, + 0x00f1000f, + 0x00000000, + 0x000c8000, + 0x00000000, + 0x0c650000, + 0x80000000, + 0x00800010, + 0x00000000, + 0x0594091e, + 0x00000350, + 0x7c200000, + 0x000000c2, + 0x34340013, + 0x0003005a, + 0x00000032, + 0xfe6b2840, + 0xdeade8ca, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x07d00011, + 0x6fdd2fea, + 0x0fb00ff0, + 0xf80f0003, + 0x007f7f30, + 0x3434001f, + 0x8010005a, + 0x01900000, + 0x40000800, + 0xc0300c65, + 0x722367ee, + 0xa35d7263, + 0x73057303, + 0x73047203, + 0x72047306, + 0x72917391, + 0x8001c7c0, + 0x90010001, + 0x08019010, + 0x720d9001, + 0x720f720e, + 0xb0d07210, + 0xc0407100, + 0xa0d067ee, + 0x721bb110, + 0x10208162, + 0x06703952, + 0x16300020, + 0x14011101, + 0x60936c01, + 0x60c260a4, + 0x6219617b, + 0x60936093, + 0x60936093, + 0x60c260a4, + 0x6219617b, + 0x60936093, + 0x60976093, + 0x12206095, + 0xc050609a, + 0x121267ee, + 0x73117223, + 0x73137312, + 0x81b17314, + 0x91b20012, + 0x6073b070, + 0xc2b2c011, + 0x1820c710, + 0x6e236f13, + 0x16121611, + 0x7d7068a8, + 0xc0229990, + 0x39818161, + 0xd0601812, + 0x67ee9a12, + 0x40971e01, + 0x99907d80, + 0x93807d50, + 0x93307d60, + 0x93007d90, + 0x6097b360, + 0xc07067e5, + 0x677e67ee, + 0x91f0c070, + 0x670bb750, + 0xb233b914, + 0xa750672d, + 0x95b488d4, + 0x95c488e4, + 0x95948ca4, + 0x95a487c4, + 0x2a007cb0, + 0x88d49060, + 0x88e495d4, + 0xc0f495e4, + 0x91449134, + 0x22008c80, + 0xb0f040e5, + 0xb0f6b130, + 0xb0d5b0d0, + 0xb110b136, + 0xb140b100, + 0x73137314, + 0x2a007cb0, + 0xc0f19060, + 0x40f51e0e, + 0x99311611, + 0xc037b912, + 0xb115b041, + 0xa910c031, + 0xb0737100, + 0xba3eb910, + 0x22008090, + 0x80b24574, + 0x45182262, + 0x220280c2, + 0xb061410b, + 0x2250b140, + 0x824040f9, + 0x45152200, + 0x40f9220f, + 0x679e100f, + 0x100f60f9, + 0x60f967b4, + 0xb234a913, + 0x93acba39, + 0xa0d58462, + 0xb0d1720f, + 0x7100b111, + 0xb1119937, + 0xb35d7100, + 0x9930c3f0, + 0xc0d0b074, + 0x894193f0, + 0x67bf9791, + 0x14018941, + 0x7100b111, + 0xba3aba3b, + 0xc210b078, + 0xa2329930, + 0xb111b235, + 0xa35d7100, + 0x7291b06e, + 0x8af2a0d1, + 0x3d823182, + 0x67eec080, + 0x8c528c33, + 0x8c441423, + 0x14248c62, + 0x06f28b32, + 0x31418b21, + 0x97a20012, + 0x0424cff2, + 0x31433143, + 0x97b40034, + 0x6957c8f0, + 0xb130b235, + 0xb136a0f0, + 0xb140a0f6, + 0xb914a100, + 0xa7507291, + 0xa002a003, + 0x9010c7c0, + 0x72047203, + 0x73067305, + 0xa23267e5, + 0x8242b235, + 0x456b1e02, + 0xc0907223, + 0x609767ee, + 0xa232b235, + 0xd0a08942, + 0x67ee9a12, + 0x67e56159, + 0x677ec00f, + 0x91f0c070, + 0xc0b0670b, + 0xb01367ee, + 0x22008c80, + 0xb0f04189, + 0xb0f6b130, + 0xb0d5b0d0, + 0xb136b111, + 0x72917313, + 0xc0e1b912, + 0x41951e0e, + 0x99311611, + 0xb041c037, + 0xc031b232, + 0xb115a910, + 0xb0737100, + 0xba3eb910, + 0x22008090, + 0x80b24614, + 0x45b32262, + 0x41992250, + 0x22008240, + 0x220f45b0, + 0x100f4199, + 0x6199679e, + 0x67b4100f, + 0xb9136199, + 0xba39b234, + 0xa0d593ac, + 0x7313720f, + 0x73147210, + 0x264081b0, + 0xb0d191b0, + 0x7100b111, + 0x9937b041, + 0x7100b111, + 0xc3f0b35d, + 0xb0749930, + 0x93f0c0d0, + 0x7100b111, + 0xc210b078, + 0xa2329930, + 0x7100b111, + 0xb06ea35d, + 0xa0d1a910, + 0x899167bf, + 0x81a01401, + 0x99311401, + 0xb0d6b116, + 0xb1167100, + 0x8090a0d6, + 0x46142200, + 0x88d4b012, + 0x88e495b4, + 0x8ca495c4, + 0x87c49594, + 0x729195a4, + 0x2a208230, + 0x92302630, + 0xc070672d, + 0x8af287b1, + 0x3d823182, + 0x69fbc310, + 0xb111b064, + 0xa0f6b136, + 0xa0f0b130, + 0x8242b235, + 0x46021e02, + 0x7291b914, + 0xa002a003, + 0x9010c7c0, + 0x72047203, + 0x73067305, + 0x67eec0c0, + 0x609767e5, + 0x67eec0d0, + 0x7291b235, + 0x677e6202, + 0xc070c00b, + 0x670b91f0, + 0x67eec0e0, + 0x727ab914, + 0xb0137226, + 0x73147313, + 0x8c8072c9, + 0x422d2200, + 0xb130b0f0, + 0x85b06231, + 0x95d085c1, + 0xb10095e1, + 0xb110b140, + 0xb0f6b064, + 0xb0d5b0d0, + 0x7313b136, + 0xb041b061, + 0x42411e1b, + 0xb9127291, + 0xc13772c9, + 0x1e0ec070, + 0x16104247, + 0x9930c0b7, + 0xb115b232, + 0xa910c031, + 0xb0737100, + 0xba3eb910, + 0x22008090, + 0x80b24705, + 0x46682262, + 0x220280c2, + 0xb061425b, + 0x2250b140, + 0x82404249, + 0x46652200, + 0x4249220f, + 0x679e100f, + 0x100f6249, + 0x624967b4, + 0x1e1bb234, + 0xa9154285, + 0xb913b916, + 0x8b33ba3b, + 0x8b2406f3, + 0x00433144, + 0x8c3397a3, + 0x14038c50, + 0x8c448c60, + 0x31431404, + 0x00343143, + 0x81b097b4, + 0x91b02650, + 0x67eec0f0, + 0xa91362bf, + 0x264081b0, + 0x993791b0, + 0x93acba39, + 0x720fa0d5, + 0xb111b0d1, + 0x7100b111, + 0xc3e0b35d, + 0xb0749930, + 0x93f0c0d0, + 0x97918941, + 0xb11167bf, + 0xb0787100, + 0x9930c210, + 0xb235a232, + 0x7100b111, + 0xb06ea35d, + 0xa0d17291, + 0x31828af2, + 0xba3b3d82, + 0x06f38b33, + 0x31448b24, + 0x92630043, + 0x8c508c33, + 0x8c601403, + 0x14048c44, + 0x31433143, + 0x97b40034, + 0x6abdc8f0, + 0xbc9062e3, + 0x95b488d4, + 0x95c488e4, + 0x95948ca4, + 0x95a487c4, + 0x85b0c01b, + 0x95d085c1, + 0x731195e1, + 0x73137312, + 0xb1007314, + 0xb0f6b140, + 0xb110b136, + 0xa232b064, + 0x22628242, + 0x722342d7, + 0xb115b064, + 0xc410b232, + 0x679e6ae0, + 0xb2356249, + 0xa100b140, + 0xa0f6b136, + 0x7291b914, + 0xa003a750, + 0xc7c0a002, + 0x72039010, + 0x73057204, + 0x73117306, + 0x73137312, + 0x720f7314, + 0x7210720d, + 0x7223720e, + 0xb235a232, + 0x1e028242, + 0x722346fc, + 0x67eec100, + 0xc1106097, + 0xb23567ee, + 0x8942a232, + 0x824262e4, + 0x430b2212, + 0xb016b006, + 0xb002b012, + 0xb014b004, + 0x90307ca0, + 0x7cb09050, + 0x90609040, + 0x73127311, + 0x73147313, + 0x720e720d, + 0x7210720f, + 0xb0e1b121, + 0xb0727100, + 0xd680a0e1, + 0x679e6b28, + 0x93f0c090, + 0xbc907000, + 0x9930c040, + 0xb910b911, + 0xb111b0d1, + 0x72917100, + 0xb111a0d1, + 0x9635722c, + 0xc0f38c82, + 0xb013b003, + 0x92c08170, + 0x96408190, + 0xb120b0e0, + 0x22027100, + 0x85b04750, + 0x92c39640, + 0x7100b120, + 0x964085c0, + 0x7100b120, + 0x96408590, + 0xb12092c3, + 0x85a07100, + 0xb1209640, + 0x8cb07100, + 0x0410cff1, + 0xb1209640, + 0x96367100, + 0x9930c040, + 0xb910b911, + 0xb111b0d1, + 0xb120a0e0, + 0x72917100, + 0xb111a0d1, + 0x1e108750, + 0xb2354371, + 0xa9156378, + 0xb913b916, + 0x2a308230, + 0x92302620, + 0x6b79c090, + 0xc120ac90, + 0x700067ee, + 0x721b7223, + 0x92c0c0f0, + 0xc1f1722f, + 0xc01592d1, + 0x7c977c86, + 0x8c807ccc, + 0x43912200, + 0x94407cf0, + 0x94607d10, + 0x7d206393, + 0xac909440, + 0xc1009636, + 0x816e91e0, + 0xc01d398e, + 0x439d1e0e, + 0x7000c03d, + 0x726a7269, + 0xb0537ce2, + 0xc76093a2, + 0x73a36ba4, + 0x96908a40, + 0x96a18a51, + 0x7cd093a6, + 0x8a4393a0, + 0x31338a54, + 0x31343d33, + 0x70003d34, + 0x8a439a31, + 0x31338a54, + 0x31343d63, + 0x96933d64, + 0xb05396a4, + 0x1e0e7000, + 0x8c3143d6, + 0x18108c40, + 0xc0024fd0, + 0x161110d1, + 0x16201812, + 0x1c203d20, + 0x10204fe4, + 0x63e41610, + 0x3d201620, + 0x4be41cd0, + 0x63e410d0, + 0xc082c000, + 0x8c448c33, + 0x1c241834, + 0x14424fe0, + 0x63e44be2, + 0x63e410d0, + 0x18d0c000, + 0x720d7000, + 0x720f720e, + 0x73117210, + 0x73137312, + 0x70007314, + 0x89f09a00, + 0x47ef2200, + 0x7000b9e0 +}; + +PATCH_FUN_SPEC void rf_patch_mce_tof(void) +{ +#ifdef __PATCH_NO_UNROLLING + uint32_t i; + for (i = 0; i < 506; i++) { + HWREG(RFC_MCERAM_BASE + 4 * i) = patchTofMce[i]; + } +#else + const uint32_t *pS = patchTofMce; + volatile unsigned long *pD = &HWREG(RFC_MCERAM_BASE); + uint32_t t1, t2, t3, t4, t5, t6, t7, t8; + uint32_t nIterations = 63; + + do { + t1 = *pS++; + t2 = *pS++; + t3 = *pS++; + t4 = *pS++; + t5 = *pS++; + t6 = *pS++; + t7 = *pS++; + t8 = *pS++; + *pD++ = t1; + *pD++ = t2; + *pD++ = t3; + *pD++ = t4; + *pD++ = t5; + *pD++ = t6; + *pD++ = t7; + *pD++ = t8; + } while (--nIterations); + + t1 = *pS++; + t2 = *pS++; + *pD++ = t1; + *pD++ = t2; +#endif +} + +#endif diff --git a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_rfe_bt5.h b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_rfe_bt5.h deleted file mode 100644 index ea3f7696c..000000000 --- a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_rfe_bt5.h +++ /dev/null @@ -1,610 +0,0 @@ -/****************************************************************************** -* Filename: rf_patch_rfe_bt5.h -* Revised: $Date: 2018-02-07 13:42:20 +0100 (on, 07 feb 2018) $ -* Revision: $Revision: 18248 $ -* -* Description: RF core patch for Bluetooth 5 support in CC13x2 and CC26x2 -* -* Copyright (c) 2015-2017, Texas Instruments Incorporated -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* -* 1) Redistributions of source code must retain the above copyright notice, -* this list of conditions and the following disclaimer. -* -* 2) Redistributions in binary form must reproduce the above copyright notice, -* this list of conditions and the following disclaimer in the documentation -* and/or other materials provided with the distribution. -* -* 3) Neither the name of the ORGANIZATION nor the names of its contributors may -* be used to endorse or promote products derived from this software without -* specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -******************************************************************************/ - -#ifndef _RF_PATCH_RFE_BT5_H -#define _RF_PATCH_RFE_BT5_H - -#include -#include "../inc/hw_types.h" - -#ifndef RFE_PATCH_TYPE -#define RFE_PATCH_TYPE static const uint32_t -#endif - -#ifndef PATCH_FUN_SPEC -#define PATCH_FUN_SPEC static inline -#endif - -#ifndef RFC_RFERAM_BASE -#define RFC_RFERAM_BASE 0x2100C000 -#endif - -#ifndef RFE_PATCH_MODE -#define RFE_PATCH_MODE 0 -#endif - -RFE_PATCH_TYPE patchBt5Rfe[512] = { - 0x35f8615b, - 0xa24675f9, - 0x1f40a357, - 0x34f11307, - 0x40004030, - 0x40034001, - 0x400f4007, - 0x40cf404f, - 0x43cf41cf, - 0x4fcf47cf, - 0x2fcf3fcf, - 0x0fcf1fcf, - 0x40004030, - 0x40034001, - 0x400f4007, - 0x40cf404f, - 0x6fcf7fcf, - 0x4fcf5fcf, - 0x2fcf3fcf, - 0x0fcf1fcf, - 0x9100c050, - 0xc0707000, - 0x70009100, - 0x00213182, - 0xb1109131, - 0x81017000, - 0xa100b101, - 0x91323182, - 0x9101b110, - 0x81411011, - 0x403b2241, - 0x700006f1, - 0x9150c050, - 0xc0707000, - 0x70009150, - 0x00213182, - 0xb1609181, - 0x10257000, - 0x9100c050, - 0xc080c3f4, - 0x6f031420, - 0x04411031, - 0x22f082a0, - 0x26514058, - 0x3182c022, - 0x91310021, - 0x3963b110, - 0x04411031, - 0x3182c082, - 0x91310021, - 0x3963b110, - 0xc0a21031, - 0x00213182, - 0xb1109131, - 0x31151050, - 0x92551405, - 0x642b7000, - 0x1031c2b2, - 0x31610631, - 0x642e02c1, - 0x1031c112, - 0x06713921, - 0x02e13151, - 0x7000642e, - 0x82b16428, - 0x39813181, - 0x642ec0e2, - 0xc111642b, - 0x642ec122, - 0x688bc470, - 0xc0c2c111, - 0x64a4642e, - 0x700064b7, - 0x82b16440, - 0x39813181, - 0x6446c182, - 0xc1116443, - 0x6446c0a2, - 0x689dc470, - 0xc162c331, - 0x64a46446, - 0x700064b7, - 0xb054b050, - 0x80407100, - 0x44b12240, - 0x40a42200, - 0x8081b060, - 0x44a41e11, - 0xa0547000, - 0x80f0b064, - 0x40a42200, - 0x12407000, - 0xb03290b0, - 0x395382a3, - 0x64713953, - 0x68bfc2f0, - 0xc1f18080, - 0xc1510410, - 0x40cb1c10, - 0xc221642b, - 0x642ec0c2, - 0x644360cf, - 0xc162c441, - 0x80906446, - 0x44d33950, - 0x68d3ce00, - 0x90b01280, - 0x7000b032, - 0xc201642b, - 0x642ec0c2, - 0x318080a0, - 0x68df3940, - 0xc0c2c101, - 0xc101642e, - 0x642ec122, - 0x647182a3, - 0x90b012c0, - 0x7000b032, - 0xc4016443, - 0x6446c162, - 0x318080a0, - 0x68f33940, - 0xc162c301, - 0xc1016446, - 0x6446c0a2, - 0x647182a3, - 0x90b012c0, - 0x7000b032, - 0xc272642b, - 0x642ec081, - 0xc111c122, - 0xc002642e, - 0x642ec111, - 0xc331c062, - 0xc362642e, - 0x642ec111, - 0xc111c302, - 0x82a3642e, - 0x64713953, - 0x6433c3e2, - 0x41162211, - 0xc881c242, - 0xc252642e, - 0x642ec111, - 0xcee1c272, - 0xc202642e, - 0x642ec881, - 0xc801c202, - 0xc170642e, - 0x7000692a, - 0xc242642b, - 0x642ec801, - 0xc011c252, - 0xc272642e, - 0x642ec0e1, - 0xc101c002, - 0xc062642e, - 0x642ec301, - 0xc101c122, - 0xc362642e, - 0x642ec101, - 0xc101c302, - 0x82a3642e, - 0x70006471, - 0x1e118081, - 0xb0504156, - 0x7100b054, - 0x22408040, - 0xa0544157, - 0x80f1b064, - 0x454b2201, - 0x22007000, - 0xb060414b, - 0x73066148, - 0x720b7205, - 0xb050720e, - 0x80817100, - 0xa050b060, - 0xeed08092, - 0x93529341, - 0x224167fa, - 0x8080457f, - 0x0410c1f1, - 0x11011630, - 0x6c011401, - 0x61a061a0, - 0x61a061a0, - 0x61a061a0, - 0x61a761a3, - 0x61b161ad, - 0x62d361a0, - 0xc0f062d6, - 0x31320402, - 0x14122a41, - 0x11011632, - 0x6c011421, - 0x61a161bf, - 0x61a561bf, - 0x61a961af, - 0x61a061a0, - 0x61b362f4, - 0x61a562f4, - 0x61a961b5, - 0x61a061a0, - 0x61a161c5, - 0x61a561c5, - 0x61a961af, - 0x61a061a0, - 0x65d661b8, - 0x648061b8, - 0x648061b8, - 0x64d86548, - 0x649261b8, - 0x64ec6548, - 0x650061b8, - 0x650061b8, - 0x652c65d6, - 0x66fe61b8, - 0x650061b8, - 0x61b166fe, - 0x61bbb0b0, - 0x7306b0b1, - 0xb0307205, - 0x7810615f, - 0x7832c451, - 0xc5247853, - 0x782061ca, - 0x7842c451, - 0xc4c47853, - 0x926091a4, - 0x92829271, - 0xc0159293, - 0xc3f09245, - 0xc0f092b0, - 0x61b890a0, - 0x66cfb0e3, - 0x80f0a054, - 0x45e02250, - 0x22008040, - 0x61d846c3, - 0xc800a0e3, - 0x81a991b0, - 0x8091b050, - 0x469e2241, - 0x12f18262, - 0x102f0412, - 0x142f311f, - 0x22d68266, - 0xc08045f3, - 0xc18061f4, - 0x6f0d1420, - 0x10de396d, - 0x044ec3f4, - 0x3182c082, - 0x396d002e, - 0x3182c0a2, - 0x826a002d, - 0x06fa398a, - 0x31808270, - 0xc00b3980, - 0x10bc180b, - 0x825318ac, - 0x149b1439, - 0x06f08260, - 0x31101001, - 0x81a11410, - 0x140c1410, - 0x39408280, - 0x100206f0, - 0x3001c011, - 0x1801c010, - 0x31821802, - 0x26c10021, - 0xcec091e1, - 0x22c667fa, - 0xb003465a, - 0xb063b013, - 0x8041b053, - 0x46c32201, - 0x92148204, - 0x1cb58225, - 0x18954e39, - 0x80f091b5, - 0x422b2210, - 0x913d629c, - 0x913eb110, - 0x80e0b110, - 0x46432200, - 0x424322e6, - 0x1895b0e0, - 0x925f91b5, - 0x14f981a9, - 0x225080f0, - 0x221041d6, - 0x62d9469c, - 0x81a966cf, - 0x14598255, - 0x7100c0f0, - 0x6a53b063, - 0x422b22c6, - 0x6272a0e0, - 0x39808280, - 0x100206f0, - 0x3001c011, - 0x1801c010, - 0x31821802, - 0x26c10021, - 0x828791d1, - 0x39873947, - 0xb013b003, - 0xb053b063, - 0xb0637100, - 0xb012b002, - 0x22018041, - 0x81f446c3, - 0x82259214, - 0x4e801cb5, - 0x91b51895, - 0x221080f0, - 0x629c4272, - 0x92148204, - 0x18458224, - 0x4e8a1c75, - 0x221080f0, - 0x629c4272, - 0xb110913d, - 0x220080e0, - 0x22e64692, - 0xb0e04292, - 0x925f91b5, - 0x14f981a9, - 0x225080f0, - 0x221041d6, - 0x62d9469c, - 0x67faceb0, - 0x8280b063, - 0x100206f0, - 0x3001c011, - 0x1801c010, - 0x31821802, - 0x26c10021, - 0xb01391e1, - 0xb063b003, - 0xb064b053, - 0x7100b054, - 0x22018041, - 0xb06346c3, - 0x80f0b064, - 0x41d62250, - 0x46b12240, - 0x92118201, - 0x18918221, - 0xb03191b1, - 0xa0e362b1, - 0x8251a0e0, - 0x318281b2, - 0xeea03d82, - 0x93529341, - 0xa00367fa, - 0x82627000, - 0x06f23942, - 0x80a2604b, - 0x61b8644b, - 0x7100b050, - 0x829061b8, - 0x22018041, - 0x820446c3, - 0x82259214, - 0x91b51895, - 0x221180f1, - 0x6ada469c, - 0x22018041, - 0x820446c3, - 0x82259214, - 0x4a4e1cc5, - 0x91b51895, - 0x221080f0, - 0x629c42e6, - 0x91e07860, - 0x9250c2d0, - 0x7870c4c4, - 0xc132c2e1, - 0x61cacb03, - 0xb0e3a0e2, - 0x80f0a054, - 0x47082250, - 0x22008040, - 0x630047ef, - 0xa040a0e3, - 0x8260827d, - 0x0410c0f1, - 0x826a1009, - 0x041a394a, - 0x39808260, - 0x100e0410, - 0x10bc10ab, - 0x644b10c2, - 0x67face90, - 0xb003b013, - 0xb05367a1, - 0xb054b050, - 0xb013b064, - 0x678a6781, - 0x80417100, - 0x47ef2201, - 0x221080f0, - 0x22f04736, - 0xb06447dc, - 0x43262231, - 0x67a7b063, - 0x6326675a, - 0x81bfb064, - 0x3d8f318f, - 0x934fde80, - 0x710067fa, - 0x22018041, - 0xb06447ef, - 0x225080f0, - 0xb063434f, - 0x22c18261, - 0x67a7474a, - 0x22d18261, - 0x675a473d, - 0x81b1633d, - 0x318181c2, - 0x31823d81, - 0xee703d82, - 0x93529341, - 0x62fe67fa, - 0x92108200, - 0x18d38223, - 0x0bf34f67, - 0x1ce31613, - 0x92134b80, - 0x143b8233, - 0x1ce3636c, - 0x92134b80, - 0x183b8233, - 0x4f7c1cab, - 0x4b7e1c9b, - 0x43801cbc, - 0x826010b2, - 0x437922d0, - 0x221080f0, - 0x644b4780, - 0x63806781, - 0x637010ab, - 0x6370109b, - 0x82807000, - 0x0410c0f1, - 0x7100b063, - 0x10bc6b84, - 0x7000b0e0, - 0x92128202, - 0x82518222, - 0x81a11812, - 0x82911812, - 0x3d813181, - 0x4b981c12, - 0xb032b0e2, - 0x1421c7f1, - 0xc8124f9c, - 0x91c291b2, - 0xb0e1b031, - 0x12087000, - 0xc800c006, - 0x91c091b0, - 0x82517000, - 0x92108200, - 0x18108220, - 0x181081a1, - 0x80e11406, - 0x31828292, - 0x1c203d82, - 0xb0e24bbb, - 0x47bf2221, - 0xce60b032, - 0x222167fa, - 0xa0e243bf, - 0x8281b032, - 0xc0f03941, - 0x1e010401, - 0x161843cd, - 0x3010c010, - 0x47db1c08, - 0x3c101060, - 0xc7f11006, - 0x4fd11461, - 0x91b6c816, - 0x318181c1, - 0x1c163d81, - 0x91c64bd8, - 0xc006b031, - 0x70001208, - 0xb063a003, - 0xb0efb064, - 0x7100652c, - 0x22008040, - 0xb06447ef, - 0xa0ef6500, - 0x80407100, - 0x47ef2200, - 0xb003b064, - 0xa0e36326, - 0x81b28251, - 0x3d823182, - 0x9341ee50, - 0x67fa9352, - 0x7000a003, - 0x83209330, - 0x47fb2200, - 0x7000b310 -}; - -PATCH_FUN_SPEC void rf_patch_rfe_bt5(void) -{ -#ifdef __PATCH_NO_UNROLLING - uint32_t i; - for (i = 0; i < 512; i++) { - HWREG(RFC_RFERAM_BASE + 4 * i) = patchBt5Rfe[i]; - } -#else - const uint32_t *pS = patchBt5Rfe; - volatile unsigned long *pD = &HWREG(RFC_RFERAM_BASE); - uint32_t t1, t2, t3, t4, t5, t6, t7, t8; - uint32_t nIterations = 64; - - do { - t1 = *pS++; - t2 = *pS++; - t3 = *pS++; - t4 = *pS++; - t5 = *pS++; - t6 = *pS++; - t7 = *pS++; - t8 = *pS++; - *pD++ = t1; - *pD++ = t2; - *pD++ = t3; - *pD++ = t4; - *pD++ = t5; - *pD++ = t6; - *pD++ = t7; - *pD++ = t8; - } while (--nIterations); -#endif -} - -#endif diff --git a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_rfe_genfsk.h b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_rfe_genfsk.h deleted file mode 100644 index 6cd4247a2..000000000 --- a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_rfe_genfsk.h +++ /dev/null @@ -1,611 +0,0 @@ -/****************************************************************************** -* Filename: rf_patch_rfe_genfsk.h -* Revised: $Date: 2018-01-24 16:44:53 +0100 (on, 24 jan 2018) $ -* Revision: $Revision: 18195 $ -* -* Description: RF core patch for Generic FSK support in CC13x2 and CC26x2 -* -* Copyright (c) 2015-2017, Texas Instruments Incorporated -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* -* 1) Redistributions of source code must retain the above copyright notice, -* this list of conditions and the following disclaimer. -* -* 2) Redistributions in binary form must reproduce the above copyright notice, -* this list of conditions and the following disclaimer in the documentation -* and/or other materials provided with the distribution. -* -* 3) Neither the name of the ORGANIZATION nor the names of its contributors may -* be used to endorse or promote products derived from this software without -* specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -******************************************************************************/ - - -#ifndef _RF_PATCH_RFE_GENFSK_H -#define _RF_PATCH_RFE_GENFSK_H - -#include -#include "../inc/hw_types.h" - -#ifndef RFE_PATCH_TYPE -#define RFE_PATCH_TYPE static const uint32_t -#endif - -#ifndef PATCH_FUN_SPEC -#define PATCH_FUN_SPEC static inline -#endif - -#ifndef RFC_RFERAM_BASE -#define RFC_RFERAM_BASE 0x2100C000 -#endif - -#ifndef RFE_PATCH_MODE -#define RFE_PATCH_MODE 0 -#endif - -RFE_PATCH_TYPE patchGenfskRfe[512] = { - 0x13076286, - 0x1f2e34f1, - 0x0ab03f13, - 0xff07a000, - 0x4030ffc0, - 0x40014000, - 0x40074003, - 0x404f400f, - 0x41cf40cf, - 0x47cf43cf, - 0x3fcf4fcf, - 0x1fcf2fcf, - 0xc0500fcf, - 0x70009100, - 0x9100c070, - 0x31827000, - 0x91310021, - 0x7000b110, - 0xb1018101, - 0x3182a100, - 0xb1109132, - 0x10119101, - 0x22418141, - 0x06f1402c, - 0xc0507000, - 0x70009150, - 0x9150c070, - 0x31827000, - 0x91810021, - 0x7000b160, - 0xb1518151, - 0x3182a150, - 0xb1609182, - 0x10119151, - 0x22418191, - 0x06f14044, - 0x10257000, - 0x9100c050, - 0xc090c3f4, - 0x6f031420, - 0x04411031, - 0x22f082a0, - 0x26514056, - 0x3182c022, - 0x91310021, - 0x3963b110, - 0x04411031, - 0x3182c082, - 0x91310021, - 0x3963b110, - 0xc0a21031, - 0x00213182, - 0xb1109131, - 0x31151050, - 0x92551405, - 0x641c7000, - 0x1031c2b2, - 0x31610631, - 0x641f02c1, - 0x1031c112, - 0x06713921, - 0x02e13151, - 0x7000641f, - 0x22d082b0, - 0xc0c244a5, - 0x66416627, - 0x6419657d, - 0xb1109136, - 0xb1109134, - 0xc112665f, - 0xc3406424, - 0x40922201, - 0x1410c5f1, - 0x16356892, - 0x65b91634, - 0x65ebb051, - 0x65eb65c1, - 0x65fa65c9, - 0xb061a051, - 0xc6b0722c, - 0x128068a0, - 0xb03290b0, - 0x64197000, - 0x318182b1, - 0xc0e23981, - 0x665f641f, - 0x82b07000, - 0x44ba22d0, - 0xb05165b1, - 0x65a165eb, - 0x65a965fa, - 0xa05165fa, - 0x722cb061, - 0xc201641c, - 0x641fc0c2, - 0x318080a0, - 0x68c13940, - 0xc0c2c101, - 0xc101641f, - 0x641fc122, - 0x22d082b0, - 0x1a3544cf, - 0x91356419, - 0x82a3b110, - 0x12c0646f, - 0xb03290b0, - 0x82b07000, - 0x44f422d0, - 0x6627c162, - 0x657d6655, - 0x91866431, - 0x9184b160, - 0x6670b160, - 0x68e3c5f0, - 0x16741675, - 0xb05165b9, - 0x65c16609, - 0xa0516609, - 0x722cb061, - 0x68efc6b0, - 0x90b01280, - 0x7000b032, - 0x82b16431, - 0x39813181, - 0x6437c182, - 0x70006670, - 0x22d082b0, - 0x65a14507, - 0x6618b051, - 0x661865a9, - 0xb061a051, - 0x6434722c, - 0xc162c401, - 0x80a06437, - 0x39403180, - 0xc301690e, - 0x6437c162, - 0xc0a2c101, - 0x82b06437, - 0x451c22d0, - 0x64311a75, - 0xb1609185, - 0x646f82a3, - 0x90b012c0, - 0x7000b032, - 0xc272641c, - 0x641fc081, - 0xc111c122, - 0xc002641f, - 0x641fc111, - 0xc331c062, - 0xc362641f, - 0x641fc111, - 0xc111c302, - 0x82a3641f, - 0x646f3953, - 0x6424c3e2, - 0x41382211, - 0xc881c242, - 0xc252641f, - 0x641fc111, - 0xcee1c272, - 0xc202641f, - 0x641fc881, - 0xc801c202, - 0xc170641f, - 0x7000694c, - 0xc242641c, - 0x641fc801, - 0xc011c252, - 0xc272641f, - 0x641fc0e1, - 0xc101c002, - 0xc062641f, - 0x641fc301, - 0xc101c122, - 0xc362641f, - 0x641fc101, - 0xc101c302, - 0x82a3641f, - 0x7000646f, - 0x1e118081, - 0xb0504178, - 0x7100b054, - 0x22408040, - 0xa0544179, - 0x80f1b064, - 0x456d2201, - 0x22007000, - 0xb060416d, - 0xc108616a, - 0x39508270, - 0x1e003980, - 0xc1014186, - 0x14183001, - 0xc1091a18, - 0x39608280, - 0x1e003980, - 0xc1014190, - 0x14193001, - 0x827b1a19, - 0x393b313b, - 0x313b398b, - 0x45991e0b, - 0x828ac01b, - 0x392a312a, - 0x1e0a398a, - 0xc01a45a0, - 0x722c7000, - 0xb2c092e9, - 0x10731062, - 0xc3fd10a1, - 0x722c7000, - 0xb2c092e8, - 0x10531042, - 0xc1fd10b1, - 0x722c7000, - 0x10c292e9, - 0xc4011073, - 0xb2c0c03d, - 0x722c7000, - 0x104292e8, - 0x10b11053, - 0xb2c0c1fd, - 0x722c7000, - 0xb2c092e9, - 0x10731062, - 0xc3fd10a1, - 0x722c7000, - 0xb2c092e9, - 0x10c21073, - 0xc03dc401, - 0xb0507000, - 0x7100b054, - 0x22408040, - 0xb06441dc, - 0x220080f0, - 0x61e241d1, - 0x41d12200, - 0x8081b060, - 0x45d11e11, - 0xa054a050, - 0x90b01240, - 0x82a3b032, - 0x39533953, - 0xc0507000, - 0x10d09100, - 0x7100b061, - 0x1c231412, - 0x91334df6, - 0x7000b110, - 0xb1109132, - 0x700069ee, - 0x9100c050, - 0xb06110d0, - 0x18137100, - 0x4a051c32, - 0xb1109132, - 0x91337000, - 0x69fdb110, - 0xc0507000, - 0x10d09150, - 0x7100b061, - 0x1c231412, - 0x91834e14, - 0x7000b160, - 0xb1609182, - 0x70006a0c, - 0x9150c050, - 0xb06110d0, - 0x18137100, - 0x4a231c32, - 0xb1609182, - 0x91837000, - 0x6a1bb160, - 0x10247000, - 0x1c02c0c0, - 0x6424462d, - 0x643c622e, - 0x10421015, - 0xc0c01612, - 0x1c021610, - 0x64244637, - 0x643c6238, - 0x14153141, - 0x31801040, - 0x10541405, - 0x04047870, - 0xc0e67000, - 0x106c3186, - 0x398182b1, - 0x04017880, - 0x10671416, - 0x04077880, - 0xc3f082b1, - 0x14170401, - 0x318082b0, - 0x140c3980, - 0xc1867000, - 0x10673186, - 0x788082b1, - 0x14160401, - 0x141782b1, - 0x641c7000, - 0xc122c111, - 0xc470641f, - 0xc1116a64, - 0x641fc0c2, - 0x646f65d1, - 0x6a6bc2b0, - 0xc0c2c221, - 0x7000641f, - 0xc1116434, - 0x6437c0a2, - 0x6a75c470, - 0xc162c331, - 0x65d16437, - 0xc2b0646f, - 0xc4416a7c, - 0x6437c162, - 0x00007000, - 0x00000000, - 0x00000000, - 0x72057306, - 0x720e720b, - 0x7100b050, - 0xb0608081, - 0x8092a050, - 0x46a62241, - 0xc1f18080, - 0x16300410, - 0x14011101, - 0x62b86c01, - 0x62b862b8, - 0x62b862b8, - 0x62b862b8, - 0x62b862b8, - 0x62b862b8, - 0x62b862b8, - 0x06f18091, - 0x80823121, - 0x14122a42, - 0x11011632, - 0x6c011421, - 0x62b862cd, - 0x62b962cd, - 0x62bd62c1, - 0x62b862b8, - 0x647e62c5, - 0x64ad656a, - 0x64d562c5, - 0x64fc656a, - 0x652262c5, - 0x654e66e5, - 0x121062c5, - 0x720e90b0, - 0x72057306, - 0x90301210, - 0xc460628a, - 0x782091a0, - 0x78309260, - 0x78409270, - 0x78509280, - 0x78609290, - 0x781092b0, - 0xc1f091e0, - 0x826090a0, - 0x06f03940, - 0x31101001, - 0x92501410, - 0xa0bc62c5, - 0xb0e3a0e2, - 0x80f0a054, - 0x46f02250, - 0x22008040, - 0x62e847f6, - 0xa040a0e3, - 0x318d827d, - 0x8260398d, - 0x100906f0, - 0x394a826a, - 0x826006fa, - 0x06f03980, - 0x10ab100e, - 0x10c210bc, - 0x722e6449, - 0x67f9ce40, - 0xb003b013, - 0xb053679a, - 0xb054b050, - 0xb013b064, - 0x8260677c, - 0x471322e0, - 0x71006783, - 0x22018041, - 0x80f047f6, - 0x47262210, - 0x47e322f0, - 0x2231b064, - 0xb0634313, - 0x826067a0, - 0x471322e0, - 0x63136747, - 0x81bfb064, - 0x3d8f318f, - 0x934fde30, - 0x710067f9, - 0x22018041, - 0xb06447f6, - 0x225080f0, - 0xb0634340, - 0x22c18261, - 0x67a0473b, - 0x826167d4, - 0x472d22d1, - 0x632d6747, - 0x318181b1, - 0xde203d81, - 0x67f99341, - 0x820062e5, - 0x82239210, - 0xa2e082e7, - 0x4f5618d3, - 0x16130bf3, - 0x4b7b1ce3, - 0x82339213, - 0x6367143b, - 0x47621cba, - 0x4b621e23, - 0x4f621ce3, - 0x2207b2e0, - 0xa2e04362, - 0x636d1a1b, - 0x4b7b1ce3, - 0x82339213, - 0x1cab183b, - 0x1c9b4f77, - 0x1cbc4b79, - 0x10b2437b, - 0x22d08260, - 0x80f04374, - 0x477b2210, - 0x677c6449, - 0x10ab637b, - 0x109b636b, - 0x7000636b, - 0x06f08280, - 0x7100b063, - 0x10bc6b7e, - 0x82027000, - 0x82229212, - 0x18128251, - 0x181281a1, - 0x31818291, - 0x1c123d81, - 0xb0e24b91, - 0xc7f1b032, - 0x4f951421, - 0x91b2c812, - 0xb03191c2, - 0x7000b0e1, - 0xc0061208, - 0x91b0c800, - 0x700091c0, - 0x82008251, - 0x82209210, - 0x81a11810, - 0x14061810, - 0x829280e1, - 0x3d823182, - 0x4bb41c20, - 0x2221b0e2, - 0xb03247b8, - 0x67f9ce10, - 0x43b82221, - 0xb032a0e2, - 0x39418281, - 0x1e0106f1, - 0x161843c5, - 0x3010c010, - 0x47d31c08, - 0x3c101060, - 0xc7f11006, - 0x4fc91461, - 0x91b6c816, - 0x318181c1, - 0x1c163d81, - 0x91c64bd0, - 0xc006b031, - 0x70001208, - 0x318181b1, - 0x82903d81, - 0x18013980, - 0x4be21cf1, - 0x80b01401, - 0x47e222c0, - 0xb033b0bc, - 0xa0037000, - 0xb064b063, - 0x654eb0ef, - 0x80407100, - 0x47f62200, - 0x6522b064, - 0x7100a0ef, - 0x22008040, - 0xb06447f6, - 0x6313b003, - 0xa003a0e3, - 0x93307000, - 0x22008320, - 0xb31047fa, - 0x00007000 -}; - -PATCH_FUN_SPEC void rf_patch_rfe_genfsk(void) -{ -#ifdef __PATCH_NO_UNROLLING - uint32_t i; - for (i = 0; i < 512; i++) { - HWREG(RFC_RFERAM_BASE + 4 * i) = patchGenfskRfe[i]; - } -#else - const uint32_t *pS = patchGenfskRfe; - volatile unsigned long *pD = &HWREG(RFC_RFERAM_BASE); - uint32_t t1, t2, t3, t4, t5, t6, t7, t8; - uint32_t nIterations = 64; - - do { - t1 = *pS++; - t2 = *pS++; - t3 = *pS++; - t4 = *pS++; - t5 = *pS++; - t6 = *pS++; - t7 = *pS++; - t8 = *pS++; - *pD++ = t1; - *pD++ = t2; - *pD++ = t3; - *pD++ = t4; - *pD++ = t5; - *pD++ = t6; - *pD++ = t7; - *pD++ = t8; - } while (--nIterations); -#endif -} - -#endif diff --git a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_rfe_ieee_802_15_4.h b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_rfe_ieee_802_15_4.h deleted file mode 100644 index 268878e39..000000000 --- a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_rfe_ieee_802_15_4.h +++ /dev/null @@ -1,438 +0,0 @@ -/****************************************************************************** -* Filename: rf_patch_rfe_ieee_802_15_4.h -* Revised: $Date: 2018-05-07 15:02:01 +0200 (ma, 07 mai 2018) $ -* Revision: $Revision: 18438 $ -* -* Description: RF core patch for IEEE 802.15.4-2006 support in CC13x2 and CC26x2. Contains fix to correct RSSIMAXVAL calculation. -* -* Copyright (c) 2015-2017, Texas Instruments Incorporated -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* -* 1) Redistributions of source code must retain the above copyright notice, -* this list of conditions and the following disclaimer. -* -* 2) Redistributions in binary form must reproduce the above copyright notice, -* this list of conditions and the following disclaimer in the documentation -* and/or other materials provided with the distribution. -* -* 3) Neither the name of the ORGANIZATION nor the names of its contributors may -* be used to endorse or promote products derived from this software without -* specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -******************************************************************************/ -// It should only be included from ONE source file to avoid duplicated constant arrays - - -#ifndef _RF_PATCH_RFE_IEEE_802_15_4_H -#define _RF_PATCH_RFE_IEEE_802_15_4_H - -#include -#include "../inc/hw_types.h" - -#ifndef RFE_PATCH_TYPE -#define RFE_PATCH_TYPE static const uint32_t -#endif - -#ifndef PATCH_FUN_SPEC -#define PATCH_FUN_SPEC static inline -#endif - -#ifndef RFC_RFERAM_BASE -#define RFC_RFERAM_BASE 0x2100C000 -#endif - -#ifndef RFE_PATCH_MODE -#define RFE_PATCH_MODE 0 -#endif - -RFE_PATCH_TYPE patchIeee_802_15_4Rfe[331] = { - 0x163f614a, - 0x07ff07f7, - 0x000f0046, - 0x00040000, - 0x003f002e, - 0x40004030, - 0x40034001, - 0x400f4007, - 0x40cf404f, - 0x43cf41cf, - 0x4fcf47cf, - 0x2fcf3fcf, - 0x0fcf1fcf, - 0x9100c050, - 0xc0707000, - 0x70009100, - 0x00213182, - 0xb1109131, - 0x81017000, - 0xa100b101, - 0x91323182, - 0x9101b110, - 0x81411011, - 0x402d2241, - 0x700006f1, - 0x9150c050, - 0xc0707000, - 0x70009150, - 0x00213182, - 0xb1609181, - 0x10257000, - 0x9100c050, - 0xc0a0c3f4, - 0x6f031420, - 0x04411031, - 0x22f082a0, - 0x2651404a, - 0x3182c022, - 0x91310021, - 0x3963b110, - 0x04411031, - 0x3182c082, - 0x91310021, - 0x3963b110, - 0xc0a21031, - 0x00213182, - 0xb1109131, - 0x31151050, - 0x92551405, - 0x641d7000, - 0x1031c2b2, - 0x31610631, - 0x642002c1, - 0x1031c112, - 0x06713921, - 0x02e13151, - 0x70006420, - 0x82b1641a, - 0x39813181, - 0x6420c0e2, - 0xc111641d, - 0x6420c122, - 0x687dc470, - 0xc0c2c111, - 0x64966420, - 0x700064a9, - 0x82b16432, - 0x39813181, - 0x6438c182, - 0xc1116435, - 0x6438c0a2, - 0x688fc470, - 0xc162c331, - 0x64966438, - 0x700064a9, - 0xb054b050, - 0x80407100, - 0x44a32240, - 0x40962200, - 0x8081b060, - 0x44961e11, - 0xa0547000, - 0x80f0b064, - 0x40962200, - 0x12407000, - 0xb03290b0, - 0x395382a3, - 0x64633953, - 0x68b1c2f0, - 0xc1f18080, - 0xc1510410, - 0x40bd1c10, - 0xc221641d, - 0x6420c0c2, - 0x643560c1, - 0xc162c441, - 0xce306438, - 0x128068c2, - 0xb03290b0, - 0x641d7000, - 0xc0c2c201, - 0x80a06420, - 0x39403180, - 0xc10168ce, - 0x6420c0c2, - 0xc122c101, - 0x82a36420, - 0x12c06463, - 0xb03290b0, - 0x64357000, - 0xc162c401, - 0x80a06438, - 0x39403180, - 0xc30168e2, - 0x6438c162, - 0xc0a2c101, - 0x82a36438, - 0x12c06463, - 0xb03290b0, - 0x641d7000, - 0xc081c272, - 0xc1226420, - 0x6420c111, - 0xc111c002, - 0xc0626420, - 0x6420c331, - 0xc111c362, - 0xc3026420, - 0x6420c111, - 0x395382a3, - 0xc3e26463, - 0x22116425, - 0xc2424105, - 0x6420c881, - 0xc111c252, - 0xc2726420, - 0x6420cee1, - 0xc881c202, - 0xc2026420, - 0x6420c801, - 0x6919c170, - 0x641d7000, - 0xc801c242, - 0xc2526420, - 0x6420c011, - 0xc0e1c272, - 0xc0026420, - 0x6420c101, - 0xc301c062, - 0xc1226420, - 0x6420c101, - 0xc101c362, - 0xc3026420, - 0x6420c101, - 0x646382a3, - 0x80817000, - 0x41451e11, - 0xb054b050, - 0x80407100, - 0x41462240, - 0xb064a054, - 0x220180f1, - 0x7000453a, - 0x413a2200, - 0x6137b060, - 0x72057306, - 0x720e720b, - 0x7100b050, - 0xb0608081, - 0x8092a050, - 0x9341ef80, - 0x668f9352, - 0x456e2241, - 0xc1f18080, - 0x16300410, - 0x14011101, - 0x617f6c01, - 0x617f617f, - 0x617f617f, - 0x6180617f, - 0x61846182, - 0x617f6186, - 0x6272626f, - 0x0402c0f0, - 0x2a413132, - 0x16321412, - 0x14211101, - 0x61a46c01, - 0x61a46188, - 0x618e618a, - 0x617f6192, - 0x6196617f, - 0x61966472, - 0x619664c7, - 0x619664ef, - 0x6196651b, - 0x619665ba, - 0x65376472, - 0x619664c7, - 0x65ba64ef, - 0x6196651b, - 0x65376484, - 0x619664db, - 0xdf708082, - 0x668f9342, - 0x90b01210, - 0x1220619f, - 0x730690b0, - 0x12107205, - 0x614e9030, - 0x91a07840, - 0x31107850, - 0x14107851, - 0x78709250, - 0x78513140, - 0x31400010, - 0x00107861, - 0x78809260, - 0x78909270, - 0xc0f092b0, - 0x619690a0, - 0xa054b0e3, - 0x225080f0, - 0x804045c3, - 0x46642200, - 0xa0e361ba, - 0x668fcf60, - 0x10e9826e, - 0x394e06f9, - 0x06fa10ea, - 0x394e10ac, - 0x10c206fe, - 0x827d643d, - 0x80f310cb, - 0x41d82213, - 0x61db6675, - 0x41db2223, - 0x78104682, - 0x662f91e0, - 0xb053b013, - 0xb050b063, - 0xb064b054, - 0x80f3b003, - 0x41ba2253, - 0x80417100, - 0x46642201, - 0x41f82241, - 0x80f3b064, - 0x41f42213, - 0x61e56675, - 0x41e52223, - 0x61e56682, - 0x8200b063, - 0x822f9210, - 0x318080e0, - 0x318f3980, - 0x90e000f0, - 0x80f3822f, - 0x46622203, - 0x22408090, - 0x10f34662, - 0x4e1418d3, - 0x16130bf3, - 0x4a621ce3, - 0x82339213, - 0x6219143b, - 0x4a621ce3, - 0x82339213, - 0x1cab183b, - 0x1c9b4e2b, - 0x1cbc4a2d, - 0x1cbc4262, - 0xa0e0b0e0, - 0x10b210bc, - 0x663f643d, - 0xb063663f, - 0xb0637100, - 0x10ab61e5, - 0x109b621d, - 0x7827621d, - 0x18707830, - 0xc0011a10, - 0x16176e71, - 0x78276a34, - 0xc0061208, - 0x91b0c800, - 0x10007000, - 0x10f01000, - 0x18108251, - 0x6d716d71, - 0x14061816, - 0x16176e70, - 0x1c177831, - 0x7827464c, - 0x1e881618, - 0x1060465f, - 0x81a13d30, - 0x80f11810, - 0x425f2251, - 0x81c191b0, - 0x3d813181, - 0x4a5d1c10, - 0xb03191c0, - 0x70001278, - 0x10001000, - 0x61e5663f, - 0x8251a0e3, - 0x318281b2, - 0xef503d82, - 0x93529341, - 0xa003668f, - 0x80a27000, - 0x6196643d, - 0x7100b050, - 0xc0506196, - 0xc0029100, - 0x3182c551, - 0x91310021, - 0xb0e1b110, - 0xcf40a0e2, - 0x7000668f, - 0x9100c050, - 0xca91c002, - 0x00213182, - 0xb1109131, - 0xb0e2a0e1, - 0x668fcf30, - 0x93307000, - 0x22008320, - 0xb3104690, - 0x00007000 -}; - -PATCH_FUN_SPEC void rf_patch_rfe_ieee_802_15_4(void) -{ -#ifdef __PATCH_NO_UNROLLING - uint32_t i; - for (i = 0; i < 331; i++) { - HWREG(RFC_RFERAM_BASE + 4 * i) = patchIeee_802_15_4Rfe[i]; - } -#else - const uint32_t *pS = patchIeee_802_15_4Rfe; - volatile unsigned long *pD = &HWREG(RFC_RFERAM_BASE); - uint32_t t1, t2, t3, t4, t5, t6, t7, t8; - uint32_t nIterations = 41; - - do { - t1 = *pS++; - t2 = *pS++; - t3 = *pS++; - t4 = *pS++; - t5 = *pS++; - t6 = *pS++; - t7 = *pS++; - t8 = *pS++; - *pD++ = t1; - *pD++ = t2; - *pD++ = t3; - *pD++ = t4; - *pD++ = t5; - *pD++ = t6; - *pD++ = t7; - *pD++ = t8; - } while (--nIterations); - - t1 = *pS++; - t2 = *pS++; - t3 = *pS++; - *pD++ = t1; - *pD++ = t2; - *pD++ = t3; -#endif -} - -#endif diff --git a/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_rfe_tof.h b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_rfe_tof.h new file mode 100644 index 000000000..d09cb4ad8 --- /dev/null +++ b/third_party/ti/devices/cc13x2_cc26x2/rf_patches/rf_patch_rfe_tof.h @@ -0,0 +1,571 @@ +/****************************************************************************** +* Filename: rf_patch_rfe_tof.h +* Revised: $Date: 2019-01-31 15:04:59 +0100 (to, 31 jan 2019) $ +* Revision: $Revision: 18843 $ +* +* Description: RF core RFE patch for time of flight 2Mbps PHY for CC13x2 and CC26x2 +* +* Copyright (c) 2015-2019, Texas Instruments Incorporated +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* 1) Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* +* 2) Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* 3) Neither the name of the ORGANIZATION nor the names of its contributors may +* be used to endorse or promote products derived from this software without +* specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +******************************************************************************/ + + +#ifndef _RF_PATCH_RFE_TOF_H +#define _RF_PATCH_RFE_TOF_H + +#include +#include "../inc/hw_types.h" + +#ifndef RFE_PATCH_TYPE +#define RFE_PATCH_TYPE static const uint32_t +#endif + +#ifndef PATCH_FUN_SPEC +#define PATCH_FUN_SPEC static inline +#endif + +#ifndef RFC_RFERAM_BASE +#define RFC_RFERAM_BASE 0x2100C000 +#endif + +#ifndef RFE_PATCH_MODE +#define RFE_PATCH_MODE 0 +#endif + +RFE_PATCH_TYPE patchTofRfe[461] = { + 0x00006194, + 0x004535aa, + 0x0421a355, + 0x1f40004c, + 0x0000003f, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x40004030, + 0x40034001, + 0x400f4007, + 0x40cf404f, + 0x43cf41cf, + 0x4fcf47cf, + 0x2fcf3fcf, + 0x0fcf1fcf, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x40004030, + 0x40034001, + 0x400f4007, + 0x40cf404f, + 0x6fcf7fcf, + 0x4fcf5fcf, + 0x2fcf3fcf, + 0x0fcf1fcf, + 0x00000000, + 0x00000000, + 0x9100c050, + 0xc0707000, + 0x70009100, + 0x00213182, + 0xb1109131, + 0x81017000, + 0xa100b101, + 0x91323182, + 0x9101b110, + 0x81411011, + 0x40772241, + 0x700006f1, + 0x9150c050, + 0xc0707000, + 0x70009150, + 0x00213182, + 0xb1609181, + 0x10257000, + 0x9100c050, + 0xc140c3f4, + 0x6f031420, + 0x04411031, + 0x22f082a0, + 0x26514094, + 0x3182c022, + 0x91310021, + 0x3963b110, + 0x04411031, + 0x3182c082, + 0x91310021, + 0x3963b110, + 0xc0a21031, + 0x00213182, + 0xb1109131, + 0x31151050, + 0x92551405, + 0x64677000, + 0x1031c2b2, + 0x31610631, + 0x646a02c1, + 0x1031c112, + 0x06713921, + 0x02e13151, + 0x7000646a, + 0x82b16464, + 0x39813181, + 0x646ac0e2, + 0xc1116467, + 0x646ac122, + 0x68c7c470, + 0xc0c2c111, + 0x64e0646a, + 0x700064f3, + 0x82b1647c, + 0x39813181, + 0x6482c182, + 0xc111647f, + 0x6482c0a2, + 0x68d9c470, + 0xc162c331, + 0x64e06482, + 0x700064f3, + 0xb054b050, + 0x80407100, + 0x44ed2240, + 0x40e02200, + 0x8081b060, + 0x44e01e11, + 0xa0547000, + 0x80f0b064, + 0x40e02200, + 0x12407000, + 0xb03290b0, + 0x395382a3, + 0x64ad3953, + 0x68fbc2f0, + 0xc1f18080, + 0xc1510410, + 0x41071c10, + 0xc2216467, + 0x646ac0c2, + 0x647f610b, + 0xc162c441, + 0xce306482, + 0x1280690c, + 0xb03290b0, + 0x64677000, + 0xc0c2c201, + 0x80a0646a, + 0x39403180, + 0xc1016918, + 0x646ac0c2, + 0xc122c101, + 0x82a3646a, + 0x12c064ad, + 0xb03290b0, + 0x647f7000, + 0xc162c401, + 0x80a06482, + 0x39403180, + 0xc301692c, + 0x6482c162, + 0xc0a2c101, + 0x82a36482, + 0x12c064ad, + 0xb03290b0, + 0x64677000, + 0xc081c272, + 0xc122646a, + 0x646ac111, + 0xc111c002, + 0xc062646a, + 0x646ac331, + 0xc111c362, + 0xc302646a, + 0x646ac111, + 0x395382a3, + 0xc3e264ad, + 0x2211646f, + 0xc242414f, + 0x646ac881, + 0xc111c252, + 0xc272646a, + 0x646acee1, + 0xc881c202, + 0xc202646a, + 0x646ac801, + 0x6963c170, + 0x64677000, + 0xc801c242, + 0xc252646a, + 0x646ac011, + 0xc0e1c272, + 0xc002646a, + 0x646ac101, + 0xc301c062, + 0xc122646a, + 0x646ac101, + 0xc101c362, + 0xc302646a, + 0x646ac101, + 0x64ad82a3, + 0x80817000, + 0x418f1e11, + 0xb054b050, + 0x80407100, + 0x41902240, + 0xb064a054, + 0x220180f1, + 0x70004584, + 0x41842200, + 0x6181b060, + 0x72057306, + 0x720e720b, + 0x7100b050, + 0xa050b060, + 0x80928081, + 0x45b32241, + 0xc1f18080, + 0x16300410, + 0x14011101, + 0x61c66c01, + 0x61c661c6, + 0x61c661c6, + 0x61e661c6, + 0x61e661c6, + 0x61c661c6, + 0x809161c6, + 0x0421c0f2, + 0x80823121, + 0x14122a42, + 0x11011632, + 0x6c011421, + 0x61c661cf, + 0x61c661cf, + 0x61c661c6, + 0x61c661c6, + 0x61c861c8, + 0x61cbb0b0, + 0x7306b0b1, + 0xb0307205, + 0x78206198, + 0x78427831, + 0x78547873, + 0x78667885, + 0x92719260, + 0x92939282, + 0x92b592a4, + 0xc01f91a6, + 0x3940924f, + 0x100106f0, + 0x14103110, + 0x61c89250, + 0xcff0b060, + 0x66306793, + 0xb0e16624, + 0xb054b050, + 0x8262b064, + 0x39823182, + 0x64873942, + 0x7100b0e1, + 0x22008040, + 0xb0644621, + 0x225280f2, + 0x22224611, + 0x22324608, + 0x1e02460f, + 0xdfe041f5, + 0x67939342, + 0x61f56511, + 0x663f663a, + 0x80f0b064, + 0x46112250, + 0x663561f5, + 0xcfd061f5, + 0xa0546793, + 0xa050b064, + 0xa052b060, + 0xa053b062, + 0x6565b063, + 0xcfc06511, + 0x720e6793, + 0xcfb061c8, + 0x62116793, + 0x82b16464, + 0x39813181, + 0x646ac0e2, + 0xc1116467, + 0x646ac122, + 0x700064f3, + 0x70006539, + 0x70006511, + 0x64676565, + 0xc0c2c111, + 0x7000646a, + 0xc1016467, + 0x646ac0c2, + 0xc8007000, + 0x81a991b0, + 0x8091b050, + 0x46b02241, + 0x31828262, + 0x39423982, + 0x82626487, + 0x102f06f2, + 0x142f311f, + 0x22d68266, + 0xc1404655, + 0xc5006256, + 0x6f0d1420, + 0x10de396d, + 0x044ec3f4, + 0x3182c082, + 0x396d002e, + 0x3182c0a2, + 0x826a002d, + 0x06fa398a, + 0x31808270, + 0xc00b3980, + 0x10bc180b, + 0x825318ac, + 0x149b1439, + 0x06f08260, + 0x31101001, + 0x81a11410, + 0x140c1410, + 0x46ea22c6, + 0x39408280, + 0x100206f0, + 0x3001c011, + 0x1801c010, + 0x31821802, + 0x26c10021, + 0xb00391e1, + 0xb063b013, + 0x8041b053, + 0x46e12201, + 0x92148204, + 0x1cb58225, + 0x18954e99, + 0x80f091b5, + 0x428b2240, + 0x913d62ae, + 0x913eb110, + 0x80e0b110, + 0x46a32200, + 0x42a322e6, + 0x1895b0e0, + 0x925f91b5, + 0x14f981a9, + 0x225080f0, + 0x224046e1, + 0x637646ae, + 0x6793cfa0, + 0xa052b063, + 0xc0f28280, + 0x10020420, + 0x3001c011, + 0x1801c010, + 0x31821802, + 0x26c10021, + 0x720e91e1, + 0xb01391e1, + 0xb063b003, + 0xb064b053, + 0x7100b054, + 0x22018041, + 0xb06346e1, + 0x80f0b064, + 0x42e12220, + 0x92118201, + 0x18918221, + 0xb03191b1, + 0x674e62c7, + 0x81a9a0e0, + 0x14598255, + 0x7100c080, + 0x6addb063, + 0xb0e6628b, + 0xa053a052, + 0x81b28251, + 0x3d823182, + 0x7000a003, + 0x39478287, + 0x82803987, + 0x06f03980, + 0xc0111002, + 0xc0103001, + 0x18021801, + 0x00213182, + 0x91d126c1, + 0xb012b002, + 0x39408280, + 0x100206f0, + 0x3001c011, + 0x1801c010, + 0x31821802, + 0x26c10021, + 0xb00391e1, + 0xb063b013, + 0x7100b053, + 0xb062a053, + 0x8041b052, + 0x46e12201, + 0x921481f4, + 0x82048225, + 0x4f201cb5, + 0x91b51895, + 0x224080f0, + 0x62ae4311, + 0x92148204, + 0x10408224, + 0x91b01890, + 0x1c751845, + 0x80f04f2d, + 0x43112240, + 0x913d62ae, + 0x913eb110, + 0x80e0b110, + 0x47372200, + 0x433722e6, + 0x91b5b0e0, + 0x81a9925f, + 0x80f014f9, + 0x463f2250, + 0x46ae2240, + 0x674e6355, + 0x81a9a0e0, + 0x14598255, + 0x7100c140, + 0x6b47b062, + 0x80a26311, + 0x61c86487, + 0x39428262, + 0x608706f2, + 0x7100b050, + 0x829061c8, + 0x22018041, + 0x81f446e1, + 0x82259214, + 0x91b51895, + 0x224180f1, + 0x6b5646ae, + 0x318181b1, + 0xdf903d81, + 0x67939341, + 0x22018041, + 0x81f446e1, + 0x82259214, + 0x4b411cc5, + 0x91b51895, + 0x224080f0, + 0x62ae4362, + 0x6793cf80, + 0x80418290, + 0x46e12201, + 0x92148204, + 0x18958225, + 0x80f191b5, + 0x46ae2241, + 0x80416b79, + 0x46e12201, + 0x92148204, + 0x1cc58225, + 0x18954ad7, + 0x80f091b5, + 0x43852240, + 0x933062ae, + 0x22008320, + 0xb3104794, + 0x00007000 +}; + +PATCH_FUN_SPEC void rf_patch_rfe_tof(void) +{ +#ifdef __PATCH_NO_UNROLLING + uint32_t i; + for (i = 0; i < 461; i++) { + HWREG(RFC_RFERAM_BASE + 4 * i) = patchTofRfe[i]; + } +#else + const uint32_t *pS = patchTofRfe; + volatile unsigned long *pD = &HWREG(RFC_RFERAM_BASE); + uint32_t t1, t2, t3, t4, t5, t6, t7, t8; + uint32_t nIterations = 57; + + do { + t1 = *pS++; + t2 = *pS++; + t3 = *pS++; + t4 = *pS++; + t5 = *pS++; + t6 = *pS++; + t7 = *pS++; + t8 = *pS++; + *pD++ = t1; + *pD++ = t2; + *pD++ = t3; + *pD++ = t4; + *pD++ = t5; + *pD++ = t6; + *pD++ = t7; + *pD++ = t8; + } while (--nIterations); + + t1 = *pS++; + t2 = *pS++; + t3 = *pS++; + t4 = *pS++; + t5 = *pS++; + *pD++ = t1; + *pD++ = t2; + *pD++ = t3; + *pD++ = t4; + *pD++ = t5; +#endif +} + +#endif diff --git a/third_party/ti/devices/cc13x2_cc26x2/rom/driverlib.c b/third_party/ti/devices/cc13x2_cc26x2/rom/driverlib.c index fb87586f9..7367cdc9c 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/rom/driverlib.c +++ b/third_party/ti/devices/cc13x2_cc26x2/rom/driverlib.c @@ -1,4 +1,5 @@ #include "../driverlib/adi.h" +#include "../driverlib/aes.h" #include "../driverlib/aon_batmon.h" #include "../driverlib/aon_batmon.h" #include "../driverlib/aon_batmon.h" @@ -17,6 +18,8 @@ #include "../driverlib/ddi.h" #include "../driverlib/event.h" #include "../driverlib/flash.h" +#include "../driverlib/flash.h" +#include "../driverlib/gpio.h" #include "../driverlib/i2c.h" #include "../driverlib/i2s.h" #include "../driverlib/interrupt.h" @@ -24,10 +27,13 @@ #include "../driverlib/ioc.h" #include "../driverlib/osc.h" #include "../driverlib/osc.h" +#include "../driverlib/pka.h" #include "../driverlib/prcm.h" #include "../driverlib/pwr_ctrl.h" #include "../driverlib/setup_rom.h" #include "../driverlib/setup_rom.h" +#include "../driverlib/setup_rom.h" +#include "../driverlib/sha2.h" #include "../driverlib/smph.h" #include "../driverlib/ssi.h" #include "../driverlib/sys_ctrl.h" @@ -53,6 +59,7 @@ #include "../inc/hw_fcfg1.h" #include "../inc/hw_fcfg1.h" #include "../inc/hw_fcfg1.h" +#include "../inc/hw_ioc.h" #include "../inc/hw_memmap.h" #include "../inc/hw_memmap.h" #include "../inc/hw_types.h" @@ -62,10 +69,16 @@ //***************************************************************************** // -//! Disable all external interrupts +// Disable all external interrupts // //***************************************************************************** -#if defined(__IAR_SYSTEMS_ICC__) +#if defined(DOXYGEN) +uint32_t +CPUcpsid(void) +{ + // This function is written in assembly. See cpu.c for compiler specific implementation. +} +#elif defined(__IAR_SYSTEMS_ICC__) uint32_t CPUcpsid(void) { @@ -88,7 +101,7 @@ CPUcpsid(void) cpsid i; bx lr } -#elif defined(__TI_COMPILER_VERSION__) || defined(DOXYGEN) +#elif defined(__TI_COMPILER_VERSION__) uint32_t CPUcpsid(void) { @@ -111,10 +124,11 @@ CPUcpsid(void) uint32_t ui32Ret; // Read PRIMASK and disable interrupts - __asm(" mrs r0, PRIMASK\n" - " cpsid i\n" - " bx lr\n" - : "=r"(ui32Ret)); + __asm volatile (" mrs %0, PRIMASK\n" + " cpsid i\n" + " bx lr\n" + : "=r"(ui32Ret) + ); // The return is handled in the inline assembly, but the compiler will // still complain if there is not an explicit return here (despite the fact @@ -125,10 +139,16 @@ CPUcpsid(void) #endif //***************************************************************************** // -//! Enable all external interrupts +// Enable all external interrupts // //***************************************************************************** -#if defined(__IAR_SYSTEMS_ICC__) +#if defined(DOXYGEN) +uint32_t +CPUcpsie(void) +{ + // This function is written in assembly. See cpu.c for compiler specific implementation. +} +#elif defined(__IAR_SYSTEMS_ICC__) uint32_t CPUcpsie(void) { @@ -151,7 +171,7 @@ CPUcpsie(void) cpsie i; bx lr } -#elif defined(__TI_COMPILER_VERSION__) || defined(DOXYGEN) +#elif defined(__TI_COMPILER_VERSION__) uint32_t CPUcpsie(void) { @@ -174,10 +194,11 @@ CPUcpsie(void) uint32_t ui32Ret; // Read PRIMASK and enable interrupts. - __asm(" mrs r0, PRIMASK\n" - " cpsie i\n" - " bx lr\n" - : "=r"(ui32Ret)); + __asm volatile (" mrs %0, PRIMASK\n" + " cpsie i\n" + " bx lr\n" + : "=r"(ui32Ret) + ); // The return is handled in the inline assembly, but the compiler will // still complain if there is not an explicit return here (despite the fact @@ -188,14 +209,20 @@ CPUcpsie(void) #endif //***************************************************************************** // -//! Provide a small delay +// Provide a small delay // //***************************************************************************** -#if defined(__IAR_SYSTEMS_ICC__) +#if defined(DOXYGEN) void CPUdelay(uint32_t ui32Count) { - // Delay the specified number of times (3 cycles pr. loop) + // This function is written in assembly. See cpu.c for compiler specific implementation. +} +#elif defined(__IAR_SYSTEMS_ICC__) +void +CPUdelay(uint32_t ui32Count) +{ + // Loop the specified number of times __asm("CPUdelay:\n" " subs r0, #1\n" " bne.n CPUdelay\n" @@ -213,11 +240,11 @@ CPUdel bne CPUdel; bx lr; } -#elif defined(__TI_COMPILER_VERSION__) || defined(DOXYGEN) +#elif defined(__TI_COMPILER_VERSION__) // For CCS implement this function in pure assembly. This prevents the TI // compiler from doing funny things with the optimizer. - // Delay the specified number of times (3 cycles pr. loop) + // Loop the specified number of times __asm(" .sect \".text:CPUdelay\"\n" " .clink\n" " .thumbfunc CPUdelay\n" @@ -228,13 +255,17 @@ __asm(" .sect \".text:CPUdelay\"\n" " bne.n CPUdelay\n" " bx lr\n"); #else +// GCC void __attribute__((naked)) CPUdelay(uint32_t ui32Count) { - // Delay the specified number of times (3 cycles pr. loop) - __asm(" subs r0, #1\n" - " bne CPUdelay\n" - " bx lr"); + // Loop the specified number of times + __asm volatile ("%=: subs %0, #1\n" + " bne %=b\n" + " bx lr\n" + : /* No output */ + : "r" (ui32Count) + ); } #endif @@ -568,13 +599,13 @@ static void SetWriteMode(void); static void TrimForWrite(void); static void SetReadMode(void); -void FlashPowerModeSet(uint32_t ui32PowerMode, uint32_t ui32BankGracePeriode, uint32_t ui32PumpGracePeriode) { +void FlashPowerModeSet(uint32_t ui32PowerMode, uint32_t ui32BankGracePeriod, uint32_t ui32PumpGracePeriod) { // Check the arguments. ASSERT(ui32PowerMode == FLASH_PWR_ACTIVE_MODE || ui32PowerMode == FLASH_PWR_OFF_MODE || ui32PowerMode == FLASH_PWR_DEEP_STDBY_MODE); - ASSERT(ui32BankGracePeriode <= 0xFF); - ASSERT(ui32PumpGracePeriode <= 0xFFFF); + ASSERT(ui32BankGracePeriod <= 0xFF); + ASSERT(ui32PumpGracePeriod <= 0xFFFF); switch(ui32PowerMode) { @@ -590,15 +621,15 @@ void FlashPowerModeSet(uint32_t ui32PowerMode, uint32_t ui32BankGracePeriode, ui break; case FLASH_PWR_OFF_MODE: - // Set bank grace periode. + // Set bank grace period. HWREG(FLASH_BASE + FLASH_O_FBAC) = (HWREG(FLASH_BASE + FLASH_O_FBAC) & (~FLASH_FBAC_BAGP_M)) | - ((ui32BankGracePeriode << FLASH_FBAC_BAGP_S) & FLASH_FBAC_BAGP_M); + ((ui32BankGracePeriod << FLASH_FBAC_BAGP_S) & FLASH_FBAC_BAGP_M); - // Set pump grace periode. + // Set pump grace period. HWREG(FLASH_BASE + FLASH_O_FPAC2) = (HWREG(FLASH_BASE + FLASH_O_FPAC2) & (~FLASH_FPAC2_PAGP_M)) | - ((ui32PumpGracePeriode << FLASH_FPAC2_PAGP_S) & FLASH_FPAC2_PAGP_M); + ((ui32PumpGracePeriod << FLASH_FPAC2_PAGP_S) & FLASH_FPAC2_PAGP_M); // Set bank power mode to SLEEP. HWREG(FLASH_BASE + FLASH_O_FBFALLBACK) &= ~FLASH_FBFALLBACK_BANKPWR0_M; @@ -608,15 +639,15 @@ void FlashPowerModeSet(uint32_t ui32PowerMode, uint32_t ui32BankGracePeriode, ui break; case FLASH_PWR_DEEP_STDBY_MODE: - // Set bank grace periode. + // Set bank grace period. HWREG(FLASH_BASE + FLASH_O_FBAC) = (HWREG(FLASH_BASE + FLASH_O_FBAC) & (~FLASH_FBAC_BAGP_M)) | - ((ui32BankGracePeriode << FLASH_FBAC_BAGP_S) & FLASH_FBAC_BAGP_M); + ((ui32BankGracePeriod << FLASH_FBAC_BAGP_S) & FLASH_FBAC_BAGP_M); - // Set pump grace periode. + // Set pump grace period. HWREG(FLASH_BASE + FLASH_O_FPAC2) = (HWREG(FLASH_BASE + FLASH_O_FPAC2) & (~FLASH_FPAC2_PAGP_M)) | - ((ui32PumpGracePeriode << FLASH_FPAC2_PAGP_S) & FLASH_FPAC2_PAGP_M); + ((ui32PumpGracePeriod << FLASH_FPAC2_PAGP_S) & FLASH_FPAC2_PAGP_M); // Set bank power mode to DEEP STANDBY mode. HWREG(FLASH_BASE + FLASH_O_FBFALLBACK) = @@ -756,6 +787,13 @@ uint32_t FlashProtectionSave(uint32_t ui32SectorAddress) { } uint32_t FlashSectorErase(uint32_t ui32SectorAddress) { + // The below code part constitutes the variant of the FlashSectorErase() + // function that is located in ROM. The source code of this variant is not + // visible in internal or external driverlib. The source code is + // only compiled during a ROM build. + // The two above code parts (seperated by compile switches) constitute wrapper + // functions which both call this ROM variant of the function. + // The ROM variant is called by referrencing it directly through the ROM API table. uint32_t ui32ErrorReturn; uint32_t ui32Error; uint32_t ui32SectorBit; @@ -965,6 +1003,13 @@ uint32_t FlashhOtpEngrErase(void) { } uint32_t FlashProgram(uint8_t *pui8DataBuffer, uint32_t ui32Address, uint32_t ui32Count) { + // The below code part constitutes the variant of the FlashProgram() function + // that is located in ROM. The source code of this variant is not visible in + // internal or external driverlib. The source code is only compiled during a ROM + // build. + // The two above code parts (seperated by compile switches) constitute wrapper + // functions which both call this ROM variant of the function. + // The ROM variant is called by referrencing it directly through the ROM API table. uint32_t ui32StartIndex; uint32_t ui32StopIndex; uint32_t ui32Index; @@ -1345,7 +1390,7 @@ uint32_t FlashProgramEngr(uint8_t *pui8DataBuffer, uint32_t ui32AddressOffset, u // Disable sectors for programming. FlashDisableSectorsForWrite(); - // Reenable OTP protection. + // Re-enable OTP protection. HWREG(FLASH_BASE + FLASH_O_FBPROT) = FLASH_FBPROT_PROTL1DIS; HWREG(FLASH_BASE + FLASH_O_FBAC) &= ~FLASH_FBAC_OTPPROTDIS; HWREG(FLASH_BASE + FLASH_O_FBPROT) = 0; @@ -1384,7 +1429,7 @@ void FlashOtpProgramEraseSetup(void) { } void FlashOtpProgramEraseCleanup(void) { - // Reenable OTP protection. + // Re-enable OTP protection. HWREG(FLASH_BASE + FLASH_O_FBPROT) = FLASH_FBPROT_PROTL1DIS; HWREG(FLASH_BASE + FLASH_O_FBAC) &= ~FLASH_FBAC_OTPPROTDIS; HWREG(FLASH_BASE + FLASH_O_FBPROT) = 0; @@ -1463,9 +1508,9 @@ IssueFsmCommand(tFlashStateCommandsType eCommand) //! This function disables the idle reading power reduction mode, selects the //! flash bank and enables all sectors for erase and programming on the active //! bank. -//! Sectores may be protected from programming depending on the value of the +//! Sectors may be protected from programming depending on the value of the //! FLASH_O_FSM_BSLPx registers. -//! Sectores may be protected from erase depending on the value of the +//! Sectors may be protected from erase depending on the value of the //! FLASH_O_FSM_BSLEx registers. Additional sector erase protection is set by //! the FLASH_O_FSM_SECTOR1 register. //! @@ -1507,35 +1552,39 @@ EnableSectorsForWrite(void) //! Some registers shall be written with a value that is a number of FCLK //! cycles. The trim values controlling these registers have a value of //! number of half us. FCLK = SysClk / ((RWAIT+1) x 2). +//! //! In order to calculate the register value for these registers the //! following calculation must be done: //! -//! OtpValue SysClkMHz -//! -------- us OtpValue x --------- -//! 2 (RWAIT+1) -//! RegValue_in_no_of_clk_cycles = ----------------- = --------------------- -//! 1 4 -//! -------------- -//! SysClkMHz -//! ------------ -//! (RWAIT+1)x 2 +//! OtpValue SysClkMHz +//! -------- us OtpValue x --------- +//! 2 (RWAIT+1) +//! RegValue_in_no_of_clk_cycles = ----------------- = --------------------- +//! 1 4 +//! -------------- +//! SysClkMHz +//! ------------ +//! (RWAIT+1)x 2 //! -//! This is equevivalent to: +//! This is equivalent to: //! -//! 16 x SysClkMHz -//! OtpValue x --------------- -//! (RWAIT+1) -//! RegValue_in_no_of_clk_cycles = ---------------------------- -//! 64 +//! 16 x SysClkMHz +//! OtpValue x --------------- +//! (RWAIT+1) +//! RegValue_in_no_of_clk_cycles = ---------------------------- +//! 64 //! -//! 16 x SysClkMHz -//! A scaling factor is set equal to: ui32FclkScale = -------------- -//! (RWAIT+1) +//! A scaling factor is set equal to: +//! +//! 16 x SysClkMHz +//! ui32FclkScale = -------------- +//! (RWAIT+1) //! //! which gives: -//! OtpValue x ui32FclkScale -//! RegValue_in_no_of_clk_cycles = ------------------------ -//! 64 +//! +//! OtpValue x ui32FclkScale +//! RegValue_in_no_of_clk_cycles = ------------------------ +//! 64 //! //! \return None. // @@ -1569,7 +1618,7 @@ TrimForWrite(void) FLASH_FRDCTL_RWAIT_M) >> FLASH_FRDCTL_RWAIT_S; ui32FclkScale = (16 * FLASH_MODULE_CLK_FREQ) / (ui32RWait + 1); - // Configure Program puls width bits 15:0. + // Configure Program pulse width bits 15:0. // (FCFG1 offset 0x188 bits 15:0). ui32Value = (HWREG(FLASH_CFG_BASE + FCFG1_OFFSET + FCFG1_O_FLASH_PROG_EP) & @@ -1584,7 +1633,7 @@ TrimForWrite(void) ((ui32Value << FLASH_FSM_PRG_PW_PROG_PUL_WIDTH_S) & FLASH_FSM_PRG_PW_PROG_PUL_WIDTH_M); - // Configure Erase puls width bits 31:0. + // Configure Erase pulse width bits 31:0. // (FCFG1 offset 0x18C bits 31:0). ui32Value = (HWREG(FLASH_CFG_BASE + FCFG1_OFFSET + FCFG1_O_FLASH_ERA_PW) & @@ -1699,7 +1748,7 @@ TrimForWrite(void) ((ui32Value << FLASH_FSM_PE_OSU_ERA_OSU_S) & FLASH_FSM_PE_OSU_ERA_OSU_M); - // Confgure Program Verify Setup time + // Configure Program Verify Setup time // (FCFG1 offset 0x170 bits 15:8). ui32Value = (HWREG(FLASH_CFG_BASE + FCFG1_OFFSET + FCFG1_O_FLASH_E_P) & FCFG1_FLASH_E_P_PVSU_M) >> @@ -3422,7 +3471,7 @@ void PRCMPowerDomainOff(uint32_t ui32Domains) { if(ui32Domains & PRCM_DOMAIN_VIMS) { // Write bits ui32Domains[17:16] to the VIMS_MODE alias register. - // (Legal values are 0b00 and 0b10 (PRCM_DOMAIN_VIMS or PRCM_DOMAIN_VIMS_OFF_NO_WAKUP)) + // PRCM_DOMAIN_VIMS sets VIMS_MODE=0b00, PRCM_DOMAIN_VIMS_OFF_NO_WAKEUP sets VIMS_MODE=0b10. ASSERT(!(ui32Domains & 0x00010000)); HWREG(PRCM_BASE + PRCM_O_PDCTL1VIMS ) = ( ui32Domains >> 16 ) & 3; } @@ -3552,6 +3601,12 @@ void PRCMRetentionEnable(uint32_t ui32PowerDomain) { ui32Retention |= PRCM_RAMRETEN_VIMS_M; } + // Enable retention on RFC ULL SRAM. + if(PRCM_DOMAIN_RFCULL_SRAM & ui32PowerDomain) + { + ui32Retention |= PRCM_RAMRETEN_RFCULL_M; + } + // Reconfigure retention. HWREG(PRCM_BASE + PRCM_O_RAMRETEN) = ui32Retention; } @@ -3577,6 +3632,12 @@ void PRCMRetentionDisable(uint32_t ui32PowerDomain) { ui32Retention &= ~PRCM_RAMRETEN_VIMS_M; } + // Disable retention on RFC ULL SRAM. + if(PRCM_DOMAIN_RFCULL_SRAM & ui32PowerDomain) + { + ui32Retention &= ~PRCM_RAMRETEN_RFCULL_M; + } + // Reconfigure retention. HWREG(PRCM_BASE + PRCM_O_RAMRETEN) = ui32Retention; } @@ -4476,19 +4537,6 @@ void VIMSModeSafeSet( uint32_t ui32Base, uint32_t ui32NewMode, bool blocking ) { // First check that it actually is a mode change request if ( ui32NewMode != currentMode ) { - // Due to a hw-problem it is strongly recommended to go via VIMS_MODE_OFF - // when leaving VIMS_MODE_ENABLED (=VIMS_CTL_MODE_CACHE) - // (And no need to go via OFF, if OFF is the final state and will be set later) - if (( currentMode == VIMS_CTL_MODE_CACHE ) && - ( ui32NewMode != VIMS_CTL_MODE_OFF ) ) - { - VIMSModeSet( ui32Base, VIMS_MODE_OFF ); - - while ( HWREGBITW( VIMS_BASE + VIMS_O_STAT, VIMS_STAT_MODE_CHANGING_BITN )) { - // Do nothing - wait for change to complete. - // (Needed blocking point but it takes only some few cycles) - } - } // Set new mode VIMSModeSet( ui32Base, ui32NewMode ); @@ -4501,759 +4549,9 @@ void VIMSModeSafeSet( uint32_t ui32Base, uint32_t ui32NewMode, bool blocking ) { } } -uint32_t CRYPTOAesLoadKey(uint32_t *pui32AesKey, uint32_t ui32KeyLocation) { - // Check the arguments. - ASSERT((ui32KeyLocation == CRYPTO_KEY_AREA_0) | - (ui32KeyLocation == CRYPTO_KEY_AREA_1) | - (ui32KeyLocation == CRYPTO_KEY_AREA_2) | - (ui32KeyLocation == CRYPTO_KEY_AREA_3) | - (ui32KeyLocation == CRYPTO_KEY_AREA_4) | - (ui32KeyLocation == CRYPTO_KEY_AREA_5) | - (ui32KeyLocation == CRYPTO_KEY_AREA_6) | - (ui32KeyLocation == CRYPTO_KEY_AREA_7)); - - // Disable the external interrupt to stop the interrupt form propagating - // from the module to the System CPU. - IntDisable(INT_CRYPTO_RESULT_AVAIL_IRQ); - - // Enable internal interrupts. - HWREG(CRYPTO_BASE + CRYPTO_O_IRQTYPE) = CRYPTO_IRQTYPE_LEVEL; - HWREG(CRYPTO_BASE + CRYPTO_O_IRQEN) = CRYPTO_IRQEN_DMA_IN_DONE | - CRYPTO_IRQEN_RESULT_AVAIL; - - // Configure master control module. - HWREGBITW(CRYPTO_BASE + CRYPTO_O_ALGSEL, CRYPTO_ALGSEL_KEY_STORE_BITN) = 1; - - // Clear any outstanding events. - HWREG(CRYPTO_BASE + CRYPTO_O_IRQCLR) = (CRYPTO_IRQCLR_DMA_IN_DONE | - CRYPTO_IRQCLR_RESULT_AVAIL); - - // Configure key store module for 128 bit operation. - HWREG(CRYPTO_BASE + CRYPTO_O_KEYSIZE) &= ~CRYPTO_KEYSIZE_SIZE_M; - HWREG(CRYPTO_BASE + CRYPTO_O_KEYSIZE) |= KEY_STORE_SIZE_128; - - // Enable keys to write (e.g. Key 0). - HWREG(CRYPTO_BASE + CRYPTO_O_KEYWRITEAREA) = (0x00000001 << ui32KeyLocation); - - // Enable Crypto DMA channel 0. - HWREGBITW(CRYPTO_BASE + CRYPTO_O_DMACH0CTL, CRYPTO_DMACH0CTL_EN_BITN) = 1; - - // Base address of the key in ext. memory. - HWREG(CRYPTO_BASE + CRYPTO_O_DMACH0EXTADDR) = (uint32_t)pui32AesKey; - - // Total key length in bytes (e.g. 16 for 1 x 128-bit key). - // Writing the length of the key enables the DMA operation. - HWREG(CRYPTO_BASE + CRYPTO_O_DMACH0LEN) = KEY_BLENGTH; - - // Wait for the DMA operation to complete. - do - { - CPUdelay(1); - } - while(!(HWREG(CRYPTO_BASE + CRYPTO_O_IRQSTAT) & 0x00000001)); - - // Check for errors in DMA and key store. - if((HWREG(CRYPTO_BASE + CRYPTO_O_IRQSTAT) & - (CRYPTO_IRQSTAT_DMA_BUS_ERR | - CRYPTO_IRQSTAT_KEY_ST_WR_ERR)) == 0) - { - // Acknowledge/clear the interrupt and disable the master control. - HWREG(CRYPTO_BASE + CRYPTO_O_IRQCLR) = (CRYPTO_IRQCLR_DMA_IN_DONE | - CRYPTO_IRQCLR_RESULT_AVAIL); - HWREG(CRYPTO_BASE + CRYPTO_O_ALGSEL) = 0x00000000; - - // Check status, if error return error code. - if(HWREG(CRYPTO_BASE + CRYPTO_O_KEYWRITTENAREA) != (0x00000001 << ui32KeyLocation)) - { - return (AES_KEYSTORE_READ_ERROR); - } - } - - // Return success. - return (AES_SUCCESS); -} - -uint32_t CRYPTOAesCbc(uint32_t *pui32MsgIn, uint32_t *pui32MsgOut, uint32_t ui32MsgLength, uint32_t *pui32Nonce, uint32_t ui32KeyLocation, bool bEncrypt, bool bIntEnable) { - uint32_t ui32CtrlVal; - - // Enable internal interrupts. - HWREG(CRYPTO_BASE + CRYPTO_O_IRQTYPE) = CRYPTO_IRQTYPE_LEVEL; - HWREG(CRYPTO_BASE + CRYPTO_O_IRQEN) = CRYPTO_IRQEN_RESULT_AVAIL; - - // Clear any outstanding interrupts. - HWREG(CRYPTO_BASE + CRYPTO_O_IRQCLR) = (CRYPTO_IRQCLR_DMA_IN_DONE | - CRYPTO_IRQCLR_RESULT_AVAIL); - - // Wait for interrupt lines from module to be cleared - while(HWREG(CRYPTO_BASE + CRYPTO_O_IRQSTAT) & (CRYPTO_IRQSTAT_DMA_IN_DONE | CRYPTO_IRQSTAT_RESULT_AVAIL)); - - // If using interrupts clear any pending interrupts and enable interrupts - // for the Crypto module. - if(bIntEnable) - { - IntPendClear(INT_CRYPTO_RESULT_AVAIL_IRQ); - IntEnable(INT_CRYPTO_RESULT_AVAIL_IRQ); - } - - // Configure Master Control module. - HWREG(CRYPTO_BASE + CRYPTO_O_ALGSEL) = CRYPTO_ALGSEL_AES; - - // Enable keys to read (e.g. Key 0). - HWREG(CRYPTO_BASE + CRYPTO_O_KEYREADAREA) = ui32KeyLocation; - - //Wait until key is loaded to the AES module. - do - { - CPUdelay(1); - } - while((HWREG(CRYPTO_BASE + CRYPTO_O_KEYREADAREA) & CRYPTO_KEYREADAREA_BUSY)); - - // Check for Key store Read error. - if((HWREG(CRYPTO_BASE + CRYPTO_O_IRQSTAT)& CRYPTO_KEY_ST_RD_ERR)) - { - return (AES_KEYSTORE_READ_ERROR); - } - - // Write initialization vector. - HWREG(CRYPTO_BASE + CRYPTO_O_AESIV0) = pui32Nonce[0]; - HWREG(CRYPTO_BASE + CRYPTO_O_AESIV1) = pui32Nonce[1]; - HWREG(CRYPTO_BASE + CRYPTO_O_AESIV2) = pui32Nonce[2]; - HWREG(CRYPTO_BASE + CRYPTO_O_AESIV3) = pui32Nonce[3]; - - // Configure AES engine for AES-CBC with 128-bit key size. - ui32CtrlVal = (CRYPTO_AESCTL_SAVE_CONTEXT | CRYPTO_AESCTL_CBC); - if(bEncrypt) - { - ui32CtrlVal |= CRYPTO_AES128_ENCRYPT; - } - else - { - ui32CtrlVal |= CRYPTO_AES128_DECRYPT; - } - HWREG(CRYPTO_BASE + CRYPTO_O_AESCTL) = ui32CtrlVal; - - // Write the length of the crypto block (plain text). - // Low and high part (high part is assumed to be always 0). - HWREG(CRYPTO_BASE + CRYPTO_O_AESDATALEN0) = ui32MsgLength; - HWREG(CRYPTO_BASE + CRYPTO_O_AESDATALEN1) = 0; - HWREG(CRYPTO_BASE + CRYPTO_O_AESAUTHLEN) = 0; - - // Enable Crypto DMA channel 0. - HWREGBITW(CRYPTO_BASE + CRYPTO_O_DMACH0CTL, CRYPTO_DMACH0CTL_EN_BITN) = 1; - - // Base address of the input data in ext. memory. - HWREG(CRYPTO_BASE + CRYPTO_O_DMACH0EXTADDR) = (uint32_t)pui32MsgIn; - - // Input data length in bytes, equal to the message. - HWREG(CRYPTO_BASE + CRYPTO_O_DMACH0LEN) = ui32MsgLength; - - // Enable Crypto DMA channel 1. - HWREGBITW(CRYPTO_BASE + CRYPTO_O_DMACH1CTL, CRYPTO_DMACH1CTL_EN_BITN) = 1; - - // Set up the address and length of the output data. - HWREG(CRYPTO_BASE + CRYPTO_O_DMACH1EXTADDR) = (uint32_t)pui32MsgOut; - HWREG(CRYPTO_BASE + CRYPTO_O_DMACH1LEN) = ui32MsgLength; - - // Return success - return AES_SUCCESS; -} - -uint32_t CRYPTOAesCbcStatus(void) { - return(CRYPTOAesEcbStatus()); -} - -uint32_t CRYPTOAesEcb(uint32_t *pui32MsgIn, uint32_t *pui32MsgOut, uint32_t ui32KeyLocation, bool bEncrypt, bool bIntEnable) { - // Enable internal interrupts. - HWREG(CRYPTO_BASE + CRYPTO_O_IRQTYPE) = CRYPTO_IRQTYPE_LEVEL; - HWREG(CRYPTO_BASE + CRYPTO_O_IRQEN) = CRYPTO_IRQEN_RESULT_AVAIL; - - // Clear any outstanding interrupts. - HWREG(CRYPTO_BASE + CRYPTO_O_IRQCLR) = (CRYPTO_IRQCLR_DMA_IN_DONE | - CRYPTO_IRQCLR_RESULT_AVAIL); - - // Wait for interrupt lines from module to be cleared - while(HWREG(CRYPTO_BASE + CRYPTO_O_IRQSTAT) & (CRYPTO_IRQSTAT_DMA_IN_DONE | CRYPTO_IRQSTAT_RESULT_AVAIL)); - - // If using interrupts clear any pending interrupts and enable interrupts - // for the Crypto module. - if(bIntEnable) - { - IntPendClear(INT_CRYPTO_RESULT_AVAIL_IRQ); - IntEnable(INT_CRYPTO_RESULT_AVAIL_IRQ); - } - - // Configure Master Control module. - HWREG(CRYPTO_BASE + CRYPTO_O_ALGSEL) = CRYPTO_ALGSEL_AES; - - // Enable keys to read (e.g. Key 0). - HWREG(CRYPTO_BASE + CRYPTO_O_KEYREADAREA) = ui32KeyLocation; - - //Wait until key is loaded to the AES module. - do - { - CPUdelay(1); - } - while((HWREG(CRYPTO_BASE + CRYPTO_O_KEYREADAREA) & CRYPTO_KEYREADAREA_BUSY)); - - // Check for Key store Read error. - if((HWREG(CRYPTO_BASE + CRYPTO_O_IRQSTAT)& CRYPTO_KEY_ST_RD_ERR)) - { - return (AES_KEYSTORE_READ_ERROR); - } - - // Configure AES engine (program AES-ECB-128 encryption and no - // initialization vector - IV). - if(bEncrypt) - { - HWREG(CRYPTO_BASE + CRYPTO_O_AESCTL) = CRYPTO_AES128_ENCRYPT; - } - else - { - HWREG(CRYPTO_BASE + CRYPTO_O_AESCTL) = CRYPTO_AES128_DECRYPT; - } - - // Write the length of the data. - HWREG(CRYPTO_BASE + CRYPTO_O_AESDATALEN0) = AES_ECB_LENGTH; - HWREG(CRYPTO_BASE + CRYPTO_O_AESDATALEN1) = 0; - - // Enable Crypto DMA channel 0. - HWREGBITW(CRYPTO_BASE + CRYPTO_O_DMACH0CTL, CRYPTO_DMACH0CTL_EN_BITN) = 1; - - // Base address of the input data in ext. memory. - HWREG(CRYPTO_BASE + CRYPTO_O_DMACH0EXTADDR) = (uint32_t)pui32MsgIn; - - // Input data length in bytes, equal to the message. - HWREG(CRYPTO_BASE + CRYPTO_O_DMACH0LEN) = AES_ECB_LENGTH; - - // Enable Crypto DMA channel 1. - HWREGBITW(CRYPTO_BASE + CRYPTO_O_DMACH1CTL, CRYPTO_DMACH1CTL_EN_BITN) = 1; - - // Set up the address and length of the output data. - HWREG(CRYPTO_BASE + CRYPTO_O_DMACH1EXTADDR) = (uint32_t)pui32MsgOut; - HWREG(CRYPTO_BASE + CRYPTO_O_DMACH1LEN) = AES_ECB_LENGTH; - - // Return success - return AES_SUCCESS; -} - -uint32_t CRYPTOAesEcbStatus(void) { - uint32_t ui32Status; - - // Get the current DMA status. - ui32Status = HWREG(CRYPTO_BASE + CRYPTO_O_DMASTAT); - - // Check if DMA is still busy. - if(ui32Status & CRYPTO_DMA_BSY) - { - return (AES_DMA_BSY); - } - - // Check the status of the DMA operation - return error if not success. - if(ui32Status & CRYPTO_DMA_BUS_ERROR) - { - return (AES_DMA_BUS_ERROR); - } - - // Operation successful - disable interrupt and return success. - IntDisable(INT_CRYPTO_RESULT_AVAIL_IRQ); - return (AES_SUCCESS); -} - -uint32_t CRYPTOCcmAuthEncrypt(bool bEncrypt, uint32_t ui32AuthLength , uint32_t *pui32Nonce, uint32_t *pui32PlainText, uint32_t ui32PlainTextLength, uint32_t *pui32Header, uint32_t ui32HeaderLength, uint32_t ui32KeyLocation, uint32_t ui32FieldLength, bool bIntEnable) { - uint32_t ui32CtrlVal; - uint32_t i; - uint32_t *pui32CipherText; - union { - uint32_t w[4]; - uint8_t b[16]; - } ui8InitVec; - - // Input address for the encryption engine is the same as the output. - pui32CipherText = pui32PlainText; - - // Disable global interrupt, enable local interrupt and clear any pending - // interrupts. - IntDisable(INT_CRYPTO_RESULT_AVAIL_IRQ); - HWREG(CRYPTO_BASE + CRYPTO_O_IRQCLR) = (CRYPTO_IRQCLR_DMA_IN_DONE | - CRYPTO_IRQCLR_RESULT_AVAIL); - - // Enable internal interrupts. - HWREG(CRYPTO_BASE + CRYPTO_O_IRQTYPE) = CRYPTO_IRQTYPE_LEVEL; - HWREG(CRYPTO_BASE + CRYPTO_O_IRQEN) = CRYPTO_IRQEN_DMA_IN_DONE | - CRYPTO_IRQEN_RESULT_AVAIL; - - // Configure master control module for AES operation. - HWREG(CRYPTO_BASE + CRYPTO_O_ALGSEL) = CRYPTO_ALGSEL_AES; - - // Enable keys to read (e.g. Key 0). - HWREG(CRYPTO_BASE + CRYPTO_O_KEYREADAREA) = ui32KeyLocation; - - // Wait until key is loaded to the AES module. - do - { - CPUdelay(1); - } - while((HWREG(CRYPTO_BASE + CRYPTO_O_KEYREADAREA) & CRYPTO_KEYREADAREA_BUSY)); - - // Check for Key store Read error. - if((HWREG(CRYPTO_BASE + CRYPTO_O_IRQSTAT)& CRYPTO_KEY_ST_RD_ERR)) - { - return (AES_KEYSTORE_READ_ERROR); - } - - // Prepare the initialization vector (IV), - // Length of Nonce l(n) = 15 - ui32FieldLength. - ui8InitVec.b[0] = ui32FieldLength - 1; - for(i = 0; i < 12; i++) - { - ui8InitVec.b[i + 1] = ((uint8_t*)pui32Nonce)[i]; - } - if(ui32FieldLength == 2) - { - ui8InitVec.b[13] = ((uint8_t*)pui32Nonce)[12]; - } - else - { - ui8InitVec.b[13] = 0; - } - ui8InitVec.b[14] = 0; - ui8InitVec.b[15] = 0; - - // Write initialization vector. - HWREG(CRYPTO_BASE + CRYPTO_O_AESIV0) = ui8InitVec.w[0]; - HWREG(CRYPTO_BASE + CRYPTO_O_AESIV1) = ui8InitVec.w[1]; - HWREG(CRYPTO_BASE + CRYPTO_O_AESIV2) = ui8InitVec.w[2]; - HWREG(CRYPTO_BASE + CRYPTO_O_AESIV3) = ui8InitVec.w[3]; - - // Configure AES engine. - ui32CtrlVal = ((ui32FieldLength - 1) << CRYPTO_AESCTL_CCM_L_S); - if ( ui32AuthLength >= 2 ) { - ui32CtrlVal |= ((( ui32AuthLength - 2 ) >> 1 ) << CRYPTO_AESCTL_CCM_M_S ); - } - ui32CtrlVal |= CRYPTO_AESCTL_CCM; - ui32CtrlVal |= CRYPTO_AESCTL_CTR; - ui32CtrlVal |= CRYPTO_AESCTL_SAVE_CONTEXT; - ui32CtrlVal |= (KEY_STORE_SIZE_128 << CRYPTO_AESCTL_KEY_SIZE_S); - ui32CtrlVal |= (1 << CRYPTO_AESCTL_DIR_S); - ui32CtrlVal |= (CRYPTO_AES_CTR_128 << CRYPTO_AESCTL_CTR_WIDTH_S); - - // Write the configuration for 128 bit AES-CCM. - HWREG(CRYPTO_BASE + CRYPTO_O_AESCTL) = ui32CtrlVal; - - // Write the length of the crypto block (plain text). - // Low and high part (high part is assumed to be always 0). - HWREG(CRYPTO_BASE + CRYPTO_O_AESDATALEN0) = ui32PlainTextLength; - HWREG(CRYPTO_BASE + CRYPTO_O_AESDATALEN1) = 0; - - // Write the length of the header field. - // Also called AAD - Additional Authentication Data. - HWREG(CRYPTO_BASE + CRYPTO_O_AESAUTHLEN) = ui32HeaderLength; - - // Check if any header information (AAD). - // If so configure the DMA controller to fetch the header. - if(ui32HeaderLength != 0) - { - // Enable DMA channel 0. - HWREGBITW(CRYPTO_BASE + CRYPTO_O_DMACH0CTL, CRYPTO_DMACH0CTL_EN_BITN) = 1; - - // Register the base address of the header (AAD). - HWREG(CRYPTO_BASE + CRYPTO_O_DMACH0EXTADDR) = (uint32_t)pui32Header; - - // Header length in bytes (may be non-block size aligned). - HWREG(CRYPTO_BASE + CRYPTO_O_DMACH0LEN) = ui32HeaderLength; - - // Wait for completion of the header data transfer, DMA_IN_DONE. - do - { - CPUdelay(1); - } - while(!(HWREG(CRYPTO_BASE + CRYPTO_O_IRQSTAT) & CRYPTO_IRQSTAT_DMA_IN_DONE)); - - // Check for DMA errors. - if(HWREG(CRYPTO_BASE + CRYPTO_O_IRQSTAT) & CRYPTO_DMA_BUS_ERR) - { - return AES_DMA_BUS_ERROR; - } - } - - // Clear interrupt status. - HWREG(CRYPTO_BASE + CRYPTO_O_IRQCLR) = (CRYPTO_IRQCLR_DMA_IN_DONE | - CRYPTO_IRQCLR_RESULT_AVAIL); - - // Wait for interrupt lines from module to be cleared - while(HWREG(CRYPTO_BASE + CRYPTO_O_IRQSTAT) & (CRYPTO_IRQSTAT_DMA_IN_DONE | CRYPTO_IRQSTAT_RESULT_AVAIL)); - - // Disable CRYPTO_IRQEN_DMA_IN_DONE interrupt as we only - // want interrupt to trigger once RESULT_AVAIL occurs. - HWREG(CRYPTO_BASE + CRYPTO_O_IRQEN) &= ~CRYPTO_IRQEN_DMA_IN_DONE; - - - // Is using interrupts enable globally. - if(bIntEnable) - { - IntPendClear(INT_CRYPTO_RESULT_AVAIL_IRQ); - IntEnable(INT_CRYPTO_RESULT_AVAIL_IRQ); - } - - // Enable interrupts locally. - HWREG(CRYPTO_BASE + CRYPTO_O_IRQEN) = CRYPTO_IRQEN_RESULT_AVAIL; - - // Perform encryption if requested. - if(bEncrypt) - { - // Enable DMA channel 0 - HWREGBITW(CRYPTO_BASE + CRYPTO_O_DMACH0CTL, CRYPTO_DMACH0CTL_EN_BITN) = 1; - - // base address of the payload data in ext. memory. - HWREG(CRYPTO_BASE + CRYPTO_O_DMACH0EXTADDR) = - (uint32_t)pui32PlainText; - - // Enable DMA channel 1 - HWREGBITW(CRYPTO_BASE + CRYPTO_O_DMACH1CTL, CRYPTO_DMACH1CTL_EN_BITN) = 1; - - // Base address of the output data buffer. - HWREG(CRYPTO_BASE + CRYPTO_O_DMACH1EXTADDR) = - (uint32_t)pui32CipherText; - - // Payload data length in bytes, equal to the plaintext length. - HWREG(CRYPTO_BASE + CRYPTO_O_DMACH0LEN) = ui32PlainTextLength; - // Output data length in bytes, equal to the plaintext length. - HWREG(CRYPTO_BASE + CRYPTO_O_DMACH1LEN) = ui32PlainTextLength; - } - - return AES_SUCCESS; -} - -uint32_t CRYPTOCcmAuthEncryptStatus(void) { - uint32_t ui32Status; - - // Get the current DMA status. - ui32Status = HWREG(CRYPTO_BASE + CRYPTO_O_DMASTAT); - - // Check if DMA is still busy. - if(ui32Status & CRYPTO_DMA_BSY) - { - return (AES_DMA_BSY); - } - - // Check the status of the DMA operation - return error if not success. - if(ui32Status & CRYPTO_DMA_BUS_ERROR) - { - return (AES_DMA_BUS_ERROR); - } - - // Operation successful - disable interrupt and return success. - IntDisable(INT_CRYPTO_RESULT_AVAIL_IRQ); - return (AES_SUCCESS); -} - -uint32_t CRYPTOCcmAuthEncryptResultGet(uint32_t ui32TagLength, uint32_t *pui32CcmTag) { - uint32_t volatile ui32Tag[4]; - uint32_t ui32Idx; - - // Result has already been copied to the output buffer by DMA - // Disable master control. - HWREG(CRYPTO_BASE + CRYPTO_O_ALGSEL) = 0x00000000; - - // Read tag - wait for the context ready bit. - do - { - CPUdelay(1); - } - while(!(HWREG(CRYPTO_BASE + CRYPTO_O_AESCTL) & - CRYPTO_AESCTL_SAVED_CONTEXT_RDY)); - - // Read the Tag registers. - ui32Tag[0] = HWREG(CRYPTO_BASE + CRYPTO_O_AESTAGOUT0); - ui32Tag[1] = HWREG(CRYPTO_BASE + CRYPTO_O_AESTAGOUT1); - ui32Tag[2] = HWREG(CRYPTO_BASE + CRYPTO_O_AESTAGOUT2); - ui32Tag[3] = HWREG(CRYPTO_BASE + CRYPTO_O_AESTAGOUT3); - - for(ui32Idx = 0; ui32Idx < ui32TagLength ; ui32Idx++) - { - *((uint8_t*)pui32CcmTag + ui32Idx) = *((uint8_t*)ui32Tag + ui32Idx); - } - - // Operation successful - clear interrupt status. - HWREG(CRYPTO_BASE + CRYPTO_O_IRQCLR) = (CRYPTO_IRQCLR_DMA_IN_DONE | - CRYPTO_IRQCLR_RESULT_AVAIL); - return AES_SUCCESS; -} - -uint32_t CRYPTOCcmInvAuthDecrypt(bool bDecrypt, uint32_t ui32AuthLength, uint32_t *pui32Nonce, uint32_t *pui32CipherText, uint32_t ui32CipherTextLength, uint32_t *pui32Header, uint32_t ui32HeaderLength, uint32_t ui32KeyLocation, uint32_t ui32FieldLength, bool bIntEnable) { - uint32_t ui32CtrlVal; - uint32_t i; - uint32_t *pui32PlainText; - uint32_t ui32CryptoBlockLength; - union { - uint32_t w[4]; - uint8_t b[16]; - } ui8InitVec; - - // Input address for the encryption engine is the same as the output. - pui32PlainText = pui32CipherText; - - // Disable global interrupt, enable local interrupt and clear any pending. - // interrupts. - IntDisable(INT_CRYPTO_RESULT_AVAIL_IRQ); - HWREG(CRYPTO_BASE + CRYPTO_O_IRQCLR) = (CRYPTO_IRQCLR_DMA_IN_DONE | - CRYPTO_IRQCLR_RESULT_AVAIL); - // Enable internal interrupts. - HWREG(CRYPTO_BASE + CRYPTO_O_IRQTYPE) = CRYPTO_IRQTYPE_LEVEL; - HWREG(CRYPTO_BASE + CRYPTO_O_IRQEN) = CRYPTO_IRQEN_DMA_IN_DONE | - CRYPTO_IRQEN_RESULT_AVAIL; - - // Configure master control module for AES operation. - HWREG(CRYPTO_BASE + CRYPTO_O_ALGSEL) = CRYPTO_ALGSEL_AES; - - // Enable keys to read (e.g. Key 0). - HWREG(CRYPTO_BASE + CRYPTO_O_KEYREADAREA) = ui32KeyLocation; - - // Wait until key is loaded to the AES module. - do - { - CPUdelay(1); - } - while((HWREG(CRYPTO_BASE + CRYPTO_O_KEYREADAREA) & CRYPTO_KEYREADAREA_BUSY)); - - // Check for Key store Read error. - if((HWREG(CRYPTO_BASE + CRYPTO_O_IRQSTAT)& CRYPTO_KEY_ST_RD_ERR)) - { - return (AES_KEYSTORE_READ_ERROR); - } - - // Prepare the initialization vector (IV), - // Length of Nonce l(n) = 15 - ui32FieldLength. - ui8InitVec.b[0] = ui32FieldLength - 1; - for(i = 0; i < 12; i++) - { - ui8InitVec.b[i + 1] = ((uint8_t*)pui32Nonce)[i]; - } - if(ui32FieldLength == 2) - { - ui8InitVec.b[13] = ((uint8_t*)pui32Nonce)[12]; - } - else - { - ui8InitVec.b[13] = 0; - } - ui8InitVec.b[14] = 0; - ui8InitVec.b[15] = 0; - - // Write initialization vector. - HWREG(CRYPTO_BASE + CRYPTO_O_AESIV0) = ui8InitVec.w[0]; - HWREG(CRYPTO_BASE + CRYPTO_O_AESIV1) = ui8InitVec.w[1]; - HWREG(CRYPTO_BASE + CRYPTO_O_AESIV2) = ui8InitVec.w[2]; - HWREG(CRYPTO_BASE + CRYPTO_O_AESIV3) = ui8InitVec.w[3]; - - // Configure AES engine - ui32CryptoBlockLength = ui32CipherTextLength - ui32AuthLength; - ui32CtrlVal = ((ui32FieldLength - 1) << CRYPTO_AESCTL_CCM_L_S); - if ( ui32AuthLength >= 2 ) { - ui32CtrlVal |= ((( ui32AuthLength - 2 ) >> 1 ) << CRYPTO_AESCTL_CCM_M_S ); - } - ui32CtrlVal |= CRYPTO_AESCTL_CCM; - ui32CtrlVal |= CRYPTO_AESCTL_CTR; - ui32CtrlVal |= CRYPTO_AESCTL_SAVE_CONTEXT; - ui32CtrlVal |= (KEY_STORE_SIZE_128 << CRYPTO_AESCTL_KEY_SIZE_S); - ui32CtrlVal |= (0 << CRYPTO_AESCTL_DIR_S); - ui32CtrlVal |= (CRYPTO_AES_CTR_128 << CRYPTO_AESCTL_CTR_WIDTH_S); - - // Write the configuration for 128 bit AES-CCM. - HWREG(CRYPTO_BASE + CRYPTO_O_AESCTL) = ui32CtrlVal; - - // Write the length of the crypto block (plain text). - // Low and high part (high part is assumed to be always 0). - HWREG(CRYPTO_BASE + CRYPTO_O_AESDATALEN0) = ui32CryptoBlockLength; - HWREG(CRYPTO_BASE + CRYPTO_O_AESDATALEN1) = 0; - - // Write the length of the header field. - // Also called AAD - Additional Authentication Data. - HWREG(CRYPTO_BASE + CRYPTO_O_AESAUTHLEN) = ui32HeaderLength; - - // Check if any header information (AAD). - // If so configure the DMA controller to fetch the header. - if(ui32HeaderLength != 0) - { - // Enable DMA channel 0. - HWREGBITW(CRYPTO_BASE + CRYPTO_O_DMACH0CTL, CRYPTO_DMACH0CTL_EN_BITN) = 1; - - // Register the base address of the header (AAD). - HWREG(CRYPTO_BASE + CRYPTO_O_DMACH0EXTADDR) = (uint32_t)pui32Header; - - // Header length in bytes (may be non-block size aligned). - HWREG(CRYPTO_BASE + CRYPTO_O_DMACH0LEN) = ui32HeaderLength; - - // Wait for completion of the header data transfer, DMA_IN_DONE. - do - { - CPUdelay(1); - } - while(!(HWREG(CRYPTO_BASE + CRYPTO_O_IRQSTAT) & CRYPTO_IRQSTAT_DMA_IN_DONE)); - - // Check for DMA errors. - if(HWREG(CRYPTO_BASE + CRYPTO_O_IRQSTAT) & CRYPTO_DMA_BUS_ERR) - { - return AES_DMA_BUS_ERROR; - } - } - - // Clear interrupt status. - HWREG(CRYPTO_BASE + CRYPTO_O_IRQCLR) = (CRYPTO_IRQCLR_DMA_IN_DONE | - CRYPTO_IRQCLR_RESULT_AVAIL); - - // Wait for interrupt lines from module to be cleared - while(HWREG(CRYPTO_BASE + CRYPTO_O_IRQSTAT) & (CRYPTO_IRQSTAT_DMA_IN_DONE | CRYPTO_IRQSTAT_RESULT_AVAIL)); - - // Disable CRYPTO_IRQEN_DMA_IN_DONE interrupt as we only - // want interrupt to trigger once RESULT_AVAIL occurs. - HWREG(CRYPTO_BASE + CRYPTO_O_IRQEN) &= ~CRYPTO_IRQEN_DMA_IN_DONE; - - // Is using interrupts - clear and enable globally. - if(bIntEnable) - { - IntPendClear(INT_CRYPTO_RESULT_AVAIL_IRQ); - IntEnable(INT_CRYPTO_RESULT_AVAIL_IRQ); - } - - // Enable internal interrupts. - HWREG(CRYPTO_BASE + CRYPTO_O_IRQTYPE) = CRYPTO_IRQTYPE_LEVEL; - HWREG(CRYPTO_BASE + CRYPTO_O_IRQEN) = CRYPTO_IRQEN_RESULT_AVAIL; - - // Perform decryption if requested. - if(bDecrypt) - { - // Configure the DMA controller - enable both DMA channels. - HWREGBITW(CRYPTO_BASE + CRYPTO_O_DMACH0CTL, CRYPTO_DMACH0CTL_EN_BITN) = 1; - - // Base address of the payload data in ext. memory. - HWREG(CRYPTO_BASE + CRYPTO_O_DMACH0EXTADDR) = - (uint32_t)pui32CipherText; - - // Payload data length in bytes, equal to the cipher text length. - HWREG(CRYPTO_BASE + CRYPTO_O_DMACH0LEN) = ui32CryptoBlockLength; - - // Enable DMA channel 1. - HWREGBITW(CRYPTO_BASE + CRYPTO_O_DMACH1CTL, CRYPTO_DMACH1CTL_EN_BITN) = 1; - - // Base address of the output data buffer. - HWREG(CRYPTO_BASE + CRYPTO_O_DMACH1EXTADDR) = - (uint32_t)pui32PlainText; - - // Output data length in bytes, equal to the cipher text length. - HWREG(CRYPTO_BASE + CRYPTO_O_DMACH1LEN) = ui32CryptoBlockLength; - } - - return AES_SUCCESS; -} - -uint32_t CRYPTOCcmInvAuthDecryptStatus(void) { - uint32_t ui32Status; - - // Get the current DMA status. - ui32Status = HWREG(CRYPTO_BASE + CRYPTO_O_DMASTAT); - - // Check if DMA is still busy. - if(ui32Status & CRYPTO_DMA_BSY) - { - return (AES_DMA_BSY); - } - - // Check the status of the DMA operation - return error if not success. - if(ui32Status & CRYPTO_DMA_BUS_ERROR) - { - return (AES_DMA_BUS_ERROR); - } - - // Operation successful - disable interrupt and return success - IntDisable(INT_CRYPTO_RESULT_AVAIL_IRQ); - return (AES_SUCCESS); -} - -uint32_t CRYPTOCcmInvAuthDecryptResultGet(uint32_t ui32AuthLength, uint32_t *pui32CipherText, uint32_t ui32CipherTextLength, uint32_t *pui32CcmTag) { - uint32_t volatile ui32Tag[4]; - uint32_t ui32TagIndex; - uint32_t i; - uint32_t ui32Idx; - - ui32TagIndex = ui32CipherTextLength - ui32AuthLength; - - // Result has already been copied to the output buffer by DMA - // Disable master control. - HWREG(CRYPTO_BASE + CRYPTO_O_ALGSEL) = 0x00000000; - - // Read tag - wait for the context ready bit. - do - { - CPUdelay(1); - } - while(!(HWREG(CRYPTO_BASE + CRYPTO_O_AESCTL) & - CRYPTO_AESCTL_SAVED_CONTEXT_RDY)); - - // Read the Tag registers. - ui32Tag[0] = HWREG(CRYPTO_BASE + CRYPTO_O_AESTAGOUT0); - ui32Tag[1] = HWREG(CRYPTO_BASE + CRYPTO_O_AESTAGOUT1); - ui32Tag[2] = HWREG(CRYPTO_BASE + CRYPTO_O_AESTAGOUT2); - ui32Tag[3] = HWREG(CRYPTO_BASE + CRYPTO_O_AESTAGOUT3); - - for(ui32Idx = 0; ui32Idx < ui32AuthLength ; ui32Idx++) - { - *((uint8_t*)pui32CcmTag + ui32Idx) = *((uint8_t*)ui32Tag + ui32Idx); - } - - // Operation successful - clear interrupt status. - HWREG(CRYPTO_BASE + CRYPTO_O_IRQCLR) = (CRYPTO_IRQCLR_DMA_IN_DONE | - CRYPTO_IRQCLR_RESULT_AVAIL); - - // Verify the Tag. - for(i = 0; i < ui32AuthLength; i++) - { - if(*((uint8_t *)pui32CcmTag + i) != - (*((uint8_t *)pui32CipherText + ui32TagIndex + i))) - { - return CCM_AUTHENTICATION_FAILED; - } - } - - return AES_SUCCESS; -} - -void CRYPTODmaEnable(uint32_t ui32Channels) { - // Check the arguments. - ASSERT((ui32Channels & CRYPTO_DMA_CHAN0) | - (ui32Channels & CRYPTO_DMA_CHAN1)); - - // Enable the selected channels, - if(ui32Channels & CRYPTO_DMA_CHAN0) - { - HWREGBITW(CRYPTO_BASE + CRYPTO_O_DMACH0CTL, CRYPTO_DMACH0CTL_EN_BITN) = 1; - } - if(ui32Channels & CRYPTO_DMA_CHAN1) - { - HWREGBITW(CRYPTO_BASE + CRYPTO_O_DMACH1CTL, CRYPTO_DMACH1CTL_EN_BITN) = 1; - } -} - -void CRYPTODmaDisable(uint32_t ui32Channels) { - // Check the arguments. - ASSERT((ui32Channels & CRYPTO_DMA_CHAN0) | - (ui32Channels & CRYPTO_DMA_CHAN1)); - - // Enable the selected channels. - if(ui32Channels & CRYPTO_DMA_CHAN0) - { - HWREGBITW(CRYPTO_BASE + CRYPTO_O_DMACH0CTL, CRYPTO_DMACH0CTL_EN_BITN) = 0; - } - if(ui32Channels & CRYPTO_DMA_CHAN1) - { - HWREGBITW(CRYPTO_BASE + CRYPTO_O_DMACH1CTL, CRYPTO_DMACH1CTL_EN_BITN) = 0; - } -} - void OSCClockSourceSet(uint32_t ui32SrcClk, uint32_t ui32Osc) { // Check the arguments. ASSERT((ui32SrcClk & OSC_SRC_CLK_LF) || - (ui32SrcClk & OSC_SRC_CLK_MF) || (ui32SrcClk & OSC_SRC_CLK_HF)); ASSERT((ui32Osc == OSC_RCOSC_HF) || (ui32Osc == OSC_RCOSC_LF) || @@ -5270,15 +4568,6 @@ void OSCClockSourceSet(uint32_t ui32SrcClk, uint32_t ui32Osc) { ui32Osc); } - // Configure the medium frequency source clock - if(ui32SrcClk & OSC_SRC_CLK_MF) - { - DDI16BitfieldWrite(AUX_DDI0_OSC_BASE, DDI_0_OSC_O_CTL0, - DDI_0_OSC_CTL0_SCLK_MF_SRC_SEL_M, - DDI_0_OSC_CTL0_SCLK_MF_SRC_SEL_S, - ui32Osc); - } - // Configure the low frequency source clock. if(ui32SrcClk & OSC_SRC_CLK_LF) { @@ -5393,6 +4682,10 @@ void AUXADCDisable(void) { // Ensure that scaling is enabled by default before next use of the ADC ADI8BitsClear(AUX_ADI4_BASE, ADI_4_AUX_O_ADC1, ADI_4_AUX_ADC1_SCALE_DIS_M); + // Flush the FIFO before disabling the clocks + HWREGBITW(AUX_ANAIF_BASE + AUX_ANAIF_O_ADCCTL, 1) = 1; // CMD: EN(1) -> FLUSH(3) + HWREGBITW(AUX_ANAIF_BASE + AUX_ANAIF_O_ADCCTL, 1) = 0; // CMD: FLUSH(3) -> EN(1) + // Disable the ADC clock (no need to wait since IOB_WUC_ADCCLKCTL_ACK goes low immediately) HWREG(AUX_SYSIF_BASE + AUX_SYSIF_O_ADCCLKCTL) = 0; @@ -5598,12 +4891,16 @@ void SysCtrl_DCDC_VoltageConditionalControl( void ) { } uint32_t SysCtrlResetSourceGet( void ) { - if ( HWREG( AON_PMCTL_BASE + AON_PMCTL_O_RESETCTL ) & AON_PMCTL_RESETCTL_WU_FROM_SD_M ) { - return ( RSTSRC_WAKEUP_FROM_SHUTDOWN ); + uint32_t aonPmctlResetCtl = HWREG( AON_PMCTL_BASE + AON_PMCTL_O_RESETCTL ); + + if ( aonPmctlResetCtl & AON_PMCTL_RESETCTL_WU_FROM_SD_M ) { + if ( aonPmctlResetCtl & AON_PMCTL_RESETCTL_GPIO_WU_FROM_SD_M ) { + return ( RSTSRC_WAKEUP_FROM_SHUTDOWN ); + } else { + return ( RSTSRC_WAKEUP_FROM_TCK_NOISE ); + } } else { - return (( HWREG( AON_PMCTL_BASE + AON_PMCTL_O_RESETCTL ) & - AON_PMCTL_RESETCTL_RESET_SRC_M ) >> - AON_PMCTL_RESETCTL_RESET_SRC_S ) ; + return (( aonPmctlResetCtl & AON_PMCTL_RESETCTL_RESET_SRC_M ) >> AON_PMCTL_RESETCTL_RESET_SRC_S ); } } @@ -5624,34 +4921,71 @@ int32_t AONBatMonTemperatureGetDegC( void ) { return ((( signedTemp - tempCorrection ) + 0x80 ) >> 8 ); } -// We need intrinsic functions for IAR (if used in source code) -#ifdef __IAR_SYSTEMS_ICC__ -#include -#endif + +void SetupStepVddrTrimTo( uint32_t toCode ) { + uint32_t pmctlResetctl_reg ; + int32_t targetTrim ; + int32_t currentTrim ; + + targetTrim = SetupSignExtendVddrTrimValue( toCode & ( ADI_3_REFSYS_DCDCCTL0_VDDR_TRIM_M >> ADI_3_REFSYS_DCDCCTL0_VDDR_TRIM_S )); + currentTrim = SetupSignExtendVddrTrimValue(( + HWREGB( ADI3_BASE + ADI_3_REFSYS_O_DCDCCTL0 ) & + ADI_3_REFSYS_DCDCCTL0_VDDR_TRIM_M ) >> + ADI_3_REFSYS_DCDCCTL0_VDDR_TRIM_S ) ; + + if ( targetTrim != currentTrim ) { + pmctlResetctl_reg = ( HWREG( AON_PMCTL_BASE + AON_PMCTL_O_RESETCTL ) & ~AON_PMCTL_RESETCTL_MCU_WARM_RESET_M ); + if ( pmctlResetctl_reg & AON_PMCTL_RESETCTL_VDDR_LOSS_EN_M ) { + HWREG( AON_PMCTL_BASE + AON_PMCTL_O_RESETCTL ) = ( pmctlResetctl_reg & ~AON_PMCTL_RESETCTL_VDDR_LOSS_EN_M ); + HWREG( AON_RTC_BASE + AON_RTC_O_SYNC ); // Wait for VDDR_LOSS_EN setting to propagate + } + + while ( targetTrim != currentTrim ) { + HWREG( AON_RTC_BASE + AON_RTC_O_SYNCLF ); // Wait for next edge on SCLK_LF (positive or negative) + + if ( targetTrim > currentTrim ) currentTrim++; + else currentTrim--; + + HWREGB( ADI3_BASE + ADI_3_REFSYS_O_DCDCCTL0 ) = ( + ( HWREGB( ADI3_BASE + ADI_3_REFSYS_O_DCDCCTL0 ) & ~ADI_3_REFSYS_DCDCCTL0_VDDR_TRIM_M ) | + ((((uint32_t)currentTrim) << ADI_3_REFSYS_DCDCCTL0_VDDR_TRIM_S ) & + ADI_3_REFSYS_DCDCCTL0_VDDR_TRIM_M ) ); + } + + HWREG( AON_RTC_BASE + AON_RTC_O_SYNCLF ); // Wait for next edge on SCLK_LF (positive or negative) + + if ( pmctlResetctl_reg & AON_PMCTL_RESETCTL_VDDR_LOSS_EN_M ) { + HWREG( AON_RTC_BASE + AON_RTC_O_SYNCLF ); // Wait for next edge on SCLK_LF (positive or negative) + HWREG( AON_RTC_BASE + AON_RTC_O_SYNCLF ); // Wait for next edge on SCLK_LF (positive or negative) + HWREG( AON_PMCTL_BASE + AON_PMCTL_O_RESETCTL ) = pmctlResetctl_reg; + HWREG( AON_RTC_BASE + AON_RTC_O_SYNC ); // And finally wait for VDDR_LOSS_EN setting to propagate + } + } +} void SetupAfterColdResetWakeupFromShutDownCfg1( uint32_t ccfg_ModeConfReg ) { - int32_t i32VddrSleepTrim; - int32_t i32VddrSleepDelta; - + // Check for CC1352 boost mode + // The combination VDDR_EXT_LOAD=0 and VDDS_BOD_LEVEL=1 is defined to select boost mode + if ((( ccfg_ModeConfReg & CCFG_MODE_CONF_VDDR_EXT_LOAD ) == 0 ) && + (( ccfg_ModeConfReg & CCFG_MODE_CONF_VDDS_BOD_LEVEL ) != 0 ) ) { - i32VddrSleepTrim = SetupSignExtendVddrTrimValue(( - HWREG( FCFG1_BASE + FCFG1_O_LDO_TRIM ) & - FCFG1_LDO_TRIM_VDDR_TRIM_SLEEP_M ) >> - FCFG1_LDO_TRIM_VDDR_TRIM_SLEEP_S ) ; - } + // Set VDDS_BOD trim - using masked write {MASK8:DATA8} + // - TRIM_VDDS_BOD is bits[7:3] of ADI3..REFSYSCTL1 + // - Needs a positive transition on BOD_BG_TRIM_EN (bit[7] of REFSYSCTL3) to + // latch new VDDS BOD. Set to 0 first to guarantee a positive transition. + HWREGB( ADI3_BASE + ADI_O_CLR + ADI_3_REFSYS_O_REFSYSCTL3 ) = ADI_3_REFSYS_REFSYSCTL3_BOD_BG_TRIM_EN; + // + // VDDS_BOD_LEVEL = 1 means that boost mode is selected + // - Max out the VDDS_BOD trim (=VDDS_BOD_POS_31) + HWREGH( ADI3_BASE + ADI_O_MASK8B + ( ADI_3_REFSYS_O_REFSYSCTL1 * 2 )) = + ( ADI_3_REFSYS_REFSYSCTL1_TRIM_VDDS_BOD_M << 8 ) | + ( ADI_3_REFSYS_REFSYSCTL1_TRIM_VDDS_BOD_POS_31 ) ; + HWREGB( ADI3_BASE + ADI_O_SET + ADI_3_REFSYS_O_REFSYSCTL3 ) = ADI_3_REFSYS_REFSYSCTL3_BOD_BG_TRIM_EN; - // Adjust the VDDR_TRIM_SLEEP value with value adjustable by customer (CCFG_MODE_CONF_VDDR_TRIM_SLEEP_DELTA) - // Read and sign extend VddrSleepDelta (in range -8 to +7) - i32VddrSleepDelta = ((((int32_t)ccfg_ModeConfReg ) - << ( 32 - CCFG_MODE_CONF_VDDR_TRIM_SLEEP_DELTA_W - CCFG_MODE_CONF_VDDR_TRIM_SLEEP_DELTA_S )) - >> ( 32 - CCFG_MODE_CONF_VDDR_TRIM_SLEEP_DELTA_W )); - // Calculate new VDDR sleep trim - i32VddrSleepTrim = ( i32VddrSleepTrim + i32VddrSleepDelta + 1 ); - if ( i32VddrSleepTrim > 21 ) i32VddrSleepTrim = 21; - if ( i32VddrSleepTrim < -10 ) i32VddrSleepTrim = -10; - // Write adjusted value using MASKED write (MASK8) - HWREGH( ADI3_BASE + ADI_O_MASK8B + ( ADI_3_REFSYS_O_DCDCCTL1 * 2 )) = (( ADI_3_REFSYS_DCDCCTL1_VDDR_TRIM_SLEEP_M << 8 ) | - (( i32VddrSleepTrim << ADI_3_REFSYS_DCDCCTL1_VDDR_TRIM_SLEEP_S ) & ADI_3_REFSYS_DCDCCTL1_VDDR_TRIM_SLEEP_M )); + SetupStepVddrTrimTo(( HWREG( FCFG1_BASE + FCFG1_O_VOLT_TRIM ) & + FCFG1_VOLT_TRIM_VDDR_TRIM_HH_M ) >> + FCFG1_VOLT_TRIM_VDDR_TRIM_HH_S ) ; + } // 1. // Do not allow DCDC to be enabled if in external regulator mode. @@ -5709,7 +5043,7 @@ void SetupAfterColdResetWakeupFromShutDownCfg2( uint32_t ui32Fcfg1Revision, uint DDI32RegWrite(AUX_DDI0_OSC_BASE, DDI_0_OSC_O_AMPCOMPTH2, ui32Trim); ui32Trim = SetupGetTrimForAmpcompTh1(); DDI32RegWrite(AUX_DDI0_OSC_BASE, DDI_0_OSC_O_AMPCOMPTH1, ui32Trim); -#if ( CCFG_BASE == 0x50003000 ) +#if ( CCFG_BASE == CCFG_BASE_DEFAULT ) ui32Trim = SetupGetTrimForAmpcompCtrl( ui32Fcfg1Revision ); #else ui32Trim = NOROM_SetupGetTrimForAmpcompCtrl( ui32Fcfg1Revision ); @@ -5770,21 +5104,20 @@ void SetupAfterColdResetWakeupFromShutDownCfg2( uint32_t ui32Fcfg1Revision, uint ui32Trim = SetupGetTrimForRadcExtCfg(ui32Fcfg1Revision); DDI32RegWrite(AUX_DDI0_OSC_BASE, DDI_0_OSC_O_RADCEXTCFG, ui32Trim); - // Setting FORCE_KICKSTART_EN (ref. CC26_V1_BUG00261). Should also be done for PG2 - // (This is bit 22 in DDI_0_OSC_O_CTL0) - HWREG( AUX_DDI0_OSC_BASE + DDI_O_SET + DDI_0_OSC_O_CTL0 ) = DDI_0_OSC_CTL0_FORCE_KICKSTART_EN; } void SetupAfterColdResetWakeupFromShutDownCfg3( uint32_t ccfg_ModeConfReg ) { uint32_t fcfg1OscConf; uint32_t ui32Trim; +#if ( ! defined( SKIP_SCLK_LF_SRC_CHANGE )) uint32_t currentHfClock; uint32_t ccfgExtLfClk; +#endif - // Examin the XOSC_FREQ field to select 0x1=HPOSC, 0x2=48MHz XOSC, 0x3=24MHz XOSC + // Examine the XOSC_FREQ field to select 0x1=HPOSC, 0x2=48MHz XOSC, 0x3=24MHz XOSC switch (( ccfg_ModeConfReg & CCFG_MODE_CONF_XOSC_FREQ_M ) >> CCFG_MODE_CONF_XOSC_FREQ_S ) { case 2 : - // XOSC source is a 48 MHz xtal + // XOSC source is a 48 MHz crystal // Do nothing (since this is the reset setting) break; case 1 : @@ -5821,14 +5154,14 @@ void SetupAfterColdResetWakeupFromShutDownCfg3( uint32_t ccfg_ModeConfReg ) { } // Not a HPOSC chip - fall through to default default : - // XOSC source is a 24 MHz xtal (default) + // XOSC source is a 24 MHz crystal (default) // Set bit DDI_0_OSC_CTL0_XTAL_IS_24M (this is bit 31 in DDI_0_OSC_O_CTL0) HWREG( AUX_DDI0_OSC_BASE + DDI_O_SET + DDI_0_OSC_O_CTL0 ) = DDI_0_OSC_CTL0_XTAL_IS_24M; break; } // Set XOSC_HF in bypass mode if CCFG is configured for external TCXO - // Please note that it is up to the custommer to make sure that the external clock source is up and running before XOSC_HF can be used. + // Please note that it is up to the customer to make sure that the external clock source is up and running before XOSC_HF can be used. if (( HWREG( CCFG_BASE + CCFG_O_SIZE_AND_DIS_FLAGS ) & CCFG_SIZE_AND_DIS_FLAGS_DIS_TCXO ) == 0 ) { HWREG( AUX_DDI0_OSC_BASE + DDI_O_SET + DDI_0_OSC_O_XOSCHFCTL ) = DDI_0_OSC_XOSCHFCTL_BYPASS; } @@ -5841,11 +5174,21 @@ void SetupAfterColdResetWakeupFromShutDownCfg3( uint32_t ccfg_ModeConfReg ) { ui32Trim = SetupGetTrimForXoscHfFastStart(); HWREGB( AUX_DDI0_OSC_BASE + DDI_O_MASK4B + ( DDI_0_OSC_O_CTL1 * 2 )) = ( 0x30 | ui32Trim ); +#if ( defined( SKIP_SCLK_LF_SRC_CHANGE )) + // If SKIP_SCLK_LF_SRC_CHANGE is defined we will skip the switch-statement below, and + // remain on RCOSCHFDLF as LF source (since RCOSCHFDLF is the reset setting). + // (RCOSCHFDLF = Low frequency clock derived from RCOSC_HF). + // Note1: Function SetupAfterColdResetWakeupFromShutDownCfg3() is a ROM function in some devices (R2 and Agama) + // It must be removed from rom.h on these devices in order to avoid that the ROM version is called. + // Note2: It's not possible to enter STANDBY when running the LF clock from RCOSCHFDLF, however IDLE will work just fine. + // RCOSCHFDLF (RCOSC_HF/1536) -> SCLK_LF (=31250 Hz) + SetupSetAonRtcSubSecInc( 0x8637BD ); // RTC_INCREMENT = 2^38 / frequency +#else // setup the LF clock based upon CCFG:MODE_CONF:SCLK_LF_OPTION switch (( ccfg_ModeConfReg & CCFG_MODE_CONF_SCLK_LF_OPTION_M ) >> CCFG_MODE_CONF_SCLK_LF_OPTION_S ) { - case 0 : // XOSC_HF_DLF (XOSCHF/1536) -> SCLK_LF (=31250Hz) + case 0 : // XOSC_HF_DLF (XOSCHF/1536) -> SCLK_LF (=31250 Hz) OSCClockSourceSet( OSC_SRC_CLK_LF, OSC_XOSC_HF ); - SetupSetAonRtcSubSecInc( 0x8637BD ); + SetupSetAonRtcSubSecInc( 0x8637BD ); // RTC_INCREMENT = 2^38 / frequency break; case 1 : // EXTERNAL signal -> SCLK_LF (frequency=2^38/CCFG_EXT_LF_CLK_RTC_INCREMENT) // Set SCLK_LF to use the same source as SCLK_HF @@ -5860,7 +5203,7 @@ void SetupAfterColdResetWakeupFromShutDownCfg3( uint32_t ccfg_ModeConfReg ) { IOCPortConfigureSet(( ccfgExtLfClk & CCFG_EXT_LF_CLK_DIO_M ) >> CCFG_EXT_LF_CLK_DIO_S, IOC_PORT_AON_CLK32K, IOC_STD_INPUT | IOC_HYST_ENABLE ); // Route external clock to AON IOC w/hysteresis - // Set XOSC_LF in bypass mode to allow external 32k clock + // Set XOSC_LF in bypass mode to allow external 32 kHz clock HWREG( AUX_DDI0_OSC_BASE + DDI_O_SET + DDI_0_OSC_O_CTL0 ) = DDI_0_OSC_CTL0_XOSC_LF_DIG_BYPASS; // Fall through to set XOSC_LF as SCLK_LF source case 2 : // XOSC_LF -> SLCK_LF (32768 Hz) @@ -5870,6 +5213,7 @@ void SetupAfterColdResetWakeupFromShutDownCfg3( uint32_t ccfg_ModeConfReg ) { OSCClockSourceSet( OSC_SRC_CLK_LF, OSC_RCOSC_LF ); break; } +#endif // ( ! defined( SKIP_SCLK_LF_SRC_CHANGE )) // Update ADI_4_AUX_ADCREF1_VTRIM with value from FCFG1 HWREGB( AUX_ADI4_BASE + ADI_4_AUX_O_ADCREF1 ) = @@ -5878,12 +5222,6 @@ void SetupAfterColdResetWakeupFromShutDownCfg3( uint32_t ccfg_ModeConfReg ) { ADI_4_AUX_ADCREF1_VTRIM_S ) & ADI_4_AUX_ADCREF1_VTRIM_M ); - // Set ADI_4_AUX:ADC0.SMPL_CYCLE_EXP to it's default minimum value (=3) - // (Note: Using MASK8B requires that the bits to be modified must be within the same - // byte boundary which is the case for the ADI_4_AUX_ADC0_SMPL_CYCLE_EXP field) - HWREGH( AUX_ADI4_BASE + ADI_O_MASK8B + ( ADI_4_AUX_O_ADC0 * 2 )) = - ( ADI_4_AUX_ADC0_SMPL_CYCLE_EXP_M << 8 ) | ( 3 << ADI_4_AUX_ADC0_SMPL_CYCLE_EXP_S ); - // Sync with AON SysCtrlAonSync(); } @@ -5892,7 +5230,6 @@ uint32_t SetupGetTrimForAnabypassValue1( uint32_t ccfg_ModeConfReg ) { uint32_t ui32Fcfg1Value ; uint32_t ui32XoscHfRow ; uint32_t ui32XoscHfCol ; - int32_t i32CustomerDeltaAdjust ; uint32_t ui32TrimValue ; // Use device specific trim values located in factory configuration @@ -5908,15 +5245,16 @@ uint32_t SetupGetTrimForAnabypassValue1( uint32_t ccfg_ModeConfReg ) { FCFG1_CONFIG_OSC_TOP_XOSC_HF_COLUMN_Q12_M ) >> FCFG1_CONFIG_OSC_TOP_XOSC_HF_COLUMN_Q12_S ); - i32CustomerDeltaAdjust = 0; if (( ccfg_ModeConfReg & CCFG_MODE_CONF_XOSC_CAP_MOD ) == 0 ) { // XOSC_CAP_MOD = 0 means: CAP_ARRAY_DELTA is in use -> Apply compensation // XOSC_CAPARRAY_DELTA is located in bit[15:8] of ccfg_ModeConfReg // Note: HW_REV_DEPENDENT_IMPLEMENTATION. Field width is not given by - // a define and sign extension must therefore be hardcoded. + // a define and sign extension must therefore be hard coded. // ( A small test program is created verifying the code lines below: // Ref.: ..\test\small_standalone_test_programs\CapArrayDeltaAdjust_test.c) - i32CustomerDeltaAdjust = ((int32_t)ccfg_ModeConfReg << 16 ) >> 24; + int32_t i32CustomerDeltaAdjust = + (((int32_t)( ccfg_ModeConfReg << ( 32 - CCFG_MODE_CONF_XOSC_CAPARRAY_DELTA_W - CCFG_MODE_CONF_XOSC_CAPARRAY_DELTA_S ))) + >> ( 32 - CCFG_MODE_CONF_XOSC_CAPARRAY_DELTA_W )); while ( i32CustomerDeltaAdjust < 0 ) { ui32XoscHfCol >>= 1; // COL 1 step down @@ -6064,20 +5402,24 @@ uint32_t SetupGetTrimForAmpcompCtrl( uint32_t ui32Fcfg1Revision ) { modeConf1 = HWREG( CCFG_BASE + CCFG_O_MODE_CONF_1 ); // Both fields are signed 4-bit values. This is an assumption when doing the sign extension. - deltaAdjust = ((int32_t)modeConf1 << ( 32 - CCFG_MODE_CONF_1_DELTA_IBIAS_OFFSET_S - 4 )) >> 28; + deltaAdjust = + (((int32_t)( modeConf1 << ( 32 - CCFG_MODE_CONF_1_DELTA_IBIAS_OFFSET_W - CCFG_MODE_CONF_1_DELTA_IBIAS_OFFSET_S ))) + >> ( 32 - CCFG_MODE_CONF_1_DELTA_IBIAS_OFFSET_W )); deltaAdjust += (int32_t)ibiasOffset; if ( deltaAdjust < 0 ) { - deltaAdjust = 0; + deltaAdjust = 0; } if ( deltaAdjust > ( DDI_0_OSC_AMPCOMPCTL_IBIAS_OFFSET_M >> DDI_0_OSC_AMPCOMPCTL_IBIAS_OFFSET_S )) { deltaAdjust = ( DDI_0_OSC_AMPCOMPCTL_IBIAS_OFFSET_M >> DDI_0_OSC_AMPCOMPCTL_IBIAS_OFFSET_S ); } ibiasOffset = (uint32_t)deltaAdjust; - deltaAdjust = ((int32_t)modeConf1 << ( 32 - CCFG_MODE_CONF_1_DELTA_IBIAS_INIT_S - 4 )) >> 28; + deltaAdjust = + (((int32_t)( modeConf1 << ( 32 - CCFG_MODE_CONF_1_DELTA_IBIAS_INIT_W - CCFG_MODE_CONF_1_DELTA_IBIAS_INIT_S ))) + >> ( 32 - CCFG_MODE_CONF_1_DELTA_IBIAS_INIT_W )); deltaAdjust += (int32_t)ibiasInit; if ( deltaAdjust < 0 ) { - deltaAdjust = 0; + deltaAdjust = 0; } if ( deltaAdjust > ( DDI_0_OSC_AMPCOMPCTL_IBIAS_INIT_M >> DDI_0_OSC_AMPCOMPCTL_IBIAS_INIT_S )) { deltaAdjust = ( DDI_0_OSC_AMPCOMPCTL_IBIAS_INIT_M >> DDI_0_OSC_AMPCOMPCTL_IBIAS_INIT_S ); @@ -6252,8 +5594,13 @@ void SetupSetCacheModeAccordingToCcfgSetting( void ) { // Note that Mode=0 is equal to MODE_GPRAM vimsCtlMode0 = (( HWREG( VIMS_BASE + VIMS_O_CTL ) & ~VIMS_CTL_MODE_M ) | VIMS_CTL_DYN_CG_EN_M | VIMS_CTL_PREF_EN_M ); -#if defined( DO_NOT_ENABLE_CACHE_IN_TRIM_DEVICE ) +#if ( defined( DO_NOT_ENABLE_CACHE_IN_TRIM_DEVICE )) + #if ( defined( CODE_IN_FLASH )) + // Enable cache (and hence disable GPRAM) + HWREG( VIMS_BASE + VIMS_O_CTL ) = ( vimsCtlMode0 | VIMS_CTL_MODE_CACHE ); + #else HWREG( VIMS_BASE + VIMS_O_CTL ) = vimsCtlMode0; + #endif #else if ( HWREG( CCFG_BASE + CCFG_O_SIZE_AND_DIS_FLAGS ) & CCFG_SIZE_AND_DIS_FLAGS_DIS_GPRAM ) { @@ -6349,3 +5696,1901 @@ void PowerCtrlSourceSet(uint32_t ui32PowerConfig) { PRCMMcuUldoConfigure(true); } } + +void AESSetInitializationVector(const uint32_t *initializationVector) { + // Write initialization vector to the aes registers + HWREG(CRYPTO_BASE + CRYPTO_O_AESIV0) = initializationVector[0]; + HWREG(CRYPTO_BASE + CRYPTO_O_AESIV1) = initializationVector[1]; + HWREG(CRYPTO_BASE + CRYPTO_O_AESIV2) = initializationVector[2]; + HWREG(CRYPTO_BASE + CRYPTO_O_AESIV3) = initializationVector[3]; +} + +void AESStartDMAOperation(const uint8_t *channel0Addr, uint32_t channel0Length, uint8_t *channel1Addr, uint32_t channel1Length) { + if (channel0Length && channel0Addr) { + // We actually want to perform an operation. Clear any outstanding events. + HWREG(CRYPTO_BASE + CRYPTO_O_IRQCLR) = CRYPTO_IRQCLR_RESULT_AVAIL_M | CRYPTO_IRQEN_DMA_IN_DONE_M; // This might need AES_IRQEN_DMA_IN_DONE as well + + while(HWREG(CRYPTO_BASE + CRYPTO_O_IRQSTAT) & (CRYPTO_IRQSTAT_DMA_IN_DONE_M | CRYPTO_IRQSTAT_RESULT_AVAIL_M)); + + // Configure the DMA controller - enable both DMA channels. + HWREGBITW(CRYPTO_BASE + CRYPTO_O_DMACH0CTL, CRYPTO_DMACH0CTL_EN_BITN) = 1; + + // Base address of the payload data in ext. memory. + HWREG(CRYPTO_BASE + CRYPTO_O_DMACH0EXTADDR) = (uint32_t)channel0Addr; + + // Payload data length in bytes, equal to the cipher text length. + HWREG(CRYPTO_BASE + CRYPTO_O_DMACH0LEN) = channel0Length; + } + + if (channel1Length && channel1Addr) { + // Enable DMA channel 1. + HWREGBITW(CRYPTO_BASE + CRYPTO_O_DMACH1CTL, CRYPTO_DMACH1CTL_EN_BITN) = 1; + + // Base address of the output data buffer. + HWREG(CRYPTO_BASE + CRYPTO_O_DMACH1EXTADDR) = (uint32_t)channel1Addr; + + // Output data length in bytes, equal to the cipher text length. + HWREG(CRYPTO_BASE + CRYPTO_O_DMACH1LEN) = channel1Length; + } +} + +uint32_t AESWaitForIRQFlags(uint32_t irqFlags) { + uint32_t irqTrigger = 0; + // Wait for the DMA operation to complete. Add a delay to make sure we are + // not flooding the bus with requests too much. + do { + CPUdelay(1); + } + while(!(HWREG(CRYPTO_BASE + CRYPTO_O_IRQSTAT) & irqFlags & (CRYPTO_IRQSTAT_DMA_IN_DONE_M | + CRYPTO_IRQSTAT_RESULT_AVAIL_M | + CRYPTO_IRQSTAT_DMA_BUS_ERR_M | + CRYPTO_IRQSTAT_KEY_ST_WR_ERR_M))); + + // Save the IRQ trigger source + irqTrigger = HWREG(CRYPTO_BASE + CRYPTO_O_IRQSTAT) & irqFlags; + + // Clear IRQ flags + HWREG(CRYPTO_BASE + CRYPTO_O_IRQCLR) = irqTrigger; + + return irqTrigger; +} + +uint32_t AESWriteToKeyStore(const uint8_t *aesKey, uint32_t aesKeyLength, uint32_t keyStoreArea) { + // Check the arguments. + ASSERT((keyStoreArea == AES_KEY_AREA_0) || + (keyStoreArea == AES_KEY_AREA_1) || + (keyStoreArea == AES_KEY_AREA_2) || + (keyStoreArea == AES_KEY_AREA_3) || + (keyStoreArea == AES_KEY_AREA_4) || + (keyStoreArea == AES_KEY_AREA_5) || + (keyStoreArea == AES_KEY_AREA_6) || + (keyStoreArea == AES_KEY_AREA_7)); + + ASSERT((aesKeyLength == AES_128_KEY_LENGTH_BYTES) || + (aesKeyLength == AES_192_KEY_LENGTH_BYTES) || + (aesKeyLength == AES_256_KEY_LENGTH_BYTES)); + + uint32_t keySize = 0; + + switch (aesKeyLength) { + case AES_128_KEY_LENGTH_BYTES: + keySize = CRYPTO_KEYSIZE_SIZE_128_BIT; + break; + case AES_192_KEY_LENGTH_BYTES: + keySize = CRYPTO_KEYSIZE_SIZE_192_BIT; + break; + case AES_256_KEY_LENGTH_BYTES: + keySize = CRYPTO_KEYSIZE_SIZE_256_BIT; + break; + } + + // Clear any previously written key at the keyLocation + AESInvalidateKey(keyStoreArea); + + // Disable the external interrupt to stop the interrupt form propagating + // from the module to the System CPU. + IntDisable(INT_CRYPTO_RESULT_AVAIL_IRQ); + + // Enable internal interrupts. + HWREG(CRYPTO_BASE + CRYPTO_O_IRQTYPE) = CRYPTO_IRQTYPE_LEVEL_M; + HWREG(CRYPTO_BASE + CRYPTO_O_IRQEN) = CRYPTO_IRQEN_DMA_IN_DONE_M | CRYPTO_IRQEN_RESULT_AVAIL_M; + + // Configure master control module. + HWREG(CRYPTO_BASE + CRYPTO_O_ALGSEL) = CRYPTO_ALGSEL_KEY_STORE; + + // Clear any outstanding events. + HWREG(CRYPTO_BASE + CRYPTO_O_IRQCLR) = (CRYPTO_IRQCLR_DMA_IN_DONE | CRYPTO_IRQCLR_RESULT_AVAIL); + + // Configure the size of keys contained within the key store + // Do not write to the register if the correct key size is already set. + // Writing to this register causes all current keys to be invalidated. + uint32_t keyStoreKeySize = HWREG(CRYPTO_BASE + CRYPTO_O_KEYSIZE); + if (keySize != keyStoreKeySize) { + HWREG(CRYPTO_BASE + CRYPTO_O_KEYSIZE) = keySize; + } + + // Enable key to write (e.g. Key 0). + HWREG(CRYPTO_BASE + CRYPTO_O_KEYWRITEAREA) = 1 << keyStoreArea; + + // Total key length in bytes (16 for 1 x 128-bit key and 32 for 1 x 256-bit key). + AESStartDMAOperation(aesKey, aesKeyLength, 0, 0); + + // Wait for the DMA operation to complete. + uint32_t irqTrigger = AESWaitForIRQFlags(CRYPTO_IRQCLR_RESULT_AVAIL | CRYPTO_IRQCLR_DMA_IN_DONE | CRYPTO_IRQSTAT_DMA_BUS_ERR | CRYPTO_IRQSTAT_KEY_ST_WR_ERR); + + // Re-enable interrupts globally. + IntPendClear(INT_CRYPTO_RESULT_AVAIL_IRQ); + IntEnable(INT_CRYPTO_RESULT_AVAIL_IRQ); + + // If we had a bus error or the key is not in the CRYPTO_O_KEYWRITTENAREA, return an error. + if ((irqTrigger & (CRYPTO_IRQSTAT_DMA_BUS_ERR_M | CRYPTO_IRQSTAT_KEY_ST_WR_ERR_M)) || !(HWREG(CRYPTO_BASE + CRYPTO_O_KEYWRITTENAREA) & (1 << keyStoreArea))) { + // There was an error in writing to the keyStore. + return AES_KEYSTORE_ERROR; + } + else { + return AES_SUCCESS; + } +} + +uint32_t AESReadFromKeyStore(uint32_t keyStoreArea) { + // Check the arguments. + ASSERT((keyStoreArea == AES_KEY_AREA_0) || + (keyStoreArea == AES_KEY_AREA_1) || + (keyStoreArea == AES_KEY_AREA_2) || + (keyStoreArea == AES_KEY_AREA_3) || + (keyStoreArea == AES_KEY_AREA_4) || + (keyStoreArea == AES_KEY_AREA_5) || + (keyStoreArea == AES_KEY_AREA_6) || + (keyStoreArea == AES_KEY_AREA_7)); + + // Check if there is a valid key in the specified keyStoreArea + if (!(HWREG(CRYPTO_BASE + CRYPTO_O_KEYWRITTENAREA) & (1 << keyStoreArea))) { + return AES_KEYSTORE_AREA_INVALID; + } + + // Enable keys to read (e.g. Key 0). + HWREG(CRYPTO_BASE + CRYPTO_O_KEYREADAREA) = keyStoreArea; + + // Wait until key is loaded to the AES module. + // We cannot simply poll the IRQ status as only an error is communicated through + // the IRQ status and not the completion of the transfer. + do { + CPUdelay(1); + } + while((HWREG(CRYPTO_BASE + CRYPTO_O_KEYREADAREA) & CRYPTO_KEYREADAREA_BUSY_M)); + + // Check for keyStore read error. + if((HWREG(CRYPTO_BASE + CRYPTO_O_IRQSTAT) & CRYPTO_IRQSTAT_KEY_ST_RD_ERR_M)) { + return AES_KEYSTORE_ERROR; + } + else { + return AES_SUCCESS; + } +} + +uint32_t AESReadTag(uint8_t *tag, uint32_t tagLength) { + // The intermediate array is used instead of a caller-provided one + // to enable a simple API with no unintuitive alignment or size requirements. + // This is a trade-off of stack-depth vs ease-of-use that came out on the + // ease-of-use side. + uint32_t computedTag[AES_BLOCK_SIZE / sizeof(uint32_t)]; + + // Wait until the computed tag is ready. + while (!(HWREG(CRYPTO_BASE + CRYPTO_O_AESCTL) & CRYPTO_AESCTL_SAVED_CONTEXT_RDY_M)); + + // Read computed tag out from the HW registers + // Need to read out all 128 bits in four reads to correctly clear CRYPTO_AESCTL_SAVED_CONTEXT_RDY flag + computedTag[0] = HWREG(CRYPTO_BASE + CRYPTO_O_AESTAGOUT0); + computedTag[1] = HWREG(CRYPTO_BASE + CRYPTO_O_AESTAGOUT1); + computedTag[2] = HWREG(CRYPTO_BASE + CRYPTO_O_AESTAGOUT2); + computedTag[3] = HWREG(CRYPTO_BASE + CRYPTO_O_AESTAGOUT3); + + memcpy(tag, computedTag, tagLength); + + return AES_SUCCESS; +} + +uint32_t AESVerifyTag(const uint8_t *tag, uint32_t tagLength) { + uint32_t resultStatus; + // The intermediate array is allocated on the stack to ensure users do not + // point the tag they provide and the one computed at the same location. + // That would cause memcmp to compare an array against itself. We could add + // a check that verifies that the arrays are not the same. If we did that and + // modified AESReadTag to just copy all 128 bits into a provided array, + // we could save 16 bytes of stack space while making the API much more + // complicated. + uint8_t computedTag[AES_BLOCK_SIZE]; + + resultStatus = AESReadTag(computedTag, tagLength); + + if (resultStatus != AES_SUCCESS) { + return resultStatus; + } + + resultStatus = memcmp(computedTag, tag, tagLength); + + if (resultStatus != 0) { + return AES_TAG_VERIFICATION_FAILED; + } + + return AES_SUCCESS; +} + +void AESConfigureCCMCtrl(uint32_t nonceLength, uint32_t macLength, bool encrypt) { + uint32_t ctrlVal = 0; + + ctrlVal = ((15 - nonceLength - 1) << CRYPTO_AESCTL_CCM_L_S); + if ( macLength >= 2 ) { + ctrlVal |= ((( macLength - 2 ) >> 1 ) << CRYPTO_AESCTL_CCM_M_S ); + } + ctrlVal |= CRYPTO_AESCTL_CCM | + CRYPTO_AESCTL_CTR | + CRYPTO_AESCTL_SAVE_CONTEXT | + CRYPTO_AESCTL_CTR_WIDTH_128_BIT; + ctrlVal |= encrypt ? CRYPTO_AESCTL_DIR : 0; + + AESSetCtrl(ctrlVal); +} + +void AESWriteCCMInitializationVector(const uint8_t *nonce, uint32_t nonceLength) { + union { + uint32_t word[4]; + uint8_t byte[16]; + } initializationVector = {{0}}; + + initializationVector.byte[0] = 15 - nonceLength - 1; + + memcpy(&(initializationVector.byte[1]), nonce, nonceLength); + + AESSetInitializationVector(initializationVector.word); +} + + +#define MAX(x,y) (((x) > (y)) ? (x) : (y)) +#define MIN(x,y) (((x) < (y)) ? (x) : (y)) +#define INRANGE(x,y,z) ((x) > (y) && (x) < (z)) + + +//***************************************************************************** +// +// Define for the maximum curve size supported by the PKA module in 32 bit +// word. +// \note PKA hardware module can support up to 384 bit curve size due to the +// 2K of PKA RAM. +// +//***************************************************************************** +#define PKA_MAX_CURVE_SIZE_32_BIT_WORD 12 + +//***************************************************************************** +// +// Define for the maximum length of the big number supported by the PKA module +// in 32 bit word. +// +//***************************************************************************** +#define PKA_MAX_LEN_IN_32_BIT_WORD PKA_MAX_CURVE_SIZE_32_BIT_WORD + +//***************************************************************************** +// +// Used in PKAWritePkaParam() and PKAWritePkaParamExtraOffset() to specify that +// the base address of the parameter should not be written to a NPTR register. +// +//***************************************************************************** +#define PKA_NO_POINTER_REG 0xFF + +//***************************************************************************** +// +// NIST P224 constants in little endian format. byte[0] is the least +// significant byte and byte[NISTP224_PARAM_SIZE_BYTES - 1] is the most +// significant. +// +//***************************************************************************** +const PKA_EccPoint224 NISTP224_generator = { + .x = {.byte = {0x21, 0x1D, 0x5C, 0x11, 0xD6, 0x80, 0x32, 0x34, + 0x22, 0x11, 0xC2, 0x56, 0xD3, 0xC1, 0x03, 0x4A, + 0xB9, 0x90, 0x13, 0x32, 0x7F, 0xBF, 0xB4, 0x6B, + 0xBD, 0x0C, 0x0E, 0xB7, }}, + .y = {.byte = {0x34, 0x7E, 0x00, 0x85, 0x99, 0x81, 0xD5, 0x44, + 0x64, 0x47, 0x07, 0x5A, 0xA0, 0x75, 0x43, 0xCD, + 0xE6, 0xDF, 0x22, 0x4C, 0xFB, 0x23, 0xF7, 0xB5, + 0x88, 0x63, 0x37, 0xBD, }}, +}; + +const PKA_EccParam224 NISTP224_prime = {.byte = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF}}; + +const PKA_EccParam224 NISTP224_a = {.byte = {0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF}}; + +const PKA_EccParam224 NISTP224_b = {.byte = {0xB4, 0xFF, 0x55, 0x23, 0x43, 0x39, 0x0B, 0x27, + 0xBA, 0xD8, 0xBF, 0xD7, 0xB7, 0xB0, 0x44, 0x50, + 0x56, 0x32, 0x41, 0xF5, 0xAB, 0xB3, 0x04, 0x0C, + 0x85, 0x0A, 0x05, 0xB4}}; + +const PKA_EccParam224 NISTP224_order = {.byte = {0x3D, 0x2A, 0x5C, 0x5C, 0x45, 0x29, 0xDD, 0x13, + 0x3E, 0xF0, 0xB8, 0xE0, 0xA2, 0x16, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF}}; + +//***************************************************************************** +// +// NIST P256 constants in little endian format. byte[0] is the least +// significant byte and byte[NISTP256_PARAM_SIZE_BYTES - 1] is the most +// significant. +// +//***************************************************************************** +const PKA_EccPoint256 NISTP256_generator = { + .x = {.byte = {0x96, 0xc2, 0x98, 0xd8, 0x45, 0x39, 0xa1, 0xf4, + 0xa0, 0x33, 0xeb, 0x2d, 0x81, 0x7d, 0x03, 0x77, + 0xf2, 0x40, 0xa4, 0x63, 0xe5, 0xe6, 0xbc, 0xf8, + 0x47, 0x42, 0x2c, 0xe1, 0xf2, 0xd1, 0x17, 0x6b}}, + .y = {.byte = {0xf5, 0x51, 0xbf, 0x37, 0x68, 0x40, 0xb6, 0xcb, + 0xce, 0x5e, 0x31, 0x6b, 0x57, 0x33, 0xce, 0x2b, + 0x16, 0x9e, 0x0f, 0x7c, 0x4a, 0xeb, 0xe7, 0x8e, + 0x9b, 0x7f, 0x1a, 0xfe, 0xe2, 0x42, 0xe3, 0x4f}}, +}; + +const PKA_EccParam256 NISTP256_prime = {.byte = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff}}; + +const PKA_EccParam256 NISTP256_a = {.byte = {0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff}}; + +const PKA_EccParam256 NISTP256_b = {.byte = {0x4b, 0x60, 0xd2, 0x27, 0x3e, 0x3c, 0xce, 0x3b, + 0xf6, 0xb0, 0x53, 0xcc, 0xb0, 0x06, 0x1d, 0x65, + 0xbc, 0x86, 0x98, 0x76, 0x55, 0xbd, 0xeb, 0xb3, + 0xe7, 0x93, 0x3a, 0xaa, 0xd8, 0x35, 0xc6, 0x5a}}; + +const PKA_EccParam256 NISTP256_order = {.byte = {0x51, 0x25, 0x63, 0xfc, 0xc2, 0xca, 0xb9, 0xf3, + 0x84, 0x9e, 0x17, 0xa7, 0xad, 0xfa, 0xe6, 0xbc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff}}; + +//***************************************************************************** +// +// NIST P384 constants in little endian format. byte[0] is the least +// significant byte and byte[NISTP384_PARAM_SIZE_BYTES - 1] is the most +// significant. +// +//***************************************************************************** +const PKA_EccPoint384 NISTP384_generator = { + .x = {.byte = {0xb7, 0x0a, 0x76, 0x72, 0x38, 0x5e, 0x54, 0x3a, + 0x6c, 0x29, 0x55, 0xbf, 0x5d, 0xf2, 0x02, 0x55, + 0x38, 0x2a, 0x54, 0x82, 0xe0, 0x41, 0xf7, 0x59, + 0x98, 0x9b, 0xa7, 0x8b, 0x62, 0x3b, 0x1d, 0x6e, + 0x74, 0xad, 0x20, 0xf3, 0x1e, 0xc7, 0xb1, 0x8e, + 0x37, 0x05, 0x8b, 0xbe, 0x22, 0xca, 0x87, 0xaa}}, + .y = {.byte = {0x5f, 0x0e, 0xea, 0x90, 0x7c, 0x1d, 0x43, 0x7a, + 0x9d, 0x81, 0x7e, 0x1d, 0xce, 0xb1, 0x60, 0x0a, + 0xc0, 0xb8, 0xf0, 0xb5, 0x13, 0x31, 0xda, 0xe9, + 0x7c, 0x14, 0x9a, 0x28, 0xbd, 0x1d, 0xf4, 0xf8, + 0x29, 0xdc, 0x92, 0x92, 0xbf, 0x98, 0x9e, 0x5d, + 0x6f, 0x2c, 0x26, 0x96, 0x4a, 0xde, 0x17, 0x36,}}, +}; + +const PKA_EccParam384 NISTP384_prime = {.byte = {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}; + +const PKA_EccParam384 NISTP384_a = {.byte = {0xfc, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}; + +const PKA_EccParam384 NISTP384_b = {.byte = {0xef, 0x2a, 0xec, 0xd3, 0xed, 0xc8, 0x85, 0x2a, + 0x9d, 0xd1, 0x2e, 0x8a, 0x8d, 0x39, 0x56, 0xc6, + 0x5a, 0x87, 0x13, 0x50, 0x8f, 0x08, 0x14, 0x03, + 0x12, 0x41, 0x81, 0xfe, 0x6e, 0x9c, 0x1d, 0x18, + 0x19, 0x2d, 0xf8, 0xe3, 0x6b, 0x05, 0x8e, 0x98, + 0xe4, 0xe7, 0x3e, 0xe2, 0xa7, 0x2f, 0x31, 0xb3}}; + +const PKA_EccParam384 NISTP384_order = {.byte = {0x73, 0x29, 0xc5, 0xcc, 0x6a, 0x19, 0xec, 0xec, + 0x7a, 0xa7, 0xb0, 0x48, 0xb2, 0x0d, 0x1a, 0x58, + 0xdf, 0x2d, 0x37, 0xf4, 0x81, 0x4d, 0x63, 0xc7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}; + + +//***************************************************************************** +// +// NIST P521 constants in little endian format. byte[0] is the least +// significant byte and byte[NISTP521_PARAM_SIZE_BYTES - 1] is the most +// significant. +// +//***************************************************************************** +const PKA_EccPoint521 NISTP521_generator = { + .x = {.byte = {0x66, 0xbd, 0xe5, 0xc2, 0x31, 0x7e, 0x7e, 0xf9, + 0x9b, 0x42, 0x6a, 0x85, 0xc1, 0xb3, 0x48, 0x33, + 0xde, 0xa8, 0xff, 0xa2, 0x27, 0xc1, 0x1d, 0xfe, + 0x28, 0x59, 0xe7, 0xef, 0x77, 0x5e, 0x4b, 0xa1, + 0xba, 0x3d, 0x4d, 0x6b, 0x60, 0xaf, 0x28, 0xf8, + 0x21, 0xb5, 0x3f, 0x05, 0x39, 0x81, 0x64, 0x9c, + 0x42, 0xb4, 0x95, 0x23, 0x66, 0xcb, 0x3e, 0x9e, + 0xcd, 0xe9, 0x04, 0x04, 0xb7, 0x06, 0x8e, 0x85, + 0xc6, 0x00}}, + .y = {.byte = {0x50, 0x66, 0xd1, 0x9f, 0x76, 0x94, 0xbe, 0x88, + 0x40, 0xc2, 0x72, 0xa2, 0x86, 0x70, 0x3c, 0x35, + 0x61, 0x07, 0xad, 0x3f, 0x01, 0xb9, 0x50, 0xc5, + 0x40, 0x26, 0xf4, 0x5e, 0x99, 0x72, 0xee, 0x97, + 0x2c, 0x66, 0x3e, 0x27, 0x17, 0xbd, 0xaf, 0x17, + 0x68, 0x44, 0x9b, 0x57, 0x49, 0x44, 0xf5, 0x98, + 0xd9, 0x1b, 0x7d, 0x2c, 0xb4, 0x5f, 0x8a, 0x5c, + 0x04, 0xc0, 0x3b, 0x9a, 0x78, 0x6a, 0x29, 0x39, + 0x18, 0x01}}, +}; + +const PKA_EccParam521 NISTP521_prime = {.byte = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x01}}; + +const PKA_EccParam521 NISTP521_a = {.byte = {0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x01}}; + +const PKA_EccParam521 NISTP521_b = {.byte = {0x00, 0x3f, 0x50, 0x6b, 0xd4, 0x1f, 0x45, 0xef, + 0xf1, 0x34, 0x2c, 0x3d, 0x88, 0xdf, 0x73, 0x35, + 0x07, 0xbf, 0xb1, 0x3b, 0xbd, 0xc0, 0x52, 0x16, + 0x7b, 0x93, 0x7e, 0xec, 0x51, 0x39, 0x19, 0x56, + 0xe1, 0x09, 0xf1, 0x8e, 0x91, 0x89, 0xb4, 0xb8, + 0xf3, 0x15, 0xb3, 0x99, 0x5b, 0x72, 0xda, 0xa2, + 0xee, 0x40, 0x85, 0xb6, 0xa0, 0x21, 0x9a, 0x92, + 0x1f, 0x9a, 0x1c, 0x8e, 0x61, 0xb9, 0x3e, 0x95, + 0x51, 0x00}}; + +const PKA_EccParam521 NISTP521_order = {.byte = {0x09, 0x64, 0x38, 0x91, 0x1e, 0xb7, 0x6f, 0xbb, + 0xae, 0x47, 0x9c, 0x89, 0xb8, 0xc9, 0xb5, 0x3b, + 0xd0, 0xa5, 0x09, 0xf7, 0x48, 0x01, 0xcc, 0x7f, + 0x6b, 0x96, 0x2f, 0xbf, 0x83, 0x87, 0x86, 0x51, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x01}}; + + +//***************************************************************************** +// +// Brainpool P256r1 constants in little endian format. byte[0] is the least +// significant byte and byte[BrainpoolP256R1_PARAM_SIZE_BYTES - 1] is the most +// significant. +// +//***************************************************************************** +const PKA_EccPoint256 BrainpoolP256R1_generator = { + .x = {.byte = {0x62, 0x32, 0xCE, 0x9A, 0xBD, 0x53, 0x44, 0x3A, + 0xC2, 0x23, 0xBD, 0xE3, 0xE1, 0x27, 0xDE, 0xB9, + 0xAF, 0xB7, 0x81, 0xFC, 0x2F, 0x48, 0x4B, 0x2C, + 0xCB, 0x57, 0x7E, 0xCB, 0xB9, 0xAE, 0xD2, 0x8B}}, + .y = {.byte = {0x97, 0x69, 0x04, 0x2F, 0xC7, 0x54, 0x1D, 0x5C, + 0x54, 0x8E, 0xED, 0x2D, 0x13, 0x45, 0x77, 0xC2, + 0xC9, 0x1D, 0x61, 0x14, 0x1A, 0x46, 0xF8, 0x97, + 0xFD, 0xC4, 0xDA, 0xC3, 0x35, 0xF8, 0x7E, 0x54}}, +}; + +const PKA_EccParam256 BrainpoolP256R1_prime = {.byte = {0x77, 0x53, 0x6E, 0x1F, 0x1D, 0x48, 0x13, 0x20, + 0x28, 0x20, 0x26, 0xD5, 0x23, 0xF6, 0x3B, 0x6E, + 0x72, 0x8D, 0x83, 0x9D, 0x90, 0x0A, 0x66, 0x3E, + 0xBC, 0xA9, 0xEE, 0xA1, 0xDB, 0x57, 0xFB, 0xA9}}; + +const PKA_EccParam256 BrainpoolP256R1_a = {.byte = {0xD9, 0xB5, 0x30, 0xF3, 0x44, 0x4B, 0x4A, 0xE9, + 0x6C, 0x5C, 0xDC, 0x26, 0xC1, 0x55, 0x80, 0xFB, + 0xE7, 0xFF, 0x7A, 0x41, 0x30, 0x75, 0xF6, 0xEE, + 0x57, 0x30, 0x2C, 0xFC, 0x75, 0x09, 0x5A, 0x7D}}; + +const PKA_EccParam256 BrainpoolP256R1_b = {.byte = {0xB6, 0x07, 0x8C, 0xFF, 0x18, 0xDC, 0xCC, 0x6B, + 0xCE, 0xE1, 0xF7, 0x5C, 0x29, 0x16, 0x84, 0x95, + 0xBF, 0x7C, 0xD7, 0xBB, 0xD9, 0xB5, 0x30, 0xF3, + 0x44, 0x4B, 0x4A, 0xE9, 0x6C, 0x5C, 0xDC, 0x26,}}; + +const PKA_EccParam256 BrainpoolP256R1_order = {.byte = {0xA7, 0x56, 0x48, 0x97, 0x82, 0x0E, 0x1E, 0x90, + 0xF7, 0xA6, 0x61, 0xB5, 0xA3, 0x7A, 0x39, 0x8C, + 0x71, 0x8D, 0x83, 0x9D, 0x90, 0x0A, 0x66, 0x3E, + 0xBC, 0xA9, 0xEE, 0xA1, 0xDB, 0x57, 0xFB, 0xA9}}; + +//***************************************************************************** +// +// Brainpool P384r1 constants in little endian format. byte[0] is the least +// significant byte and byte[BrainpoolP384R1_PARAM_SIZE_BYTES - 1] is the most +// significant. +// +//***************************************************************************** +const PKA_EccPoint384 BrainpoolP384R1_generator = { + .x = {.byte = {0x1E, 0xAF, 0xD4, 0x47, 0xE2, 0xB2, 0x87, 0xEF, + 0xAA, 0x46, 0xD6, 0x36, 0x34, 0xE0, 0x26, 0xE8, + 0xE8, 0x10, 0xBD, 0x0C, 0xFE, 0xCA, 0x7F, 0xDB, + 0xE3, 0x4F, 0xF1, 0x7E, 0xE7, 0xA3, 0x47, 0x88, + 0x6B, 0x3F, 0xC1, 0xB7, 0x81, 0x3A, 0xA6, 0xA2, + 0xFF, 0x45, 0xCF, 0x68, 0xF0, 0x64, 0x1C, 0x1D}}, + .y = {.byte = {0x15, 0x53, 0x3C, 0x26, 0x41, 0x03, 0x82, 0x42, + 0x11, 0x81, 0x91, 0x77, 0x21, 0x46, 0x46, 0x0E, + 0x28, 0x29, 0x91, 0xF9, 0x4F, 0x05, 0x9C, 0xE1, + 0x64, 0x58, 0xEC, 0xFE, 0x29, 0x0B, 0xB7, 0x62, + 0x52, 0xD5, 0xCF, 0x95, 0x8E, 0xEB, 0xB1, 0x5C, + 0xA4, 0xC2, 0xF9, 0x20, 0x75, 0x1D, 0xBE, 0x8A}}, +}; + +const PKA_EccParam384 BrainpoolP384R1_prime = {.byte = {0x53, 0xEC, 0x07, 0x31, 0x13, 0x00, 0x47, 0x87, + 0x71, 0x1A, 0x1D, 0x90, 0x29, 0xA7, 0xD3, 0xAC, + 0x23, 0x11, 0xB7, 0x7F, 0x19, 0xDA, 0xB1, 0x12, + 0xB4, 0x56, 0x54, 0xED, 0x09, 0x71, 0x2F, 0x15, + 0xDF, 0x41, 0xE6, 0x50, 0x7E, 0x6F, 0x5D, 0x0F, + 0x28, 0x6D, 0x38, 0xA3, 0x82, 0x1E, 0xB9, 0x8C}}; + +const PKA_EccParam384 BrainpoolP384R1_a = {.byte = {0x26, 0x28, 0xCE, 0x22, 0xDD, 0xC7, 0xA8, 0x04, + 0xEB, 0xD4, 0x3A, 0x50, 0x4A, 0x81, 0xA5, 0x8A, + 0x0F, 0xF9, 0x91, 0xBA, 0xEF, 0x65, 0x91, 0x13, + 0x87, 0x27, 0xB2, 0x4F, 0x8E, 0xA2, 0xBE, 0xC2, + 0xA0, 0xAF, 0x05, 0xCE, 0x0A, 0x08, 0x72, 0x3C, + 0x0C, 0x15, 0x8C, 0x3D, 0xC6, 0x82, 0xC3, 0x7B}}; + +const PKA_EccParam384 BrainpoolP384R1_b = {.byte = {0x11, 0x4C, 0x50, 0xFA, 0x96, 0x86, 0xB7, 0x3A, + 0x94, 0xC9, 0xDB, 0x95, 0x02, 0x39, 0xB4, 0x7C, + 0xD5, 0x62, 0xEB, 0x3E, 0xA5, 0x0E, 0x88, 0x2E, + 0xA6, 0xD2, 0xDC, 0x07, 0xE1, 0x7D, 0xB7, 0x2F, + 0x7C, 0x44, 0xF0, 0x16, 0x54, 0xB5, 0x39, 0x8B, + 0x26, 0x28, 0xCE, 0x22, 0xDD, 0xC7, 0xA8, 0x04}}; + +const PKA_EccParam384 BrainpoolP384R1_order = {.byte = {0x65, 0x65, 0x04, 0xE9, 0x02, 0x32, 0x88, 0x3B, + 0x10, 0xC3, 0x7F, 0x6B, 0xAF, 0xB6, 0x3A, 0xCF, + 0xA7, 0x25, 0x04, 0xAC, 0x6C, 0x6E, 0x16, 0x1F, + 0xB3, 0x56, 0x54, 0xED, 0x09, 0x71, 0x2F, 0x15, + 0xDF, 0x41, 0xE6, 0x50, 0x7E, 0x6F, 0x5D, 0x0F, + 0x28, 0x6D, 0x38, 0xA3, 0x82, 0x1E, 0xB9, 0x8C}}; + +//***************************************************************************** +// +// Brainpool P512r1 constants in little endian format. byte[0] is the least +// significant byte and byte[BrainpoolP512R1_PARAM_SIZE_BYTES - 1] is the most +// significant. +// +//***************************************************************************** +const PKA_EccPoint512 BrainpoolP512R1_generator = { + .x = {.byte = {0x22, 0xF8, 0xB9, 0xBC, 0x09, 0x22, 0x35, 0x8B, + 0x68, 0x5E, 0x6A, 0x40, 0x47, 0x50, 0x6D, 0x7C, + 0x5F, 0x7D, 0xB9, 0x93, 0x7B, 0x68, 0xD1, 0x50, + 0x8D, 0xD4, 0xD0, 0xE2, 0x78, 0x1F, 0x3B, 0xFF, + 0x8E, 0x09, 0xD0, 0xF4, 0xEE, 0x62, 0x3B, 0xB4, + 0xC1, 0x16, 0xD9, 0xB5, 0x70, 0x9F, 0xED, 0x85, + 0x93, 0x6A, 0x4C, 0x9C, 0x2E, 0x32, 0x21, 0x5A, + 0x64, 0xD9, 0x2E, 0xD8, 0xBD, 0xE4, 0xAE, 0x81}}, + .y = {.byte = {0x92, 0x08, 0xD8, 0x3A, 0x0F, 0x1E, 0xCD, 0x78, + 0x06, 0x54, 0xF0, 0xA8, 0x2F, 0x2B, 0xCA, 0xD1, + 0xAE, 0x63, 0x27, 0x8A, 0xD8, 0x4B, 0xCA, 0x5B, + 0x5E, 0x48, 0x5F, 0x4A, 0x49, 0xDE, 0xDC, 0xB2, + 0x11, 0x81, 0x1F, 0x88, 0x5B, 0xC5, 0x00, 0xA0, + 0x1A, 0x7B, 0xA5, 0x24, 0x00, 0xF7, 0x09, 0xF2, + 0xFD, 0x22, 0x78, 0xCF, 0xA9, 0xBF, 0xEA, 0xC0, + 0xEC, 0x32, 0x63, 0x56, 0x5D, 0x38, 0xDE, 0x7D}}, +}; + +const PKA_EccParam512 BrainpoolP512R1_prime = {.byte = {0xF3, 0x48, 0x3A, 0x58, 0x56, 0x60, 0xAA, 0x28, + 0x85, 0xC6, 0x82, 0x2D, 0x2F, 0xFF, 0x81, 0x28, + 0xE6, 0x80, 0xA3, 0xE6, 0x2A, 0xA1, 0xCD, 0xAE, + 0x42, 0x68, 0xC6, 0x9B, 0x00, 0x9B, 0x4D, 0x7D, + 0x71, 0x08, 0x33, 0x70, 0xCA, 0x9C, 0x63, 0xD6, + 0x0E, 0xD2, 0xC9, 0xB3, 0xB3, 0x8D, 0x30, 0xCB, + 0x07, 0xFC, 0xC9, 0x33, 0xAE, 0xE6, 0xD4, 0x3F, + 0x8B, 0xC4, 0xE9, 0xDB, 0xB8, 0x9D, 0xDD, 0xAA}}; + +const PKA_EccParam512 BrainpoolP512R1_a = {.byte = {0xCA, 0x94, 0xFC, 0x77, 0x4D, 0xAC, 0xC1, 0xE7, + 0xB9, 0xC7, 0xF2, 0x2B, 0xA7, 0x17, 0x11, 0x7F, + 0xB5, 0xC8, 0x9A, 0x8B, 0xC9, 0xF1, 0x2E, 0x0A, + 0xA1, 0x3A, 0x25, 0xA8, 0x5A, 0x5D, 0xED, 0x2D, + 0xBC, 0x63, 0x98, 0xEA, 0xCA, 0x41, 0x34, 0xA8, + 0x10, 0x16, 0xF9, 0x3D, 0x8D, 0xDD, 0xCB, 0x94, + 0xC5, 0x4C, 0x23, 0xAC, 0x45, 0x71, 0x32, 0xE2, + 0x89, 0x3B, 0x60, 0x8B, 0x31, 0xA3, 0x30, 0x78}}; + +const PKA_EccParam512 BrainpoolP512R1_b = {.byte = {0x23, 0xF7, 0x16, 0x80, 0x63, 0xBD, 0x09, 0x28, + 0xDD, 0xE5, 0xBA, 0x5E, 0xB7, 0x50, 0x40, 0x98, + 0x67, 0x3E, 0x08, 0xDC, 0xCA, 0x94, 0xFC, 0x77, + 0x4D, 0xAC, 0xC1, 0xE7, 0xB9, 0xC7, 0xF2, 0x2B, + 0xA7, 0x17, 0x11, 0x7F, 0xB5, 0xC8, 0x9A, 0x8B, + 0xC9, 0xF1, 0x2E, 0x0A, 0xA1, 0x3A, 0x25, 0xA8, + 0x5A, 0x5D, 0xED, 0x2D, 0xBC, 0x63, 0x98, 0xEA, + 0xCA, 0x41, 0x34, 0xA8, 0x10, 0x16, 0xF9, 0x3D}}; + +const PKA_EccParam512 BrainpoolP512R1_order = {.byte = {0x69, 0x00, 0xA9, 0x9C, 0x82, 0x96, 0x87, 0xB5, + 0xDD, 0xDA, 0x5D, 0x08, 0x81, 0xD3, 0xB1, 0x1D, + 0x47, 0x10, 0xAC, 0x7F, 0x19, 0x61, 0x86, 0x41, + 0x19, 0x26, 0xA9, 0x4C, 0x41, 0x5C, 0x3E, 0x55, + 0x70, 0x08, 0x33, 0x70, 0xCA, 0x9C, 0x63, 0xD6, + 0x0E, 0xD2, 0xC9, 0xB3, 0xB3, 0x8D, 0x30, 0xCB, + 0x07, 0xFC, 0xC9, 0x33, 0xAE, 0xE6, 0xD4, 0x3F, + 0x8B, 0xC4, 0xE9, 0xDB, 0xB8, 0x9D, 0xDD, 0xAA}}; + +//***************************************************************************** +// +// Curve25519 constants in little endian format. byte[0] is the least +// significant byte and byte[Curve25519_PARAM_SIZE_BYTES - 1] is the most +// significant. +// +//***************************************************************************** +const PKA_EccPoint256 Curve25519_generator = { + .x = {.byte = {0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}, + .y = {.byte = {0xd9, 0xd3, 0xce, 0x7e, 0xa2, 0xc5, 0xe9, 0x29, + 0xb2, 0x61, 0x7c, 0x6d, 0x7e, 0x4d, 0x3d, 0x92, + 0x4c, 0xd1, 0x48, 0x77, 0x2c, 0xdd, 0x1e, 0xe0, + 0xb4, 0x86, 0xa0, 0xb8, 0xa1, 0x19, 0xae, 0x20}}, +}; + +const PKA_EccParam256 Curve25519_prime = {.byte = {0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f}}; + +const PKA_EccParam256 Curve25519_a = {.byte = {0x06, 0x6d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}; + +const PKA_EccParam256 Curve25519_b = {.byte = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}; + +const PKA_EccParam256 Curve25519_order = {.byte = {0xb9, 0xdc, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, + 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}}; + +//***************************************************************************** +// +// Write a PKA parameter to the PKA module, set required registers, and add an offset. +// +//***************************************************************************** +static uint32_t PKAWritePkaParam(const uint8_t *param, uint32_t paramLength, uint32_t paramOffset, uint32_t ptrRegOffset) +{ + uint32_t i; + uint32_t *paramWordAlias = (uint32_t *)param; + // Take the floor of paramLength in 32-bit words + uint32_t paramLengthInWords = paramLength / sizeof(uint32_t); + + // Only copy data if it is specified. We may wish to simply allocate another buffer and get + // the required offset. + if (param) { + // Load the number in PKA RAM + for (i = 0; i < paramLengthInWords; i++) { + HWREG(PKA_RAM_BASE + paramOffset + sizeof(uint32_t) * i) = paramWordAlias[i]; + } + + // If the length is not a word-multiple, fill up a temporary word and copy that in + // to avoid a bus error. The extra zeros at the end should not matter, as the large + // number is little-endian and thus has no effect. + // We could have correctly calculated ceiling(paramLength / sizeof(uint32_t)) above. + // However, we would not have been able to zero-out the extra few most significant + // bytes of the most significant word. That would have resulted in doing maths operations + // on whatever follows param in RAM. + if (paramLength % sizeof(uint32_t)) { + uint32_t temp = 0; + uint8_t j; + + // Load the entire word line of the param remainder + temp = paramWordAlias[i]; + + // Zero-out all bytes beyond the end of the param + for (j = paramLength % sizeof(uint32_t); j < sizeof(uint32_t); j++) { + ((uint8_t *)&temp)[j] = 0; + } + + HWREG(PKA_RAM_BASE + paramOffset + sizeof(uint32_t) * i) = temp; + + // Increment paramLengthInWords since we take the ceiling of length / sizeof(uint32_t) + paramLengthInWords++; + } + } + + // Update the A, B, C, or D pointer with the offset address of the PKA RAM location + // where the number will be stored. + switch (ptrRegOffset) { + case PKA_O_APTR: + HWREG(PKA_BASE + PKA_O_APTR) = paramOffset >> 2; + HWREG(PKA_BASE + PKA_O_ALENGTH) = paramLengthInWords; + break; + case PKA_O_BPTR: + HWREG(PKA_BASE + PKA_O_BPTR) = paramOffset >> 2; + HWREG(PKA_BASE + PKA_O_BLENGTH) = paramLengthInWords; + break; + case PKA_O_CPTR: + HWREG(PKA_BASE + PKA_O_CPTR) = paramOffset >> 2; + break; + case PKA_O_DPTR: + HWREG(PKA_BASE + PKA_O_DPTR) = paramOffset >> 2; + break; + } + + // Ensure 8-byte alignment of next parameter. + // Returns the offset for the next parameter. + return paramOffset + sizeof(uint32_t) * (paramLengthInWords + (paramLengthInWords % 2)); +} + +//***************************************************************************** +// +// Write a PKA parameter to the PKA module but return a larger offset. +// +//***************************************************************************** +static uint32_t PKAWritePkaParamExtraOffset(const uint8_t *param, uint32_t paramLength, uint32_t paramOffset, uint32_t ptrRegOffset) +{ + // Ensure 16-byte alignment. + return (sizeof(uint32_t) * 2) + PKAWritePkaParam(param, paramLength, paramOffset, ptrRegOffset); +} + +//***************************************************************************** +// +// Writes the result of a large number arithmetic operation to a provided buffer. +// +//***************************************************************************** +static uint32_t PKAGetBigNumResult(uint8_t *resultBuf, uint32_t *resultLength, uint32_t resultPKAMemAddr) +{ + uint32_t mswOffset; + uint32_t lswOffset; + uint32_t lengthInWords; + uint32_t i; + uint32_t *resultWordAlias = (uint32_t *)resultBuf; + + // Check the arguments. + ASSERT(resultBuf); + ASSERT((resultPKAMemAddr > PKA_RAM_BASE) && + (resultPKAMemAddr < (PKA_RAM_BASE + PKA_RAM_TOT_BYTE_SIZE))); + + // Verify that the operation is complete. + if (HWREG(PKA_BASE + PKA_O_FUNCTION) & PKA_FUNCTION_RUN) { + return PKA_STATUS_OPERATION_BUSY; + } + + // Get the MSW register value. + mswOffset = HWREG(PKA_BASE + PKA_O_MSW); + + // If the result vector is zero, write back one zero byte so the caller does not need + // to handle a special error for the perhaps valid result of zero. + // They will only get the error status if they do not provide a buffer + if (mswOffset & PKA_MSW_RESULT_IS_ZERO_M) { + if (*resultLength){ + if(resultBuf){ + resultBuf[0] = 0; + } + + *resultLength = 1; + + return PKA_STATUS_SUCCESS; + } + else { + return PKA_STATUS_BUF_UNDERFLOW; + } + } + + // Get the length of the result + mswOffset = ((mswOffset & PKA_MSW_MSW_ADDRESS_M) + 1); + lswOffset = ((resultPKAMemAddr - PKA_RAM_BASE) >> 2); + + if (mswOffset >= lswOffset) { + lengthInWords = mswOffset - lswOffset; + } + else { + return PKA_STATUS_RESULT_ADDRESS_INCORRECT; + } + + // Check if the provided buffer length is adequate to store the result data. + if (*resultLength < lengthInWords * sizeof(uint32_t)) { + return PKA_STATUS_BUF_UNDERFLOW; + } + + // Copy the resultant length. + *resultLength = lengthInWords * sizeof(uint32_t); + + + if (resultBuf) { + // Copy the result into the resultBuf. + for (i = 0; i < lengthInWords; i++) { + resultWordAlias[i]= HWREG(resultPKAMemAddr + sizeof(uint32_t) * i); + } + } + + return PKA_STATUS_SUCCESS; +} + +//***************************************************************************** +// +// Retrieve the result of a modulo operation or the remainder of a division. +// +//***************************************************************************** +static uint32_t PKAGetBigNumResultRemainder(uint8_t *resultBuf, uint32_t *resultLength, uint32_t resultPKAMemAddr) +{ + uint32_t regMSWVal; + uint32_t lengthInWords; + uint32_t i; + uint32_t *resultWordAlias = (uint32_t *)resultBuf; + + // Check the arguments. + ASSERT(resultBuf); + ASSERT((resultPKAMemAddr > PKA_RAM_BASE) && + (resultPKAMemAddr < (PKA_RAM_BASE + PKA_RAM_TOT_BYTE_SIZE))); + + // Verify that the operation is complete. + if (HWREG(PKA_BASE + PKA_O_FUNCTION) & PKA_FUNCTION_RUN) { + return PKA_STATUS_OPERATION_BUSY; + } + + // Get the MSW register value. + regMSWVal = HWREG(PKA_BASE + PKA_O_DIVMSW); + + // If the result vector is zero, write back one zero byte so the caller does not need + // to handle a special error for the perhaps valid result of zero. + // They will only get the error status if they do not provide a buffer + if (regMSWVal & PKA_DIVMSW_RESULT_IS_ZERO_M) { + if (*resultLength){ + if(resultBuf){ + resultBuf[0] = 0; + } + + *resultLength = 1; + + return PKA_STATUS_SUCCESS; + } + else { + return PKA_STATUS_BUF_UNDERFLOW; + } + } + + // Get the length of the result + lengthInWords = ((regMSWVal & PKA_DIVMSW_MSW_ADDRESS_M) + 1) - ((resultPKAMemAddr - PKA_RAM_BASE) >> 2); + + // Check if the provided buffer length is adequate to store the result data. + if (*resultLength < lengthInWords * sizeof(uint32_t)) { + return PKA_STATUS_BUF_UNDERFLOW; + } + + // Copy the resultant length. + *resultLength = lengthInWords * sizeof(uint32_t); + + if (resultBuf) { + // Copy the result into the resultBuf. + for (i = 0; i < lengthInWords; i++) { + resultWordAlias[i] = HWREG(resultPKAMemAddr + sizeof(uint32_t) * i); + } + } + + return PKA_STATUS_SUCCESS; +} + +//***************************************************************************** +// +// Writes the resultant curve point of an ECC operation to the provided buffer. +// +//***************************************************************************** +static uint32_t PKAGetECCResult(uint8_t *curvePointX, uint8_t *curvePointY, uint32_t resultPKAMemAddr, uint32_t length) +{ + uint32_t i = 0; + uint32_t *xWordAlias = (uint32_t *)curvePointX; + uint32_t *yWordAlias = (uint32_t *)curvePointY; + uint32_t lengthInWordsCeiling = 0; + + // Check for the arguments. + ASSERT(curvePointX); + ASSERT(curvePointY); + ASSERT((resultPKAMemAddr > PKA_RAM_BASE) && + (resultPKAMemAddr < (PKA_RAM_BASE + PKA_RAM_TOT_BYTE_SIZE))); + + // Verify that the operation is completed. + if (HWREG(PKA_BASE + PKA_O_FUNCTION) & PKA_FUNCTION_RUN) { + return PKA_STATUS_OPERATION_BUSY; + } + + if (HWREG(PKA_BASE + PKA_O_SHIFT)) { + return PKA_STATUS_FAILURE; + } + + // Check to make sure that the result vector is not the point at infinity. + if (HWREG(PKA_BASE + PKA_O_MSW) & PKA_MSW_RESULT_IS_ZERO) { + return PKA_STATUS_POINT_AT_INFINITY; + } + + if (curvePointX != NULL) { + // Copy the x co-ordinate value of the result from vector D into + // the curvePoint. + for (i = 0; i < (length / sizeof(uint32_t)); i++) { + xWordAlias[i] = HWREG(resultPKAMemAddr + sizeof(uint32_t) * i); + } + + // If the length is not a word-multiple, fill up a temporary word and copy that in + // to avoid a bus error. + if (length % sizeof(uint32_t)) { + uint32_t temp = 0; + uint8_t j; + + // Load the entire word line of the coordinate remainder + temp = HWREG(resultPKAMemAddr + sizeof(uint32_t) * i); + + // Write all remaining bytes to the coordinate + for (j = 0; j < length % sizeof(uint32_t); j++) { + curvePointX[i * sizeof(uint32_t) + j] = ((uint8_t *)&temp)[j]; + } + + } + } + + lengthInWordsCeiling = (length % sizeof(uint32_t)) ? length / sizeof(uint32_t) + 1 : length / sizeof(uint32_t); + + resultPKAMemAddr += sizeof(uint32_t) * (2 + lengthInWordsCeiling + (lengthInWordsCeiling % 2)); + + if (curvePointY != NULL) { + // Copy the y co-ordinate value of the result from vector D into + // the curvePoint. + for (i = 0; i < (length / sizeof(uint32_t)); i++) { + yWordAlias[i] = HWREG(resultPKAMemAddr + sizeof(uint32_t) * i); + } + + // If the length is not a word-multiple, fill up a temporary word and copy that in + // to avoid a bus error. + if (length % sizeof(uint32_t)) { + uint32_t temp = 0; + uint8_t j; + + // Load the entire word line of the coordinate remainder + temp = HWREG(resultPKAMemAddr + sizeof(uint32_t) * i); + + // Write all remaining bytes to the coordinate + for (j = 0; j < length % sizeof(uint32_t); j++) { + curvePointY[i * sizeof(uint32_t) + j] = ((uint8_t *)&temp)[j]; + } + } + } + + + return PKA_STATUS_SUCCESS; +} + + +//***************************************************************************** +// +// Provides the PKA operation status. +// +//***************************************************************************** +uint32_t PKAGetOpsStatus(void) +{ + if (HWREG(PKA_BASE + PKA_O_FUNCTION) & PKA_FUNCTION_RUN_M) { + return PKA_STATUS_OPERATION_BUSY; + } + else { + return PKA_STATUS_OPERATION_RDY; + } +} + +//***************************************************************************** +// +// Check if an array consists only of zeros. +// +//***************************************************************************** +bool PKAArrayAllZeros(const uint8_t *array, uint32_t arrayLength) +{ + uint32_t i; + uint8_t arrayBits = 0; + + // We could speed things up by comparing word-wise rather than byte-wise. + // However, this extra overhead is inconsequential compared to running an + // actual PKA operation. Especially ECC operations. + for (i = 0; i < arrayLength; i++) { + arrayBits |= array[i]; + } + + if (arrayBits) { + return false; + } + else { + return true; + } + +} + +//***************************************************************************** +// +// Fill an array with zeros +// +//***************************************************************************** +void PKAZeroOutArray(const uint8_t *array, uint32_t arrayLength) +{ + uint32_t i; + // Take the floor of paramLength in 32-bit words + uint32_t arrayLengthInWords = arrayLength / sizeof(uint32_t); + + // Zero-out the array word-wise until i >= arrayLength + for (i = 0; i < arrayLengthInWords * sizeof(uint32_t); i += 4) { + HWREG(array + i) = 0; + } + + // If i != arrayLength, there are some remaining bytes to zero-out + if (arrayLength % sizeof(uint32_t)) { + // Subtract 4 from i, since i has already overshot the array + for (i -= 4; i < arrayLength; i++) { + HWREGB(array + i * sizeof(uint32_t)); + } + } +} + +//***************************************************************************** +// +// Start the big number modulus operation. +// +//***************************************************************************** +uint32_t PKABigNumModStart(const uint8_t *bigNum, uint32_t bigNumLength, const uint8_t *modulus, uint32_t modulusLength, uint32_t *resultPKAMemAddr) +{ + uint32_t offset = 0; + + // Check the arguments. + ASSERT(bigNum); + ASSERT(modulus); + ASSERT(resultPKAMemAddr); + + // Make sure no operation is in progress. + if (HWREG(PKA_BASE + PKA_O_FUNCTION) & PKA_FUNCTION_RUN) { + return PKA_STATUS_OPERATION_BUSY; + } + + offset = PKAWritePkaParam(bigNum, bigNumLength, offset, PKA_O_APTR); + + offset = PKAWritePkaParamExtraOffset(modulus, modulusLength, offset, PKA_O_BPTR); + + // Copy the result vector address location. + *resultPKAMemAddr = PKA_RAM_BASE + offset; + + // Load C pointer with the result location in PKA RAM + HWREG(PKA_BASE + PKA_O_CPTR) = offset >> 2; + + // Start the PKCP modulo operation by setting the PKA Function register. + HWREG(PKA_BASE + PKA_O_FUNCTION) = (PKA_FUNCTION_RUN | PKA_FUNCTION_MODULO); + + return PKA_STATUS_SUCCESS; +} + +//***************************************************************************** +// +// Get the result of the big number modulus operation. +// +//***************************************************************************** +uint32_t PKABigNumModGetResult(uint8_t *resultBuf, uint32_t length, uint32_t resultPKAMemAddr) +{ + // Zero-out array in case modulo result is shorter than length + PKAZeroOutArray(resultBuf, length); + + return PKAGetBigNumResultRemainder(resultBuf, &length, resultPKAMemAddr); +} + +//***************************************************************************** +// +// Start the big number divide operation. +// +//***************************************************************************** +uint32_t PKABigNumDivideStart(const uint8_t *dividend, uint32_t dividendLength, const uint8_t *divisor, uint32_t divisorLength, uint32_t *resultQuotientMemAddr, uint32_t *resultRemainderMemAddr) +{ + uint32_t offset = 0; + + // Check the arguments. + ASSERT(dividend); + ASSERT(divisor); + ASSERT(resultQuotientMemAddr); + ASSERT(resultRemainderMemAddr); + + // Make sure no operation is in progress. + if (HWREG(PKA_BASE + PKA_O_FUNCTION) & PKA_FUNCTION_RUN) { + return PKA_STATUS_OPERATION_BUSY; + } + + offset = PKAWritePkaParam(dividend, dividendLength, offset, PKA_O_APTR); + + offset = PKAWritePkaParamExtraOffset(divisor, divisorLength, offset, PKA_O_BPTR); + + // Copy the remainder result vector address location. + if (resultRemainderMemAddr) { + *resultRemainderMemAddr = PKA_RAM_BASE + offset; + } + + // The remainder cannot ever be larger than the divisor. It should fit inside + // a buffer of that size. + offset = PKAWritePkaParamExtraOffset(0, divisorLength, offset, PKA_O_CPTR); + + // Copy the remainder result vector address location. + if (resultQuotientMemAddr) { + *resultQuotientMemAddr = PKA_RAM_BASE + offset; + } + + // Load D pointer with the quotient location in PKA RAM + HWREG(PKA_BASE + PKA_O_DPTR) = offset >> 2; + + // Start the PKCP modulo operation by setting the PKA Function register. + HWREG(PKA_BASE + PKA_O_FUNCTION) = (PKA_FUNCTION_RUN | PKA_FUNCTION_DIVIDE); + + return PKA_STATUS_SUCCESS; +} + +//***************************************************************************** +// +// Get the quotient of the big number divide operation. +// +//***************************************************************************** +uint32_t PKABigNumDivideGetQuotient(uint8_t *resultBuf, uint32_t *length, uint32_t resultQuotientMemAddr) +{ + return PKAGetBigNumResult(resultBuf, length, resultQuotientMemAddr); +} + +//***************************************************************************** +// +// Get the remainder of the big number divide operation. +// +//***************************************************************************** +uint32_t PKABigNumDivideGetRemainder(uint8_t *resultBuf, uint32_t *length, uint32_t resultQuotientMemAddr) +{ + return PKAGetBigNumResultRemainder(resultBuf, length, resultQuotientMemAddr); +} + + +//***************************************************************************** +// +// Start the comparison of two big numbers. +// +//***************************************************************************** +uint32_t PKABigNumCmpStart(const uint8_t *bigNum1, const uint8_t *bigNum2, uint32_t length) +{ + uint32_t offset = 0; + + // Check the arguments. + ASSERT(bigNum1); + ASSERT(bigNum2); + + // Make sure no operation is in progress. + if (HWREG(PKA_BASE + PKA_O_FUNCTION) & PKA_FUNCTION_RUN) { + return PKA_STATUS_OPERATION_BUSY; + } + + offset = PKAWritePkaParam(bigNum1, length, offset, PKA_O_APTR); + + offset = PKAWritePkaParam(bigNum2, length, offset, PKA_O_BPTR); + + // Set the PKA Function register for the Compare operation + // and start the operation. + HWREG(PKA_BASE + PKA_O_FUNCTION) = (PKA_FUNCTION_RUN | PKA_FUNCTION_COMPARE); + + return PKA_STATUS_SUCCESS; +} + +//***************************************************************************** +// +// Get the result of the comparison operation of two big numbers. +// +//***************************************************************************** +uint32_t PKABigNumCmpGetResult(void) +{ + uint32_t status; + + // verify that the operation is complete. + if (HWREG(PKA_BASE + PKA_O_FUNCTION) & PKA_FUNCTION_RUN) { + return PKA_STATUS_OPERATION_BUSY; + } + + // Check the COMPARE register. + switch(HWREG(PKA_BASE + PKA_O_COMPARE)) { + case PKA_COMPARE_A_EQUALS_B: + status = PKA_STATUS_EQUAL; + break; + + case PKA_COMPARE_A_GREATER_THAN_B: + status = PKA_STATUS_A_GREATER_THAN_B; + break; + + case PKA_COMPARE_A_LESS_THAN_B: + status = PKA_STATUS_A_LESS_THAN_B; + break; + + default: + status = PKA_STATUS_FAILURE; + break; + } + + return status; +} + +//***************************************************************************** +// +// Start the big number inverse modulo operation. +// +//***************************************************************************** +uint32_t PKABigNumInvModStart(const uint8_t *bigNum, uint32_t bigNumLength, const uint8_t *modulus, uint32_t modulusLength, uint32_t *resultPKAMemAddr) +{ + uint32_t offset = 0; + + // Check the arguments. + ASSERT(bigNum); + ASSERT(modulus); + ASSERT(resultPKAMemAddr); + + // Make sure no operation is in progress. + if (HWREG(PKA_BASE + PKA_O_FUNCTION) & PKA_FUNCTION_RUN) { + return PKA_STATUS_OPERATION_BUSY; + } + + offset = PKAWritePkaParam(bigNum, bigNumLength, offset, PKA_O_APTR); + + offset = PKAWritePkaParam(modulus, modulusLength, offset, PKA_O_BPTR); + + // Copy the result vector address location. + *resultPKAMemAddr = PKA_RAM_BASE + offset; + + // Load D pointer with the result location in PKA RAM. + HWREG(PKA_BASE + PKA_O_DPTR) = offset >> 2; + + // set the PKA function to InvMod operation and the start the operation. + HWREG(PKA_BASE + PKA_O_FUNCTION) = 0x0000F000; + + return PKA_STATUS_SUCCESS; +} + +//***************************************************************************** +// +// Get the result of the big number inverse modulo operation. +// +//***************************************************************************** +uint32_t PKABigNumInvModGetResult(uint8_t *resultBuf, uint32_t length, uint32_t resultPKAMemAddr) +{ + // Zero-out array in case modulo result is shorter than length + PKAZeroOutArray(resultBuf, length); + + return PKAGetBigNumResult(resultBuf, &length, resultPKAMemAddr); +} + +//***************************************************************************** +// +// Start the big number multiplication. +// +//***************************************************************************** +uint32_t PKABigNumMultiplyStart(const uint8_t *multiplicand, uint32_t multiplicandLength, const uint8_t *multiplier, uint32_t multiplierLength, uint32_t *resultPKAMemAddr) +{ + uint32_t offset = 0; + + // Check for the arguments. + ASSERT(multiplicand); + ASSERT(multiplier); + ASSERT(resultPKAMemAddr); + + // Make sure no operation is in progress. + if (HWREG(PKA_BASE + PKA_O_FUNCTION) & PKA_FUNCTION_RUN) { + return PKA_STATUS_OPERATION_BUSY; + } + + offset = PKAWritePkaParam(multiplicand, multiplicandLength, offset, PKA_O_APTR); + + offset = PKAWritePkaParam(multiplier, multiplierLength, offset, PKA_O_BPTR); + + + // Copy the result vector address location. + *resultPKAMemAddr = PKA_RAM_BASE + offset; + + // Load C pointer with the result location in PKA RAM. + HWREG(PKA_BASE + PKA_O_CPTR) = offset >> 2; + + // Set the PKA function to the multiplication and start it. + HWREG(PKA_BASE + PKA_O_FUNCTION) = (PKA_FUNCTION_RUN | PKA_FUNCTION_MULTIPLY); + + return PKA_STATUS_SUCCESS; +} + +//***************************************************************************** +// +// Get the results of the big number multiplication. +// +//***************************************************************************** +uint32_t PKABigNumMultGetResult(uint8_t *resultBuf, uint32_t *resultLength, uint32_t resultPKAMemAddr) +{ + return PKAGetBigNumResult(resultBuf, resultLength, resultPKAMemAddr); +} + +//***************************************************************************** +// +// Start the addition of two big number. +// +//***************************************************************************** +uint32_t PKABigNumAddStart(const uint8_t *bigNum1, uint32_t bigNum1Length, const uint8_t *bigNum2, uint32_t bigNum2Length, uint32_t *resultPKAMemAddr) +{ + uint32_t offset = 0; + + // Check for arguments. + ASSERT(bigNum1); + ASSERT(bigNum2); + ASSERT(resultPKAMemAddr); + + // Make sure no operation is in progress. + if (HWREG(PKA_BASE + PKA_O_FUNCTION) & PKA_FUNCTION_RUN) { + return PKA_STATUS_OPERATION_BUSY; + } + + offset = PKAWritePkaParam(bigNum1, bigNum1Length, offset, PKA_O_APTR); + + offset = PKAWritePkaParam(bigNum2, bigNum2Length, offset, PKA_O_BPTR); + + // Copy the result vector address location. + *resultPKAMemAddr = PKA_RAM_BASE + offset; + + // Load C pointer with the result location in PKA RAM. + HWREG(PKA_BASE + PKA_O_CPTR) = offset >> 2; + + // Set the function for the add operation and start the operation. + HWREG(PKA_BASE + PKA_O_FUNCTION) = (PKA_FUNCTION_RUN | PKA_FUNCTION_ADD); + + return PKA_STATUS_SUCCESS; +} + +//***************************************************************************** +// +// Get the result of the addition operation on two big number. +// +//***************************************************************************** +uint32_t PKABigNumSubGetResult(uint8_t *resultBuf, uint32_t *resultLength, uint32_t resultPKAMemAddr) +{ + return PKAGetBigNumResult(resultBuf, resultLength, resultPKAMemAddr); +} + +//***************************************************************************** +// +// Start the addition of two big number. +// +//***************************************************************************** +uint32_t PKABigNumSubStart(const uint8_t *minuend, uint32_t minuendLength, const uint8_t *subtrahend, uint32_t subtrahendLength, uint32_t *resultPKAMemAddr) +{ + uint32_t offset = 0; + + // Check for arguments. + ASSERT(minuend); + ASSERT(subtrahend); + ASSERT(resultPKAMemAddr); + + + // Make sure no operation is in progress. + if (HWREG(PKA_BASE + PKA_O_FUNCTION) & PKA_FUNCTION_RUN) { + return PKA_STATUS_OPERATION_BUSY; + } + + offset = PKAWritePkaParam(minuend, minuendLength, offset, PKA_O_APTR); + + offset = PKAWritePkaParam(subtrahend, subtrahendLength, offset, PKA_O_BPTR); + + // Copy the result vector address location. + *resultPKAMemAddr = PKA_RAM_BASE + offset; + + // Load C pointer with the result location in PKA RAM. + HWREG(PKA_BASE + PKA_O_CPTR) = offset >> 2; + + // Set the function for the add operation and start the operation. + HWREG(PKA_BASE + PKA_O_FUNCTION) = (PKA_FUNCTION_RUN | PKA_FUNCTION_SUBTRACT); + + return PKA_STATUS_SUCCESS; +} + +//***************************************************************************** +// +// Get the result of the addition operation on two big number. +// +//***************************************************************************** +uint32_t PKABigNumAddGetResult(uint8_t *resultBuf, uint32_t *resultLength, uint32_t resultPKAMemAddr) +{ + return PKAGetBigNumResult(resultBuf, resultLength, resultPKAMemAddr); +} + + +//***************************************************************************** +// +// Start ECC Multiplication. +// +//***************************************************************************** +uint32_t PKAEccMultiplyStart(const uint8_t *scalar, const uint8_t *curvePointX, const uint8_t *curvePointY, const uint8_t *prime, const uint8_t *a, const uint8_t *b, uint32_t length, uint32_t *resultPKAMemAddr) +{ + uint32_t offset = 0; + + // Check for the arguments. + ASSERT(scalar); + ASSERT(curvePointX); + ASSERT(curvePointY); + ASSERT(prime); + ASSERT(a); + ASSERT(b); + ASSERT(length <= PKA_MAX_CURVE_SIZE_32_BIT_WORD * sizeof(uint32_t)); + ASSERT(resultPKAMemAddr); + + // Make sure no PKA operation is in progress. + if (HWREG(PKA_BASE + PKA_O_FUNCTION) & PKA_FUNCTION_RUN) { + return PKA_STATUS_OPERATION_BUSY; + } + + offset = PKAWritePkaParam(scalar, length, offset, PKA_O_APTR); + + offset = PKAWritePkaParamExtraOffset(prime, length, offset, PKA_O_BPTR); + offset = PKAWritePkaParamExtraOffset(a, length, offset, PKA_NO_POINTER_REG); + offset = PKAWritePkaParamExtraOffset(b, length, offset, PKA_NO_POINTER_REG); + + offset = PKAWritePkaParamExtraOffset(curvePointX, length, offset, PKA_O_CPTR); + offset = PKAWritePkaParamExtraOffset(curvePointY, length, offset, PKA_NO_POINTER_REG); + + // Update the result location. + // The resultPKAMemAddr may be 0 if we only want to check that we generated the point at infinity + if (resultPKAMemAddr) { + *resultPKAMemAddr = PKA_RAM_BASE + offset; + } + + // Load D pointer with the result location in PKA RAM. + HWREG(PKA_BASE + PKA_O_DPTR) = offset >> 2; + + // Set the PKA function to ECC-MULT and start the operation. + HWREG(PKA_BASE + PKA_O_FUNCTION) = PKA_FUNCTION_RUN_M | (0x05 << PKA_FUNCTION_SEQUENCER_OPERATIONS_S); + + return PKA_STATUS_SUCCESS; +} + + +//***************************************************************************** +// +// Start ECC Montgomery Multiplication. +// +//***************************************************************************** +uint32_t PKAEccMontgomeryMultiplyStart(const uint8_t *scalar, const uint8_t *curvePointX, const uint8_t *prime, const uint8_t *a, uint32_t length, uint32_t *resultPKAMemAddr) +{ + uint32_t offset = 0; + + // Check for the arguments. + ASSERT(scalar); + ASSERT(curvePointX); + ASSERT(prime); + ASSERT(a); + ASSERT(length <= PKA_MAX_CURVE_SIZE_32_BIT_WORD * sizeof(uint32_t)); + ASSERT(resultPKAMemAddr); + + // Make sure no PKA operation is in progress. + if (HWREG(PKA_BASE + PKA_O_FUNCTION) & PKA_FUNCTION_RUN) { + return PKA_STATUS_OPERATION_BUSY; + } + + offset = PKAWritePkaParam(scalar, length, offset, PKA_O_APTR); + + offset = PKAWritePkaParamExtraOffset(prime, length, offset, PKA_O_BPTR); + offset = PKAWritePkaParamExtraOffset(a, length, offset, PKA_NO_POINTER_REG); + + offset = PKAWritePkaParamExtraOffset(curvePointX, length, offset, PKA_O_CPTR); + + // Update the result location. + // The resultPKAMemAddr may be 0 if we only want to check that we generated the point at infinity + if (resultPKAMemAddr) { + *resultPKAMemAddr = PKA_RAM_BASE + offset; + } + + // Load D pointer with the result location in PKA RAM. + HWREG(PKA_BASE + PKA_O_DPTR) = offset >> 2; + + // Set the PKA function to Montgomery ECC-MULT and start the operation. + HWREG(PKA_BASE + PKA_O_FUNCTION) = PKA_FUNCTION_RUN_M | (0x02 << PKA_FUNCTION_SEQUENCER_OPERATIONS_S); + + return PKA_STATUS_SUCCESS; +} + + +//***************************************************************************** +// +// Get the result of ECC Multiplication +// +//***************************************************************************** +uint32_t PKAEccMultiplyGetResult(uint8_t *curvePointX, uint8_t *curvePointY, uint32_t resultPKAMemAddr, uint32_t length) +{ + return PKAGetECCResult(curvePointX, curvePointY, resultPKAMemAddr, length); +} + +//***************************************************************************** +// +// Start the ECC Addition. +// +//***************************************************************************** +uint32_t PKAEccAddStart(const uint8_t *curvePoint1X, const uint8_t *curvePoint1Y, const uint8_t *curvePoint2X, const uint8_t *curvePoint2Y, const uint8_t *prime, const uint8_t *a, uint32_t length, uint32_t *resultPKAMemAddr) +{ + uint32_t offset = 0; + + // Check for the arguments. + ASSERT(curvePoint1X); + ASSERT(curvePoint1Y); + ASSERT(curvePoint2X); + ASSERT(curvePoint2Y); + ASSERT(prime); + ASSERT(a); + ASSERT(resultPKAMemAddr); + + // Make sure no operation is in progress. + if (HWREG(PKA_BASE + PKA_O_FUNCTION) & PKA_FUNCTION_RUN) { + return PKA_STATUS_OPERATION_BUSY; + } + + offset = PKAWritePkaParamExtraOffset(curvePoint1X, length, offset, PKA_O_APTR); + offset = PKAWritePkaParamExtraOffset(curvePoint1Y, length, offset, PKA_NO_POINTER_REG); + + + offset = PKAWritePkaParamExtraOffset(prime, length, offset, PKA_O_BPTR); + offset = PKAWritePkaParamExtraOffset(a, length, offset, PKA_NO_POINTER_REG); + + offset = PKAWritePkaParamExtraOffset(curvePoint2X, length, offset, PKA_O_CPTR); + offset = PKAWritePkaParamExtraOffset(curvePoint2Y, length, offset, PKA_NO_POINTER_REG); + + // Copy the result vector location. + *resultPKAMemAddr = PKA_RAM_BASE + offset; + + // Load D pointer with the result location in PKA RAM. + HWREG(PKA_BASE + PKA_O_DPTR) = offset >> 2; + + // Set the PKA Function to ECC-ADD and start the operation. + HWREG(PKA_BASE + PKA_O_FUNCTION ) = PKA_FUNCTION_RUN_M | (0x03 << PKA_FUNCTION_SEQUENCER_OPERATIONS_S); + + return PKA_STATUS_SUCCESS; +} + +//***************************************************************************** +// +// Get the result of the ECC Addition +// +//***************************************************************************** +uint32_t PKAEccAddGetResult(uint8_t *curvePointX, uint8_t *curvePointY, uint32_t resultPKAMemAddr, uint32_t length) +{ + return PKAGetECCResult(curvePointX, curvePointY, resultPKAMemAddr, length); +} + +//***************************************************************************** +// +// Verify a public key against the supplied elliptic curve equation +// +//***************************************************************************** +uint32_t PKAEccVerifyPublicKeyWeierstrassStart(const uint8_t *curvePointX, const uint8_t *curvePointY, const uint8_t *prime, const uint8_t *a, const uint8_t *b, const uint8_t *order, uint32_t length) +{ + uint32_t pkaResult; + uint32_t resultAddress; + uint32_t resultLength; + uint8_t *scratchBuffer = (uint8_t *)(PKA_RAM_BASE + PKA_RAM_TOT_BYTE_SIZE / 2); + uint8_t *scratchBuffer2 = scratchBuffer + 512; + + + // Verify X in range [0, prime - 1] + PKABigNumCmpStart(curvePointX, + prime, + length); + + while(PKAGetOpsStatus() == PKA_STATUS_OPERATION_BUSY); + + pkaResult = PKABigNumCmpGetResult(); + + if (pkaResult != PKA_STATUS_A_LESS_THAN_B) { + return PKA_STATUS_X_LARGER_THAN_PRIME; + } + + // Verify Y in range [0, prime - 1] + PKABigNumCmpStart(curvePointY, + prime, + length); + + while(PKAGetOpsStatus() == PKA_STATUS_OPERATION_BUSY); + + pkaResult = PKABigNumCmpGetResult(); + + if (pkaResult != PKA_STATUS_A_LESS_THAN_B) { + return PKA_STATUS_Y_LARGER_THAN_PRIME; + } + + // Verify point on curve + // Short-Weierstrass equation: Y ^ 2 = X ^3 + a * X + b mod P + // Reduced: Y ^ 2 = X * (X ^ 2 + a) + b + + // tmp = X ^ 2 + PKABigNumMultiplyStart(curvePointX, length, curvePointX, length, &resultAddress); + + while(PKAGetOpsStatus() == PKA_STATUS_OPERATION_BUSY); + + resultLength = 200; + pkaResult = PKABigNumMultGetResult(scratchBuffer, &resultLength, resultAddress); + + if (pkaResult != PKA_STATUS_SUCCESS) { + return PKA_STATUS_FAILURE; + } + + // tmp += a + PKABigNumAddStart(scratchBuffer, resultLength, a, length, &resultAddress); + + while(PKAGetOpsStatus() == PKA_STATUS_OPERATION_BUSY); + + resultLength = 200; + pkaResult = PKABigNumAddGetResult(scratchBuffer, &resultLength, resultAddress); + + if (pkaResult != PKA_STATUS_SUCCESS) { + return PKA_STATUS_FAILURE; + } + + // tmp *= x + PKABigNumMultiplyStart(scratchBuffer, resultLength, curvePointX, length, &resultAddress); + + while(PKAGetOpsStatus() == PKA_STATUS_OPERATION_BUSY); + + resultLength = 200; + pkaResult = PKABigNumMultGetResult(scratchBuffer, &resultLength, resultAddress); + + if (pkaResult != PKA_STATUS_SUCCESS) { + return PKA_STATUS_FAILURE; + } + + // tmp += b + PKABigNumAddStart(scratchBuffer, resultLength, b, length, &resultAddress); + + while(PKAGetOpsStatus() == PKA_STATUS_OPERATION_BUSY); + + resultLength = 200; + pkaResult = PKABigNumAddGetResult(scratchBuffer, &resultLength, resultAddress); + + if (pkaResult != PKA_STATUS_SUCCESS) { + return PKA_STATUS_FAILURE; + } + + + // tmp2 = tmp % prime to ensure we have no fraction in the division. + // The number will only shrink from here on out. + PKABigNumModStart(scratchBuffer, resultLength, prime, length, &resultAddress); + + while(PKAGetOpsStatus() == PKA_STATUS_OPERATION_BUSY); + + // If the result is not a multiple of the word-length, the PKA HW will round up + // because it deals in words only. That means that using 'length' directly + // would cause and underflow, since length refers to the actual length in bytes of + // the curve parameters while the PKA HW reports that rounded up to the next + // word boundary. + // Use 200 as the resultLength instead since we are copying to the scratch buffer + // anyway. + // Practically, this only happens with curves such as NIST-P521 that are not word + // multiples. + resultLength = 200; + pkaResult = PKABigNumModGetResult(scratchBuffer2, resultLength, resultAddress); + + if (pkaResult != PKA_STATUS_SUCCESS) { + return PKA_STATUS_FAILURE; + } + + // tmp = y^2 + PKABigNumMultiplyStart(curvePointY, length, curvePointY, length, &resultAddress); + + while(PKAGetOpsStatus() == PKA_STATUS_OPERATION_BUSY); + + resultLength = 200; + pkaResult = PKABigNumMultGetResult(scratchBuffer, &resultLength, resultAddress); + + if (pkaResult != PKA_STATUS_SUCCESS) { + return PKA_STATUS_FAILURE; + } + + // tmp %= prime + PKABigNumModStart(scratchBuffer, resultLength, prime, length, &resultAddress); + + while(PKAGetOpsStatus() == PKA_STATUS_OPERATION_BUSY); + + // If the result is not a multiple of the word-length, the PKA HW will round up + // because it deals in words only. That means that using 'length' directly + // would cause and underflow, since length refers to the actual length in bytes of + // the curve parameters while the PKA HW reports that rounded up to the next + // word boundary. + // Use 200 as the resultLength instead since we are copying to the scratch buffer + // anyway. + // Practically, this only happens with curves such as NIST-P521 that are not word + // multiples. + resultLength = 200; + pkaResult = PKABigNumModGetResult(scratchBuffer, resultLength, resultAddress); + + if (pkaResult != PKA_STATUS_SUCCESS) { + return PKA_STATUS_FAILURE; + } + + // tmp ?= tmp2 + PKABigNumCmpStart(scratchBuffer, + scratchBuffer2, + length); + + while(PKAGetOpsStatus() == PKA_STATUS_OPERATION_BUSY); + + pkaResult = PKABigNumCmpGetResult(); + + if (pkaResult != PKA_STATUS_EQUAL) { + return PKA_STATUS_POINT_NOT_ON_CURVE; + } + else { + return PKA_STATUS_SUCCESS; + } +} + + +static uint32_t SHA2ExecuteHash(const uint8_t *message, uint8_t *resultDigest, uint32_t *intermediateDigest, uint32_t totalMsgLength, uint32_t messageLength, uint32_t hashAlgorithm, bool initialHash, bool finalHash); + + +void SHA2StartDMAOperation(uint8_t *channel0Addr, uint32_t channel0Length, uint8_t *channel1Addr, uint32_t channel1Length) { + + // Clear any outstanding events. + HWREG(CRYPTO_BASE + CRYPTO_O_IRQCLR) = CRYPTO_IRQCLR_RESULT_AVAIL_M | CRYPTO_IRQEN_DMA_IN_DONE_M; + + while(HWREG(CRYPTO_BASE + CRYPTO_O_IRQSTAT) & (CRYPTO_IRQSTAT_DMA_IN_DONE_M | CRYPTO_IRQSTAT_RESULT_AVAIL_M)); + + if (channel0Addr) { + // Configure the DMA controller - enable both DMA channels. + HWREGBITW(CRYPTO_BASE + CRYPTO_O_DMACH0CTL, CRYPTO_DMACH0CTL_EN_BITN) = 1; + + // Base address of the payload data in ext. memory. + HWREG(CRYPTO_BASE + CRYPTO_O_DMACH0EXTADDR) = (uint32_t)channel0Addr; + + // Payload data length in bytes, equal to the cipher text length. + HWREG(CRYPTO_BASE + CRYPTO_O_DMACH0LEN) = channel0Length; + } + + if (channel1Addr) { + // Enable DMA channel 1. + HWREGBITW(CRYPTO_BASE + CRYPTO_O_DMACH1CTL, CRYPTO_DMACH1CTL_EN_BITN) = 1; + + // Base address of the output data buffer. + HWREG(CRYPTO_BASE + CRYPTO_O_DMACH1EXTADDR) = (uint32_t)channel1Addr; + + // Output data length in bytes, equal to the cipher text length. + HWREG(CRYPTO_BASE + CRYPTO_O_DMACH1LEN) = channel1Length; + } +} + +uint32_t SHA2WaitForIRQFlags(uint32_t irqFlags) { + uint32_t irqTrigger = 0; + // Wait for the DMA operation to complete. Add a delay to make sure we are + // not flooding the bus with requests too much. + do { + CPUdelay(1); + } + while(!(HWREG(CRYPTO_BASE + CRYPTO_O_IRQSTAT) & irqFlags & (CRYPTO_IRQSTAT_DMA_IN_DONE_M | CRYPTO_IRQSTAT_RESULT_AVAIL_M))); + + // Save the IRQ trigger source + irqTrigger = HWREG(CRYPTO_BASE + CRYPTO_O_IRQSTAT); + + // Clear IRQ flags + HWREG(CRYPTO_BASE + CRYPTO_O_IRQCLR) = irqFlags; + + while(HWREG(CRYPTO_BASE + CRYPTO_O_IRQSTAT) & irqFlags & (CRYPTO_IRQSTAT_DMA_IN_DONE_M | CRYPTO_IRQSTAT_RESULT_AVAIL_M)); + + return irqTrigger; +} + +uint32_t SHA2ComputeInitialHash(const uint8_t *message, uint32_t *intermediateDigest, uint32_t hashAlgorithm, uint32_t initialMessageLength) { + ASSERT(message); + ASSERT((hashAlgorithm == SHA2_MODE_SELECT_SHA224) || + (hashAlgorithm == SHA2_MODE_SELECT_SHA256) || + (hashAlgorithm == SHA2_MODE_SELECT_SHA384) || + (hashAlgorithm == SHA2_MODE_SELECT_SHA512)); + ASSERT(!(intermediateDigest == NULL) && !((uint32_t)intermediateDigest & 0x03)); + + return SHA2ExecuteHash(message, (uint8_t *)intermediateDigest, intermediateDigest, initialMessageLength, initialMessageLength, hashAlgorithm, true, false); +} + +uint32_t SHA2ComputeIntermediateHash(const uint8_t *message, uint32_t *intermediateDigest, uint32_t hashAlgorithm, uint32_t intermediateMessageLength) { + ASSERT(message); + ASSERT(!(intermediateDigest == NULL) && !((uint32_t)intermediateDigest & 0x03)); + ASSERT((hashAlgorithm == SHA2_MODE_SELECT_SHA224) || + (hashAlgorithm == SHA2_MODE_SELECT_SHA256) || + (hashAlgorithm == SHA2_MODE_SELECT_SHA384) || + (hashAlgorithm == SHA2_MODE_SELECT_SHA512)); + + return SHA2ExecuteHash(message, (uint8_t *)intermediateDigest, intermediateDigest, 0, intermediateMessageLength, hashAlgorithm, false, false); +} + +uint32_t SHA2ComputeFinalHash(const uint8_t *message, uint8_t *resultDigest, uint32_t *intermediateDigest, uint32_t totalMsgLength, uint32_t messageLength, uint32_t hashAlgorithm) { + ASSERT(message); + ASSERT(totalMsgLength); + ASSERT(!(intermediateDigest == NULL) && !((uint32_t)intermediateDigest & 0x03)); + ASSERT(resultDigest); + ASSERT((hashAlgorithm == SHA2_MODE_SELECT_SHA224) || + (hashAlgorithm == SHA2_MODE_SELECT_SHA256) || + (hashAlgorithm == SHA2_MODE_SELECT_SHA384) || + (hashAlgorithm == SHA2_MODE_SELECT_SHA512)); + + return SHA2ExecuteHash(message, resultDigest, intermediateDigest, totalMsgLength, messageLength, hashAlgorithm, false, true); +} + +uint32_t SHA2ComputeHash(const uint8_t *message, uint8_t *resultDigest, uint32_t totalMsgLength, uint32_t hashAlgorithm) { + ASSERT(message); + ASSERT(totalMsgLength); + ASSERT(resultDigest); + ASSERT((hashAlgorithm == SHA2_MODE_SELECT_SHA224) || + (hashAlgorithm == SHA2_MODE_SELECT_SHA256) || + (hashAlgorithm == SHA2_MODE_SELECT_SHA384) || + (hashAlgorithm == SHA2_MODE_SELECT_SHA512)); + + return SHA2ExecuteHash(message, resultDigest, 0, totalMsgLength, totalMsgLength, hashAlgorithm, true, true); +} + +static uint32_t SHA2ExecuteHash(const uint8_t *message, uint8_t *resultDigest, uint32_t *intermediateDigest, uint32_t totalMsgLength, uint32_t messageLength, uint32_t hashAlgorithm, bool initialHash, bool finalHash) { + uint8_t digestLength = 0; + uint32_t dmaAlgorithmSelect = 0; + + SHA2ClearDigestAvailableFlag(); + + switch (hashAlgorithm) { + case SHA2_MODE_SELECT_SHA224: + digestLength = SHA2_SHA224_DIGEST_LENGTH_BYTES; + dmaAlgorithmSelect = SHA2_ALGSEL_SHA256; + break; + case SHA2_MODE_SELECT_SHA256: + digestLength = SHA2_SHA256_DIGEST_LENGTH_BYTES; + dmaAlgorithmSelect = SHA2_ALGSEL_SHA256; + break; + case SHA2_MODE_SELECT_SHA384: + digestLength = SHA2_SHA384_DIGEST_LENGTH_BYTES; + dmaAlgorithmSelect = SHA2_ALGSEL_SHA512; + break; + case SHA2_MODE_SELECT_SHA512: + digestLength = SHA2_SHA512_DIGEST_LENGTH_BYTES; + dmaAlgorithmSelect = SHA2_ALGSEL_SHA512; + break; + default: + return SHA2_INVALID_ALGORITHM; + } + + if (initialHash && finalHash) { + // The empty string is a perfectly valid message. It obviously has a length of 0. The DMA cannot + // handle running with a transfer length of 0. This workaround depends on the hash engine adding the + // trailing 1 bit and 0-padding bits after the DMAtransfer is complete and not in the DMA itself. + // totalMsgLength is purposefully not altered as it is appended to the end of the message during finalization + // and determines how many padding-bytes are added. + // Altering totalMsgLength would alter the final hash digest. + // Because totalMsgLength specifies that the message is of length 0, the content of the byte loaded + // through the DMA is irrelevant. It is overwritten internally in the hash engine. + messageLength = messageLength ? messageLength : 1; + } + + // Setting the incorrect number of bits here leads to the calculation of the correct result + // but a failure to read them out. + // The tag bit is set to read out the digest via DMA rather than through the slave interface. + SHA2SelectAlgorithm(dmaAlgorithmSelect | (resultDigest ? SHA2_ALGSEL_TAG : 0)); + SHA2IntClear(SHA2_DMA_IN_DONE | SHA2_RESULT_RDY); + SHA2IntEnable(SHA2_DMA_IN_DONE | SHA2_RESULT_RDY); + + HWREG(CRYPTO_BASE + CRYPTO_O_HASHMODE) = hashAlgorithm | (initialHash ? CRYPTO_HASHMODE_NEW_HASH_M : 0); + + // Only load the intermediate digest if requested. + if (intermediateDigest && !initialHash) { + SHA2SetDigest(intermediateDigest, digestLength); + } + + // If this is the final hash, finalization is required. This means appending a 1 bit, padding the message until this section + // is 448 bytes long, and adding the 64 bit total length of the message in bits. Thankfully, this is all done in hardware. + if (finalHash) { + // This specific length must be specified in bits not bytes. + SHA2SetMessageLength(totalMsgLength * 8); + HWREG(CRYPTO_BASE + CRYPTO_O_HASHIOBUFCTRL) = CRYPTO_HASHIOBUFCTRL_PAD_DMA_MESSAGE_M; + + } + + // The cast is fine in this case. SHA2StartDMAOperation channel one serves as input and no one does + // hash operations in-place. + SHA2StartDMAOperation((uint8_t *)message, messageLength, resultDigest, digestLength); + + return SHA2_SUCCESS; +} diff --git a/third_party/ti/devices/cc13x2_cc26x2/rom/driverlib.elf b/third_party/ti/devices/cc13x2_cc26x2/rom/driverlib.elf index 993929ecd6f410c1c4b8988ad309871860f91542..9d09f2a81df3a69550850f8a5b9ec2ce5e9a9d69 100644 GIT binary patch literal 372940 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%0ACpwatezd#k<=b~9kj<{>UghbUXgmT zt1FXvKv_;x&t5!Un!+kwXqT)Q-caAjeV+Ard0($c*`}(pN^V+PY8#tXw&=OY6uNl_ zJH>l@Wml4>l1N4F-Axsn>b3e4pD0)Lj#nxx1azfn`}=R#OR@mq@5--nF<12k4 z+ap%Fzn;}sXZ4@r> ze9!Xfo$PiKdw0k2#kerw!+*!RPVpnh%y*7j(#NhyMEG^NMQHjb28kmD7PfL3qYGr93xh1_?wHuiG5!F3#VpQFLxaxE;tWE=^x=kk<)dfijC?*e`?kd%A2Te)=5!yLDU3s7F4H$VRafP)jfKWQC%2)T6Kiq zHxF})Kh~<##?`3pbTF(=1Esn}CmYp;9Z9Q>f#gxD``al5U2}77rm?!36(OVbviniq zperrLU0qhc|yD#O+;6=13EMd`9cp<7hZQkO}W^~*?>s8s%eMYYvsvN~kKor~%k z$}+X(QBEc{{hS7fy+1yc4#JR8J1ip|B2&%&Q&EbJW}@yfhdaf8JnjDvHqY*-*~|@n zjLkmk9`ZGAfJzvU%PLG47aUo1UTaxH3+>WULu*H#&iz_ZQ*~Wsqt_;x#@3c}s}>ub z3WKK1l=iDEueTenD^cJH50i5aDiq52yI4{&53t{!y4-k*Tk&&s0{`*Pd5j;RkGNz#mzJ z%EK!X{8T`9v8W=QnStTbm?^8PYaGFd-efk7ObmbCKeVX%{DzjAOl9rxQa`{;hlK-V z5aDq-+#`-~itiry)wXi`z<4VO-u+k^7tV-C#ZVXm-Qw~==0*hW8t`_fTP@y0X0+BV*FX10w3ygr%Kh=J5yel)kmL%-VA z{bOjnbtU2bkv-aobx7Ttj&X`_IP0rz-RiTltqX5!ZNmmS?)aWg@!Q}0YTNYlv$Jg) z)L}dZQuiCZoZ?@XeYLIov@G7bDeby`B)#P__3O= zwtd@cV(d#CCQBG6Z|%$d*EwHptA2e>wpINT`x+9r?O6I6R@IgcFX`9sT)FqwZr+&y zDjhyB3zlc^bMtxyWej<*b_;dSJkBZJbgoxJX%>@LK}i-&1$+GpC}M~`ehqXNLBFid zr_WYD`{CZ3g{kwDFV*tQi19}${@4M>3yB=N434PlME;OY zbMgsJ@r~yt>9O)WU61}T{s42Q!0}2V#~za-#vlFh$4WSEYf94NnI=Pz7=QG~AA8_< zBavfPv&^&0#`h6TWofpMhm&j;>JB}T`Tyo5T{hS};oP9X!|dQJc>bQqGrz^sC%k1h zc(@2{falScBz@kpdBRpQcxb0Xi*-@?L{B@5MALlVr7QJNE>c@)m8PvU6cj$bU^jD<&4*JVI$AMNJJn#O;0( z9eo7TK2`ONP3LFiy^P2hoRu!CIJaz=jzPOEq>b{+TB1arhqyOGd)G+zuGQAn@)RRW zEw!e@#j57oicCXmeR)+=RHrPtJU>#Y9WK!*dI8*Ru)hO)T_X!3R(WZFIp?eLx>QjF zm|K3bQ~b>Nc|{|55u+)K2ivQe1}cTv9YPL zwxO&=cV=PH$XFaBUcW#YVdqeWXt?_!)hzs0UQyNX=GMrWI5}+sg+*0HhR#K4BTdC? zzNIRz$^`S7szw3a)>E9~pN^uB8O+@dEh@`YjjXyL!<2n%P)>SQ9zirbQ&zznFPbAe zv#--AFMExjAEj!p$WT=#2n$ua0^K!eaNUJ@@YZPeKc2B#SEp+<=}Ao0lhn83LRBAi zg{$wXx&U*_Pj!kvr?zHZc513RueGY7f>%4$fP&q_n_J3SA_Rk*tImtkm|A63{Ln?J z;wpNK%B(65Fn0wN|Lvl@qTw~eaYu7YRXS56o5&+-f>a61nsglFZpx@SyexhpRfP|^ zC!XdM|1LxCFB_RjYi$OvO#Svx2Lr9QxP<>&SrM_r<%6&u#h@x7?cPKU3;F7~ypz>b zR-Z`+UBw%73%!b~^omh@{l!XgDU?y-kTn3^51@V*YX225omj?zxuX>e@~~P(5@2pk zKUO9$30xfcl})wk9-^Oy_VB#I%%IkVW%()CIIk^u5d-34&9c01VLmNp^ExX^J!^Cw z?61|1QGdQf83lV*i#qOH%=yz8%&BeABd$l$@QPuj>EMCMYs^4DZ2??UP`5c!P|q7_ zs2h!jKN_oPnAN2`pD=)btHde(!`M8}_I~N$e#z4dRk>J{=`SImDvRBkf9O!dn@xn8 zKaOg)Ji`lRrB3mW+wzL!ZJ+R}8+Ks{m(^`bZ$FQ9u~eWt4W>WBq}n`cA7Q!qQpHju zuSNR%53HLoL*lN6@4-ux_}-4=3&KZ*vc|^^*@69?;(sUdEx#;AzaYk9__#5<5WW{L zOVV#&9A7YI#PD&0wj91i
  • CC13x0
      -
    • [RF_PATCH]: GHS Added new CPE/MCE patch set for general high-speed GenFSK ("ghs" patch). CPE patch is identical to GenFSK.
    • +
    • [RF_PATCH]: GHS Added new CPE/MCE patch set for general high-speed GenFSK ("ghs" patch). CPE patch is identical to GenFSK.
    • [RF_PATCH]: BREPEAT Added new CPE/MCE patch set for using bit-repeat mode ("brepeat" patch), for symbol rate. CPE patch is identical to GenFSK.
    • -
    • [RF_API] Headers: In CPE commands CMD_PROP_RADIO_SETUP and CMD_PROP_RADIO_DIV_SETUP, the struct bit fields symbolRate.bPdifDecim and symbolRate.pdifDecim have been joined into one field, symbolRate.decimMode, with unchanged functionality. This change is to have same API for CC13x0 as exists for CC13x2 and CC26x2 devices. This field is needed used when using "brepeat" radio patch.
    • +
    • [RF_API] Headers: In CPE commands CMD_PROP_RADIO_SETUP and CMD_PROP_RADIO_DIV_SETUP, the struct bit fields symbolRate.bPdifDecim and symbolRate.pdifDecim have been joined into one field, symbolRate.decimMode, with unchanged functionality. This change is to have same API for CC13x0 as exists for CC13x2 and CC26x2 devices. This field is needed used when using "brepeat" radio patch.
  • CC13x2_CC26x2
      @@ -173,14 +1558,12 @@
      • CC26x0
        • -
        • [RF_PATCH] General: CMD_SCH_IMM could cause loss of commands.
        • +
        • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • CC26x0R2
        • [RF_API] General: GPO control not functional. (The PA_EN status signal does not go low).
      • -
        -
      • For an updated list of known issues (including issues found after the release), see CC13xx_CC26xx_driverlib on the Texas Instruments wiki.
      @@ -207,13 +1590,11 @@

      Known issues

      • CC26x0
      • -
      • CC26x0R2 + CC26x0R2
        • [RF_API] General: GPO control not functional.
        • -
        • [RF_PATCH] General: CMD_SCH_IMM could cause loss of commands.
        • +
        • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • -
        -
      • For an updated list of known issues (including issues found after the release), see CC13xx_CC26xx_driverlib on the Texas Instruments wiki.
      @@ -257,13 +1638,11 @@

      Known issues

      • CC26x0
      • -
      • CC26x0R2 + CC26x0R2
        • [RF_API] General: GPO control not functional.
        • -
        • [RF_PATCH] General: CMD_SCH_IMM could cause loss of commands.
        • +
        • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • -
        -
      • For an updated list of known issues (including issues found after the release), see CC13xx_CC26xx_driverlib on the Texas Instruments wiki.
      @@ -316,13 +1695,11 @@

      Known issues

      • CC26x0
      • -
      • CC26x0R2 + CC26x0R2
        • [RF_API] General: GPO control not functional.
        • -
        • [RF_PATCH] General: CMD_SCH_IMM could cause loss of commands.
        • +
        • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • -
        -
      • For an updated list of known issues (including issues found after the release), see CC13xx_CC26xx_driverlib on the Texas Instruments wiki.
      @@ -353,13 +1730,11 @@

      Known issues

      • CC26x0
      • -
      • CC26x0R2 + CC26x0R2
        • [RF_API] General: GPO control not functional.
        • -
        • [RF_PATCH] General: CMD_SCH_IMM could cause loss of commands.
        • +
        • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • -
        -
      • For an updated list of known issues (including issues found after the release), see CC13xx_CC26xx_driverlib on the Texas Instruments wiki.
      @@ -396,13 +1771,11 @@

      Known issues

      • CC26x0
      • -
      • CC26x0R2 + CC26x0R2
        • [RF_API] General: GPO control not functional.
        • -
        • [RF_PATCH] General: CMD_SCH_IMM could cause loss of commands.
        • +
        • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • -
        -
      • For an updated list of known issues (including issues found after the release), see CC13xx_CC26xx_driverlib on the Texas Instruments wiki.
      @@ -439,13 +1812,11 @@

      Known issues

      • CC26x0
      • -
      • CC26x0R2 + CC26x0R2
        • [RF_API] General: GPO control not functional.
        • -
        • [RF_PATCH] General: CMD_SCH_IMM could cause loss of commands.
        • +
        • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • -
        -
      • For an updated list of known issues (including issues found after the release), see CC13xx_CC26xx_driverlib on the Texas Instruments wiki.
      @@ -484,12 +1855,10 @@

      Known issues

      • CC26x0
      • -
      • CC26x0R2 + CC26x0R2
          -
        • [RF_PATCH] General: CMD_SCH_IMM could cause loss of commands.
        • +
        • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • -
        -
      • For an updated list of known issues (including issues found after the release), see CC13xx_CC26xx_driverlib on the Texas Instruments wiki.
      @@ -559,19 +1928,17 @@
  • CC13x0
      -
    • [RF_PATCH] General: CMD_SCH_IMM could cause loss of commands. Fixed with CPE patch.
    • +
    • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands. Fixed with CPE patch.
  • Known issues

    • CC26x0
    • -
    • CC26x0R2 + CC26x0R2
        -
      • [RF_PATCH] General: CMD_SCH_IMM could cause loss of commands.
      • +
      • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
    • -
      -
    • For an updated list of known issues (including issues found after the release), see CC13xx_CC26xx_driverlib on the Texas Instruments wiki.
    @@ -601,7 +1968,7 @@

    Bug fixes

    • CC26x0
    • -
    • CC26x0R2 + CC26x0R2
      • [RF_API] Updated comment of txPower field to better describe function.
    • @@ -610,7 +1977,6 @@

      Known issues

      • None
      • -
      • For an updated list of known issues (including issues found after the release), see CC13xx_CC26xx_driverlib on the Texas Instruments wiki.
      @@ -652,7 +2018,6 @@

      Known issues

      • None
      • -
      • For an updated list of known issues (including issues found after the release), see CC13xx_CC26xx_driverlib on the Texas Instruments wiki.
      @@ -713,7 +2078,6 @@

      Known issues

      • None
      • -
      • For an updated list of known issues (including issues found after the release), see CC13xx_CC26xx_driverlib on the Texas Instruments wiki.
  • 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 z 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 diff --git a/third_party/ti/devices/cc13x2_cc26x2/startup_files/ccfg.c b/third_party/ti/devices/cc13x2_cc26x2/startup_files/ccfg.c index cee4b931e..00c0c9c56 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/startup_files/ccfg.c +++ b/third_party/ti/devices/cc13x2_cc26x2/startup_files/ccfg.c @@ -1,12 +1,12 @@ /****************************************************************************** * Filename: ccfg.c -* Revised: $Date: 2017-11-02 11:36:28 +0100 (to, 02 nov 2017) $ +* Revised: $Date: 2017-11-02 11:36:28 +0100 (Thu, 02 Nov 2017) $ * Revision: $Revision: 18030 $ * * Description: Customer Configuration for: -* CC13x2, CC13x4, CC26x2, CC26x4 device family (HW rev 1). +* CC13x2, CC13x4, CC26x2, CC26x4 device family (HW rev 2). * -* Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/ +* Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com/ * * * Redistribution and use in source and binary forms, with or without @@ -118,7 +118,7 @@ #endif #ifndef SET_CCFG_MODE_CONF_1_ALT_DCDC_IPEAK -#define SET_CCFG_MODE_CONF_1_ALT_DCDC_IPEAK 0x4 // Peak current +#define SET_CCFG_MODE_CONF_1_ALT_DCDC_IPEAK 0x0 // Peak current #endif //##################################### diff --git a/third_party/ti/devices/cc13x2_cc26x2/startup_files/startup_ccs.c b/third_party/ti/devices/cc13x2_cc26x2/startup_files/startup_ccs.c index 3c4ee50ea..f81ec967d 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/startup_files/startup_ccs.c +++ b/third_party/ti/devices/cc13x2_cc26x2/startup_files/startup_ccs.c @@ -1,6 +1,6 @@ /****************************************************************************** * Filename: startup_ccs.c -* Revised: $Date: 2017-02-03 19:16:24 +0100 (fr, 03 feb 2017) $ +* Revised: $Date: 2017-02-03 19:16:24 +0100 (Fri, 03 Feb 2017) $ * Revision: $Revision: 17634 $ * * Description: Startup code for CC26x2 device family for use with CCS. diff --git a/third_party/ti/devices/cc13x2_cc26x2/startup_files/startup_gcc.c b/third_party/ti/devices/cc13x2_cc26x2/startup_files/startup_gcc.c index 3d02145fe..6851e3148 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/startup_files/startup_gcc.c +++ b/third_party/ti/devices/cc13x2_cc26x2/startup_files/startup_gcc.c @@ -1,6 +1,6 @@ /****************************************************************************** * Filename: startup_gcc.c -* Revised: $Date: 2017-06-01 16:01:48 +0200 (to, 01 jun 2017) $ +* Revised: $Date: 2017-06-01 16:01:48 +0200 (Thu, 01 Jun 2017) $ * Revision: $Revision: 17804 $ * * Description: Startup code for CC26x2 device family for use with GCC. diff --git a/third_party/ti/devices/cc13x2_cc26x2/startup_files/startup_iar.c b/third_party/ti/devices/cc13x2_cc26x2/startup_files/startup_iar.c index 491849d1d..b5680d505 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/startup_files/startup_iar.c +++ b/third_party/ti/devices/cc13x2_cc26x2/startup_files/startup_iar.c @@ -1,6 +1,6 @@ /****************************************************************************** * Filename: startup_iar.c -* Revised: $Date: 2017-02-03 19:16:24 +0100 (fr, 03 feb 2017) $ +* Revised: $Date: 2017-02-03 19:16:24 +0100 (Fri, 03 Feb 2017) $ * Revision: $Revision: 17634 $ * * Description: Startup code for CC26x2 device family for use with IAR. diff --git a/third_party/ti/devices/cc13x2_cc26x2/startup_files/startup_keil.s b/third_party/ti/devices/cc13x2_cc26x2/startup_files/startup_keil.s index cce982846..0a4f81416 100644 --- a/third_party/ti/devices/cc13x2_cc26x2/startup_files/startup_keil.s +++ b/third_party/ti/devices/cc13x2_cc26x2/startup_files/startup_keil.s @@ -1,6 +1,6 @@ ; /****************************************************************************** ; * Filename: startup_keil.c -; * Revised: $Date: 2016-09-13 11:33:40 +0200 (ti, 13 sep 2016) $ +; * Revised: $Date: 2016-09-13 11:33:40 +0200 (Tue, 13 Sep 2016) $ ; * Revision: $Revision: 17320 $ ; * ; * Description: Startup code for CC26xx device family for use with KEIL. diff --git a/third_party/ti/release_notes_driverlib_cc13xx_cc26xx.html b/third_party/ti/release_notes_driverlib_cc13xx_cc26xx.html index e984d58fd..07ae5e637 100644 --- a/third_party/ti/release_notes_driverlib_cc13xx_cc26xx.html +++ b/third_party/ti/release_notes_driverlib_cc13xx_cc26xx.html @@ -78,6 +78,1393 @@ +

    +

    driverlib_cc13xx_cc26xx_3_05_06_18894

    +
    + Release date: Feb 27, 2019
    + +

    New features

    +
      +
    • None
    • +
    + +

    Improvements

    +
      +
    • None
    • +
    + +

    Bug fixes

    +
      +
    • CC13x2_CC26x2
    • +
        +
      • [RF_PATCH] CC13X2P/R, CC26X2: CPE patches had equal NWORD definitions, which this update fixes.
      • +
      • [RF_PATCH] CC13X2P/R, CC26X2: Updated BLE patches due to BLE tester failure.
      • +
      +
    • CC26x0R2 +
        +
      • [RF_PATCH] CC2640R2F: Updated BLE patches due to BLE tester failure.
      • +
    • +
    + +

    Known issues

    +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal, available in IO Controller as "RFC_GPO1", signaling the "PA_EN" status signal is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far support only differential front-end mode only, and will need a run-time modification (not implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_05_05_18873

    +
    + Release date: Feb 15, 2019
    + +

    New features

    +
      +
    • CC13x2_CC26x2 +
        +
      • [DRV_API] OSC: New API functions called OSC_IsHPOSCEnabledWithHfDerivedLfClock() and OSC_HPOSCRtcCompensate()have been added for support of future device variant with HPOSC.
      • +
    • +
    + +

    Improvements

    +
      +
    • None
    • +
    + +

    Bug fixes

    +
      +
    • None
    • +
    + +

    Known issues

    +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal, available in IO Controller as "RFC_GPO1", signaling the "PA_EN" status signal is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far support only differential front-end mode only, and will need a run-time modification (not implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_05_04_18846

    +
    + Release date: Jan 31, 2019
    + +

    New features

    +
      +
    • CC26x0R2
    • + CC26x0
      + CC13x0
      +
        +
      • [DRV_API] AES: New API for AES crypto functions has been added by the aes.c and aes.h files.
      • +
      +
    • CC13x2_CC26x2 +
        +
      • [RF_PATCH] CC13X2R, CC13X2P, CC26X2: Multiprotocol patch including RTLS, implementing AoA/AoD for Bluetooth 5.1 and time-of-flight.
      • +
    • +
    + +

    Improvements

    +
      +
    • None
    • +
    + +

    Bug fixes

    +
      +
    • CC26x0R2
    • +
        +
      • [RF_PATCH] CC2640R2: Bug fix for Bluetooth CTE generic RX.
      • +
      • [RF_PATCH] CC2640R2: Updated time-of-flight patches (MCE, RFE and CPE) for CC2640R2, including new commandNo, fix for double buffer and removal of STIM compensation.
      • +
      +
    + +

    Known issues

    +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal, available in IO Controller as "RFC_GPO1", signaling the "PA_EN" status signal is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far support only differential front-end mode only, and will need a run-time modification (not implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_05_03_18798

    +
    + Release date: Dec 06, 2018
    + +

    New features

    +
      +
    • Changes that apply to all devices +
        +
      • [DRV_API] I2S: New static inline API function called I2SWclkCounterReset() has been added.
      • +
    • +
    • CC13x2_CC26x2
    • +
        +
      • [DRV_SRC] OSC: Support for future device variant with HPOSC has been added.
      • +
      +
    + +

    Improvements

    +
      +
    • CC13x2_CC26x2
    • +
        +
      • [DRV_SRC] CCFG: Default IPEAK setting changed to 0 for optimized power consumption.
      • +
      +
    + +

    Bug fixes

    +
      +
    • CC13x2_CC26x2
    • +
        +
      • [DRV_SRC]: Corrected handling of VDDR boost mode. Boost mode can be enabled in CCFG.
      • +
      +
    • CC26x0R2 +
        +
      • [RF_PATCH] CC2640R2F: Bugfix regarding BLE CTE GRX CPE patch, there was a missing include in the Makefile which caused the patch not to function.
      • +
    • +
    + +

    Known issues

    +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal, available in IO Controller as "RFC_GPO1", signaling the "PA_EN" status signal is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far support only differential front-end mode only, and will need a run-time modification (not implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_05_02_18760

    +
    + Release date: Nov 02, 2018
    + +

    New features

    +
      +
    • Changes that apply to all devices +
        +
      • [DRV_API] I2S: New API has been added. Legacy API is marked as deprecated.
      • +
    • +
    • CC13x2_CC26x2
    • +
        +
      • [RF_PATCH] CC13X2, CC26X2: Release of IQ-dump patch.
      • +
      • [RF_PATCH] CC26X2: API definitions needed for HPOSC support.
      • +
      +
    • CC26x0R2 +
        +
      • [RF_PATCH] CC2640R2F: Updated time of flight (ToF) patches. Includes bug and stability fixes, STIM and correlation compensation integration and features which reduce RAM usage for the system. UserFunAddr = 0x21000914 for this CPE patch.
      • +
      • [RF_PATCH] CC2640R2F: Release of patches for AoA support using constant tone extension (CTE).
      • +
    • +
    + +

    Improvements

    +
      +
    • Changes that apply to all devices +
        +
      • [DRV_DOC] General: General improvement of the documentation.
      • +
    • +
    + +

    Bug fixes

    +
      +
    • CC13x2_CC26x2
    • +
        +
      • [DRV_API]: The rom.h file contains defines with wrong AUXIOn indexes.
      • +
      • [RF_PATCH] CC1352P, CC1352R, CC2652R: Bug fix regarding RSSI value read-out for 1 and 2 Mbps BLE and Multi.
      • +
      +
    • CC13x0 +
        +
      • [RF_PATCH] CC1350, CC1310: A bug was found in the release script, which resulted in the patches not being cleaned properly before export. This caused the CS bug fix to not be up to date. This update includes the latest fixes in the CC13x0 related to the CS fix in prop CPE patches.
      • +
      • [RF_PATCH] CC1350, CC1310: Updated wireless M-bus CT mode MCE patch. This patch includes two bug-fixes.
      • +
    • +
    + +

    Known issues

    +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal, available in IO Controller as "RFC_GPO1", signaling the "PA_EN" status signal is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far support only differential front-end mode only, and will need a run-time modification (not implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_05_01_18740

    +
    + Release date: Oct 11, 2018
    + +

    New features

    +
      +
    • None
    • +
    + +

    Improvements

    +
      +
    • CC13x2_CC26x2
    • +
        +
      • [DRV_DOC] General: General improvement of the documentation.
      • +
      +
    + +

    Bug fixes

    +
      +
    • CC13x0 +
        +
      • [RF_PATCH] CC1350, CC1310: Bug fix in WMBUS CT-mode MCE, where if the 1st bit was 1, an error floor was present. This patch includes a fix to that bug.
      • +
    • +
    + +

    Known issues

    +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal, available in IO Controller as "RFC_GPO1", signaling the "PA_EN" status signal is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far support only differential front-end mode only, and will need a run-time modification (not implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_05_00_18715

    +
    + Release date: Sep 24, 2018
    + +

    New features

    +
      +
    • CC13x2_CC26x2 +
        +
      • [DRV_SRC] General: Driverlib does no longer support early revisions of the CC13x2/CC26x2 devices forcing the driverlib folder "cc13x2_cc26x2_v1" to have been removed.
      • +
      • [DRV_SRC] General: Driverlib folder "cc13x2_cc26x2_v2" for supported CC13x2/CC26x2 devices has been renamed to "cc13x2_cc26x2".
      • +
      • [DRV_SRC] rom_crypto: Added access to ECC crypto functions in ROM by the new rom_crypto driverlib module. These functions can only to be used in applications not containing the BLE SW stack. Note that if these functions are called by the application they will make use of the SRAM address range of 0x2000012C - 0x200001AB as a scratch pad area. Calling any of these functions will require the linker file to be updated with the specified SRAM area.
      • +
      • [RF_PATCH] CC13X2, CC26X2: Release of IQ-dump patch.
      • +
    • +
    + +

    Improvements

    +
      +
    • CC13x2_CC26x2
    • +
        +
      • [DRV_DOC] General: General improvement of the documentation.
      • +
      +
    + +

    Bug fixes

    +
      +
    • CC13x2_CC26x2 +
        +
      • [RF_PATCH] CC13X2, CC26X2: Bug fix regarding the generation of the .bin-files used for CPE patches.
      • +
    • +
    • CC13x0 +
        +
      • [RF_PATCH] CC13X0: (Re-)relase of bitrepetition RFE patch, used to be genfsk patch but for consistency it has now been copied and renamed to brepeat. No changes in patch has been made except for the name.
      • +
    • +
    + +

    Known issues

    +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal, available in IO Controller as "RFC_GPO1", signaling the "PA_EN" status signal is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far support only differential front-end mode only, and will need a run-time modification (not implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_04_16_18623

    +
    + Release date: Aug 17, 2018
    + +

    New features

    +
      +
    • None
    • +
    + +

    Improvements

    +
      +
    • None
    • +
    + +

    Bug fixes

    +
      +
    • CC13x2_CC26x2_v2
    • + CC13x2_CC26x2_v1
      +
        +
      • [RF_PATCH] CC13X2, CC26X2: Repeat mode with Sniff Command; a flag was not cleared in CPE when running which is solved with this patch.
      • +
      • [RF_PATCH] CC13X2, CC26X2: Patch that fixes the case where RX end time may be delayed in sniff mode.
      • +
      +
    • CC13x0 +
        +
      • [RF_PATCH] CC13X0: Repeat mode with Sniff Command; a flag was not cleared in CPE when running which is solved with this patch.
      • +
      • [RF_PATCH] CC13X0: Patch that fixes the case where RX end time may be delayed in sniff mode.
      • +
    • +
    + +

    Known issues

    +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal, available in IO Controller as "RFC_GPO1", signaling the "PA_EN" status signal is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far support only differential front-end mode only, and will need a run-time modification (not implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_04_15_18598

    +
    + Release date: Aug 09, 2018
    + +

    New features

    +
      +
    • None
    • +
    + +

    Improvements

    +
      +
    • CC13x2_CC26x2_v2
    • + CC13x2_CC26x2_v1
      +
        +
      • [DRV_SRC] RFC: Re-distribute the functionality between driverlib and RF driver required by the High Gain PA configuration.
      • +
      +
    + +

    Bug fixes

    +
      +
    • None
    • +
    + +

    Known issues

    +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal, available in IO Controller as "RFC_GPO1", signaling the "PA_EN" status signal is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far support only differential front-end mode only, and will need a run-time modification (not implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_04_14_18578

    +
    + Release date: Aug 01, 2018
    + +

    New features

    +
      +
    • CC13x2_CC26x2_v2
    • +
        +
      • [RF_API] CC1312R, CC1352R, CC1352P, CC2642R, CC2652R: Updated API header files to extend common API with new commands to set TX power with possibility to switch between PAs (only applicable to CC1352P): A new command "CMD_CHANGE_PA" and a new CPE interrupt line definition "IRQ_PA_CHANGED" has been added, and new extended variants for each of the existing radio setup command has been introduced ("CMD_RADIO_SETUP_PA", "CMD_BLE5_RADIO_SETUP_PA", "CMD_PROP_RADIO_SETUP_PA", "CMD_PROP_RADIO_DIV_SETUP_PA") with additional PA switching fields -- these additional fields will be used by RF driver when switching PA, not radio CPU. Separately, a new common CPE command "CMD_SET_CMD_START_IRQ" has been added that can be used by RF driver to get interrupt notification when a background/foreground radioOp command starts (e.g. for IEEE 802.15.4 protocols).
      • +
      +
    • CC13x2_CC26x2_v2
    • + CC13x2_CC26x2_v1
      +
        +
      • [DRV_SRC] RFC: Expand the RFCOverrideUpdate to handle the front-end specific overrides.
      • +
      • [DRV_SRC] Crypto PKA: Added function to erase PKA RAM.
      • +
      +
    • CC26x0R2 +
        +
      • [RF_PATCH] CC2640R2F: Updated CPE patch used for time-of-flight measurements ("tof"). This includes the passive node functionality.
      • +
    • +
    + +

    Improvements

    +
      +
    • CC13x2_CC26x2_v2
    • +
        +
      • [DRV_DOC] General: General improvement of the documentation.
      • +
      +
    + +

    Bug fixes

    +
      +
    • CC13x2_CC26x2_v2
    • + CC13x2_CC26x2_v1
      +
        +
      • [DRV_SRC] Setup and OSC: DCDC without clock loss detection while switching to XOSC_HF.
      • +
      +
    + +

    Known issues

    +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal, available in IO Controller as "RFC_GPO1", signaling the "PA_EN" status signal is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far support only differential front-end mode only, and will need a run-time modification (not implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_04_13_18486

    +
    + Release date: May 30, 2018
    + +

    New features

    +
      +
    • None
    • +
    + +

    Improvements

    +
      +
    • None
    • +
    + +

    Bug fixes

    +
      +
    • CC26x0R2 +
        +
      • [RF_PATCH] CC2640R2F: Updated MCE patch used for time-of-flight measurements ("tof"). This corrects a build problem with the previous patch that caused it to not work as intended.
      • +
    • +
    + +

    Known issues

    +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal, available in IO Controller as "RFC_GPO1", signaling the "PA_EN" status signal is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far support only differential front-end mode only, and will need a run-time modification (not implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_04_12_18461

    +
    + Release date: May 15, 2018
    + +

    New features

    +
      +
    • None
    • +
    + +

    Improvements

    +
      +
    • CC26x0R2 +
        +
      • [RF_PATCH] CC2640R2F: Updated CPE and RFE patches used for time-of-flight measurements ("tof") to estimate RF link distance. The new CPE patch has some simplifications, and consequently a smaller patch code size, before first public release. The RFE patch has been updated to remove unnecessary debug information.
      • +
    • +
    + +

    Bug fixes

    +
      +
    • None
    • +
    + +

    Known issues

    +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal, available in IO Controller as "RFC_GPO1", signaling the "PA_EN" status signal is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far support only differential front-end mode only, and will need a run-time modification (not implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_04_11_18442

    +
    + Release date: May 08, 2018
    + +

    New features

    +
      +
    • CC13x2_CC26x2_v1
    • +
        +
      • [RF_API] General: Updated API header files to extend common API with new command to set TX power with possibility to switch between PAs. The command is named "CMD_CHANGE_PA". Also, a new extended variants for each of the existing radio setup command has been introduced ("CMD_RADIO_SETUP_PA", "CMD_BLE5_RADIO_SETUP_PA", "CMD_PROP_RADIO_SETUP_PA", "CMD_PROP_RADIO_DIV_SETUP_PA") with additional PA switching fields -- these additional fields will be used by RF driver when switching PA, not radio CPU.
      • +
      • [RF_PATCH] General: Updated all CPE patches to extend API with new common command to set TX power with possibility to switch between PAs. The command is named "CMD_CHANGE_PA".
      • +
      +
    • CC26x0R2 +
        +
      • [RF_PATCH] General: Added a set of new radio patches to support time-of-flight measurements ("tof") to estimate RF link distance.
      • +
      • [RF_PATCH] General: Added a set of new radio patches to support Bluetooth 4.2 and proprietary angle of arrival and departure measurements ("aoa_aod").
      • +
    • +
    + +

    Improvements

    +
      +
    • CC13x0 +
        +
      • [RF_PATCH] General: Updated all CPE patches with improved synthesizer start-up sequence that reduces the probability of synthesizer calibration failure.
      • +
      • [RF_PATCH] General: Added MCE patch for generic FSK ("genfsk") PHY to avoid receive sensitivity degradation in continuous RX operation over long time.
      • +
      • [RF_PATCH] General: CC1310, CC1350: Added latest version of MCE patch for WB-DSSS PHY (No change for customer. DSSS pattern is hard coded in the patch).
      • +
    • +
    + +

    Bug fixes

    +
      +
    • Changes that apply to all devices +
        +
      • [DRV_SRC] CPU: GCC CPUdelay() inline assembly incorrect.
      • +
    • +
    • CC13x2_CC26x2_v2
    • + CC13x2_CC26x2_v1
      +
        +
      • [DRV_SRC] Crypto PKA: PKAGetBigNumResult() and PKAGetBigNumResultRemainder() static analysis warning.
      • +
      • [DRV_SRC] Crypto AES: AESConfigureCCMCtrl() static analysis warning.
      • +
      +
    • CC13x2_CC26x2_v1 +
        +
      • [RF_PATCH] General: Updated various CPE patch files ("ble", "bt5", "prop", "multi_protocol") to fix an issue with RAT_GPO1 output signal that can be routed out of RF core. The problem was that if RX is restarted within the same command, the RAT_GPO1 output signal would only be asserted on the first sync word received, but it would not be asserted after that if the radio is in RX after restart of the receiver, for example due to repeat mode being enabled.
      • +
      • [RF_PATCH] General: Updated all CPE patches supporting proprietary command set ("prop", "multi_protocol") to give correct time-out operation when using "CMD_PROP_RX_SNIFF" or "CMD_PROP_RX_ADV_SNIFF" commands. The carrier sense operation will continue after the csEndTrigger has occurred, if so configured.
      • +
      • [RF_PATCH] CC1352R, CC1352P, CC2652R: Added RFE patch for IEEE 802.15.4 O-QPSK DSSS ("ieee_802_15_4") PHY to resolve issue with RSSIMAXVAL reporting incorrect value.
      • +
    • +
    • CC26x0R2 +
        +
      • [RF_PATCH] General: Updated all CPE patches to align frequency word representation between frequency synthesizer and demodulator. This prevents temporary loss of receive function during continuous receive operation over long time for any "fractFreq" setting used.
      • +
    • +
    • CC26x0 +
        +
      • [RF_PATCH] General: Updated all CPE patches to align frequency word representation between frequency synthesizer and demodulator. This prevents temporary loss of receive function during continuous receive operation over long time for any "fractFreq" setting used.
      • +
    • +
    • CC13x0 +
        +
      • [RF_PATCH] General: Updated all CPE patches to align frequency word representation between frequency synthesizer and demodulator. This prevents temporary loss of receive function during continuous receive operation over long time for any "fractFreq" setting used.
      • +
      • [RF_PATCH] General: Updated all CPE patches supporting proprietary command set ("ant_div", "brepeat", "genfsk", "genook", "ghs", "lrm", "sl_longrange", "wb_dsss", "wbmus_ctmode", "wmbus_smode") to give correct time-out operation when using "CMD_PROP_RX_SNIFF" or "CMD_PROP_RX_ADV_SNIFF" commands. The carrier sense operation will continue after the csEndTrigger has occurred, if so configured.
      • +
      • [RF_PATCH] CC1350: Added RFE patch for IEEE 802.15.4 O-QPSK DSSS ("ieee") PHY to resolve issue with RSSIMAXVAL reporting incorrect value.
      • +
    • +
    + +

    Known issues

    +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal, available in IO Controller as "RFC_GPO1", signaling the "PA_EN" status signal is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far support only differential front-end mode only, and will need a run-time modification (not implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_04_10_18419

    +
    + Release date: May 05, 2018
    + +

    New features

    +
      +
    • CC13x2_CC26x2_v2
    • + CC13x2_CC26x2_v1
      +
        +
      • [RF_API] General: Introduce new RFCGetPaType and RFCGetPaGain functions.
      • +
      +
    + +

    Improvements

    +
      +
    • None
    • +
    + +

    Bug fixes

    +
      +
    • Changes that apply to all devices +
        +
      • [DRV_DOC] General: List include file for each DriverLib module in HTML documentation.
      • +
      • [DRV_DOC] OSC: Function in Oscillator API is missing description for parameter.
      • +
      • [DRV_SRC] CPU: GCC CPUdelay() inline assembly incorrect.
      • +
      • [DRV_SRC] GPIO: Compile error in gpio.h when DRIVERLIB_DEBUG is defined.
      • +
    • +
    • CC13x2_CC26x2_v2
    • + CC13x2_CC26x2_v1
      +
        +
      • [DRV_SRC] Crypto SHA: Defines in SHA2 module have semi-colon at the end of the line.
      • +
      • [DRV_SRC] GPIO: dioNumberLegal() in gpio.h can return incorrect value for cc26x2/cc13x2 devices.
      • +
      • [DRV_SRC] Crypto PKA: PKABigNumModGetResult can leave junk data in most significant bytes.
      • +
      • [DRV_SRC] General: Compile errors in ASSERTs when DRIVERLIB_DEBUG is defined.
      • +
      +
    + +

    Known issues

    +
      +
    • CC26x0
    • +
        +
      • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal (available in IO Controller as "RFC_GPO1"), signaling the "PA_EN" status, is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far only support differential front-end mode, and will need a run-time modification (not yet implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_04_09_18364

    +
    + Release date: April 17, 2018
    + +

    New features

    +
      +
    • None
    • +
    + +

    Improvements

    +
      +
    • Changes that apply to all devices +
        +
      • [DRV_DOC] General: General improvement of the documentation.
      • +
    • +
    • CC13x2_CC26x2_v2
    • + CC13x2_CC26x2_v1
      +
        +
      • [HW_INC] RFC_DBELL: Renamed defines in hw_rfc_dbell.h for bit[13] and bit[12] of the RFCPEIFG, RFCPEIEN and RFCPEISL registers.
      • +
      +
    + +

    Bug fixes

    +
      +
    • Changes that apply to all devices +
        +
      • [DRV_SRC] GPIO: Compile error in gpio.h when DRIVERLIB_DEBUG is defined.
      • +
    • +
    + + +

    Known issues

    +
      +
    • CC26x0
    • +
        +
      • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal (available in IO Controller as "RFC_GPO1"), signaling the "PA_EN" status, is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far only support differential front-end mode, and will need a run-time modification (not yet implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_04_08_18312

    +
    + Release date: March 2, 2018
    + +

    New features

    +
      +
    • None
    • +
    + +

    Improvements

    +
      +
    • None
    • +
    + +

    Bug fixes

    +
      +
    • CC13x2_CC26x2_v2
    • + CC13x2_CC26x2_v1
      +
        +
      • [DRV_SRC] Crypto PKA: Functions PKABigNumModGetResult and PKABigNumInvModGetResult both do not return how many bytes were written to the resultBuf. They can yield less than expected because the HW does not zero-pad beyond word boundaries. This is now handled by zero-out resultBuf before fetching the result so that correct assumptions about the result lengths can be made.
      • +
      +
    + +

    Known issues

    +
      +
    • CC26x0
    • +
        +
      • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal (available in IO Controller as "RFC_GPO1"), signaling the "PA_EN" status, is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far only support differential front-end mode, and will need a run-time modification (not yet implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_04_07_18288

    +
    + Release date: February 22, 2018
    + +

    New features

    +
      +
    • None
    • +
    + +

    Improvements

    +
      +
    • None
    • +
    + +

    Bug fixes

    +
      +
    • CC13x2_CC26x2_v1
    • +
        +
      • [RF_PATCH] CC1312, CC1352, CC2642, CC2652: Updated all CPE patch files ("ble", "bt5", "ieee_802_15_4", "prop", "multi_protocol") to fix a problem in CPE's dynamic reconfiguration of the ADI_3_REFSYS:DCDCCTL5[3:0] register when radio enters RX or TX. A bug in the save/restore mechanism that should write DCDCCTL5[3:0] register back to its original setting when radio operation has ended caused the register setting to always be restored to setting 0x0. This undesired setting change of DCDCCTL5.IPEAK can cause an increased current consumption, if the DC/DC regulator is used. This fix will ensure DCDCCTL5[3:0] is correctly restored to original setting.
      • +
      • [RF_PATCH] CC1312, CC1352, CC2642, CC2652: Updated all CPE patch files ("ble", "bt5", "ieee_802_15_4", "prop", "multi_protocol") to fix an issue with CPEGPO1 output signal. This signal, available in IO Controller as "RFC_GPO1" signal, represents "PA_EN" status signal. This status signal should go high when the power amplifier (PA) is enabled (start of transmission), and then low when PA is disabled (end of transmission). For all protocols/PHYs other than Bluetooth low energy, there was an issue that prevented this signal to correctly go low at end of transmission, which has now been fixed.
      • +
      +
    + +

    Known issues

    +
      +
    • CC26x0
    • +
        +
      • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal (available in IO Controller as "RFC_GPO1"), signaling the "PA_EN" status, is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far only support differential front-end mode, and will need a run-time modification (not yet implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_04_06_18273

    +
    + Release date: February 21, 2018
    + +

    New features

    +
      +
    • None
    • +
    + +

    Improvements

    +
      +
    • CC13x2_CC26x2_v1 +
        +
      • [DRV_SRC] Setup: TrimAfterColdResetWakeupFromShutDown(): Removed workaround that was only valid for discontinued silicon revision.
      • +
    • +
    + +

    Bug fixes

    +
      +
    • CC13x2_CC26x2_v2
    • + CC13x2_CC26x2_v1
      +
        +
      • [DRV_SRC] Crypto: Fixed potential race conditions when using aes.c.
      • +
      +
    + +

    Known issues

    +
      +
    • CC26x0
    • +
        +
      • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal (available in IO Controller as "RFC_GPO1"), signaling the "PA_EN" status, is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far only support differential front-end mode, and will need a run-time modification (not yet implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_04_05_18251

    +
    + Release date: February 07, 2018
    + +

    New features

    +
      +
    • CC13x2_CC26x2_v1
    • +
        +
      • [RF_PATCH] CC1352P: Updated CPE Bluetooth 5 ("bt5") and CPE multi-protocol patch files, and added a new RFE Bluetooth 5 ("bt5") patch file, to allow higher bandwidth in synthesizer PLL during Tx start-up. This allows faster PA settling when transmitting with 20-dBm PA.
      • +
      +
    + +

    Improvements

    +
      +
    • CC13x2_CC26x2_v2 +
        +
      • [DRV_SRC] Setup: TrimAfterColdResetWakeupFromShutDown(): HW register bit fields ADI_3_REFSYS:AUX_DEBUG.LPM_BIAS_BACKUP_EN and ADI_4_AUX:COMP.LPM_BIAS_WIDTH_TRIM are now written with values from FCFG1.
      • +
    • +
    + +

    Bug fixes

    +
      +
    • None
    • +
    + +

    Known issues

    +
      +
    • CC26x0
    • +
        +
      • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal (available in IO Controller as "RFC_GPO1"), signaling the "PA_EN" status, is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far only support differential front-end mode, and will need a run-time modification (not yet implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_04_04_18225

    +
    + Release date: February 01, 2018
    + +

    New features

    +
      +
    • CC13x2_CC26x2_v2
    • + CC13x2_CC26x2_v1
      + CC26x0
      + CC26x0R2
      + CC13x0 +
        +
      • [RF_API] General: The RFCOverrideSearch() function is now available on all devices and no longer static.
      • +
      +
    + +

    Improvements

    +
      +
    • None
    • +
    + +

    Bug fixes

    +
      +
    • None
    • +
    + +

    Known issues

    +
      +
    • CC26x0
    • +
        +
      • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal (available in IO Controller as "RFC_GPO1"), signaling the "PA_EN" status, is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far only support differential front-end mode, and will need a run-time modification (not yet implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_04_03_18200

    +
    + Release date: January 25, 2018
    + +

    New features

    +
      +
    • CC13x2_CC26x2_v2
    • +
        +
      • [RF_API] CC1312, CC1352, CC2642, CC2652: Updated API header files.
      • +
      +
    • CC13x2_CC26x2_v1
    • +
        +
      • [RF_PATCH] CC1352, CC2642, CC2652: Updated CPE Bluetooth 5 ("bt5") and CPE multi-protocol patch files with new API functionality for configuring the 20-dBm PA output power when using CMD_BLE5_* command API.
      • +
      • [RF_API] ] CC1312, CC1352, CC2642, CC2652: +
          +
        • rf_ble_cmd.h: All CMD_BLE5_* radio operation command structs are extended with a new, optional "tx20Power" struct. This can be used to immediately set new 20-dBm PA setting in Tx.
        • +
        • rf_common_cmd.h: The common CMD_SET_TX20_POWER command is modified with "txPower" struct field renamed to "tx20Power". This is to highlight that the parameter is for the 20-dBm PA and not the normal PA.
        • +
      • +
      +
    + +

    Improvements

    +
      +
    • CC13x2_CC26x2_v2 +
        +
      • [DRV_SRC] Crypto PKA: Added missing length define (Curve25519_PARAM_SIZE_BYTES) in PKA module for Curve25519.
      • +
      • [DRV_SRC] Crypto PKA: Removed function PKAEccVerifyPublicKeyGetResult() since only the NIST and Brainpool curves are supported and they have a cofactor of 1. It's not needed to perform the Q*n = point at infinity check during public key validation.
      • +
    • +
    • CC13x2_CC26x2_v1 +
        +
      • [RF_PATCH] CC1312, CC1352, CC2652: Updated the RFE generic FSK ("genfsk") PHY patches with a new default setting for PA ramp-down wait time. This has been reduced from 31 µs down to 21 µs.
      • +
      • [DRV_SRC] Crypto PKA: Added missing length define (Curve25519_PARAM_SIZE_BYTES) in PKA module for Curve25519.
      • +
      • [DRV_SRC] Crypto PKA: Removed function PKAEccVerifyPublicKeyGetResult() since only the NIST and Brainpool curves are supported and they have a cofactor of 1. It's not needed to perform the Q*n = point at infinity check during public key validation.
      • +
    • +
    + +

    Bug fixes

    +
      +
    • None
    • +
    + +

    Known issues

    +
      +
    • CC26x0
    • +
        +
      • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal (available in IO Controller as "RFC_GPO1"), signaling the "PA_EN" status, is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far only support differential front-end mode, and will need a run-time modification (not yet implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_04_02_18173

    +
    + Release date: January 15, 2018
    + +

    New features

    +
      +
    • CC13x2_CC26x2_v2
    • +
        +
      • [RF_API] General: Initial release of preliminary API header files.
      • +
      • [DRV_SRC] Crypto PKA: Added Montgomery Curve25519 multiplication support.
      • +
      +
    • CC13x2_CC26x2_v1
    • +
        +
      • [DRV_SRC] Crypto PKA: Added Montgomery Curve25519 multiplication support.
      • +
      +
    + +

    Improvements

    +
      +
    • CC13x2_CC26x2_v1 +
        +
      • [RF_PATCH] General: CC1312, CC1352, CC2652: Updated the RFE and MCE generic FSK ("genfsk") PHY patches with small optimizations in TX timing for PA enable at start of packet, and increased default setting for PA ramp-down time from 10 µs to 31 µs. Modulator timing has also been tuned for better performance at high data rates (>500 kbps) and now waits 4 µs with tone before starting preamble to better align with PA ramp-up.
      • +
      • [RF_PATCH] General: CC1352, CC2652: Updated the IEEE 802.15.4 O-QPSK DSSS ("ieee_802_15_4") PHY patch with improvements in modem re-initialization between RX packets.
      • +
    • +
    + +

    Bug fixes

    +
      +
    • CC13x2_CC26x2_v1
    • +
        +
      • [RF_API] General: CC1312, CC1352, CC2642, CC2652: Updated API header file "rf_mailbox.h" to remove an incorrect interrupt "BG_COMMAND_SUSPENDED" (interrupt line 12) which does not exist.
      • +
      • [RF_PATCH] General: CC1312, CC1352: Updated the MCE SimpleLink Long Range ("sl_longrange") PHY patch to fix a potential problem related to stopping the demodulator when using SimpleLink Long Range PHY formats. The problem was that use of CMD_ABORT or CMD_PROP_RESTART_RX to stop an on-going RX operation with this PHY could result in RF core doorbell interface to become unresponsive, and a re-initialization (power-cycle) of RF core would be needed to recover.
      • +
      +
    + +

    Known issues

    +
      +
    • CC26x0
    • +
        +
      • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal (available in IO Controller as "RFC_GPO1"), signaling the "PA_EN" status, is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far only support differential front-end mode, and will need a run-time modification (not yet implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_04_01_18155

    +
    + Release date: January 05, 2018
    + +

    New features

    +
      +
    • CC13x2_CC26x2_v1
    • + CC13x2_CC26x2_v2 +
        +
      • [DRV_SRC] AUX_ADC: Added additional defines for supported trigger events.
      • +
      +
    + +

    Improvements

    +
      +
    • Changes that apply to all devices +
        +
      • [DRV_SRC] Crypto: Improved key loading error handling to avoid system crash during heavy bus load.
      • +
    • +
    + +

    Bug fixes

    +
      +
    • CC13x2_CC26x2_v1
    • + CC13x2_CC26x2_v2 +
        +
      • [DRV_SRC] Crypto PKA: Fixed PKAEccVerifyPublicKeyWeierstrassStart() function which incorrectly failed for curves that were not a multiple of 4 bytes in length.
      • +
      +
    + +

    Known issues

    +
      +
    • CC26x0
    • +
        +
      • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal (available in IO Controller as "RFC_GPO1"), signaling the "PA_EN" status, is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far only support differential front-end mode, and will need a run-time modification (not yet implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_04_00_18127

    +
    + Release date: December 14, 2017
    + +

    New features

    +
      +
    • CC13x2_CC26x2 +
        +
      • [DRV_SRC] General:Two variants of driverlib are introduced. The driverlib folder for the legacy version is renamed from "cc13x2_cc26x2" to "cc13x2_cc26x2_v1". A new driverlib folder for a planned upgraded silicon revision of cc13x2_cc26x2 devices is called "cc13x2_cc26x2_v2".
      • +
      • [DRV_SRC] Crypto PKA: Added support for Short-Weierstrass public key validation, NIST-P224 and NIST-P384 to PKA module.
      • +
    • +
    + +

    Improvements

    +
      +
    • Changes that apply to all devices +
        +
      • [DRV_SRC] ChipInfo: Renamed enumerations returned from function ChipInfo_GetChipType(). Renamed CHIP_TYPE_CC2644 to CHIP_TYPE_unused and CHIP_TYPE_CC1354 to CHIP_TYPE_CC1352P.
      • +
    • +
    + +

    Bug fixes

    +
      +
    • Changes that apply to all devices +
        +
      • [DRV_SRC] AUX_ADC: AUXADCDisable() now flushes the ADC FIFO in order to remove stale samples in the FIFO after the ADC module is disabled. If samples are left in the FIFO after disabling the ADC, the related ADC_IRQ flag may not be cleared. This is a potential problem when operating at high sampling rates where additional conversions may complete between handling an ISR and disabling the ADC, possibly causing an infinite ISR loop.
      • +
    • +
    + +

    Known issues

    +
      +
    • CC26x0
    • +
        +
      • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal (available in IO Controller as "RFC_GPO1"), signaling the "PA_EN" status, is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far only support differential front-end mode, and will need a run-time modification (not yet implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_03_04_18115

    +
    + Release date: December 7, 2017
    + +

    New features

    +
      +
    • None
    • +
    + +

    Improvements

    +
      +
    • None
    • +
    + +

    Bug fixes

    +
      +
    • CC26x0R2 +
        +
      • [RF_PATCH] CPE BT5: Updated CPE BT5 patch with bug fix for Bluetooth 5 LE Advertising Extensions: The Bluetooth 5 initiator command sometimes outputs a "connectTime" that does not correspond to the transmitted AUX_CONNECT_REQ.
      • +
    • +
    • CC13x2_CC26x2 +
        +
      • [RF_PATCH] CPE: CC1352, CC2642, CC2652: Updated CPE BT5 and CPE multi-protocol patches with bug fix for Bluetooth 5 LE Advertising Extensions: The Bluetooth 5 initiator command sometimes outputs a "connectTime" that does not correspond to the transmitted AUX_CONNECT_REQ.
      • +
      • [RF_PATCH] RFE: CC1312, CC1352, CC2652: Updated the RFE generic FSK ("genfsk") PHY patch with bug fix in PA ramp mechanism: the RFE, and thus CPE, may hang if TX is aborted shortly after start.
      • +
    • +
    + +

    Known issues

    +
      +
    • CC26x0
    • +
        +
      • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal (available in IO Controller as "RFC_GPO1"), signaling the "PA_EN" status, is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far only support differential front-end mode, and will need a run-time modification (not yet implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_03_03_18107

    +
    + Release date: December 1, 2017
    + +

    New features

    +
      +
    • None
    • +
    + +

    Improvements

    +
      +
    • None
    • +
    + +

    Bug fixes

    +
      +
    • CC13x2_CC26x2 +
        +
      • [RF_PATCH] CPE/MCE: CC1312, CC1352: Updated the CPE PROP, CPE multi-protocol, and MCE SimpleLink Long Range (SLR) PHY patches to fix a problem related to stopping the demodulator when using SLR PHY formats. The problem was that use of CMD_ABORT or CMD_PROP_RESTART_RX to stop an on-going RX operation with this PHY could result in RF core doorbell interface to become unresponsive, and a re-initialization (power-cycle) of RF core would be needed to recover. (internal: RFCORE-163).
      • +
      • [RF_PATCH] MCE BT5: CC1352, CC2642, CC2652: Updated MCE BT5 patch to resolve a potential PHY problem where too high TX symbol rate error (up to 100 ppm) may be used for LE Coded PHY, which will violate Bluetooth 5 PHY specification requirements (max 50 ppm). The problem could be invoked, depending on a timing condition, as part of doing an RX to TX transition using LE Coded PHY. (internal: RFCORE-166).
      • +
    • +
    + +

    Known issues

    +
      +
    • CC26x0
    • +
        +
      • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal (available in IO Controller as "RFC_GPO1"), signaling the "PA_EN" status, is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far only support differential front-end mode, and will need a run-time modification (not yet implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_03_02_18061

    +
    + Release date: November 10, 2017
    + +

    New features

    +
      +
    • None
    • +
    + +

    Improvements

    +
      +
    • None
    • +
    + +

    Bug fixes

    +
      +
    • Changes that apply to all devices +
        +
      • [RF_API] General: In all API files, resolved CCS compiler warning when using attribute "aligned(4)" on structs with struct member of type uint64_t.
      • +
    • +
    • CC13x2_CC26x2 +
        +
      • [DRV_SRC] Setup: SetupTrimDevice(): Fixed bug that caused the supported "Boost mode" during boot to be non-functional. The supported mode boosts VDDR to support +14dBm.
      • +
    • +
    + +

    Known issues

    +
      +
    • CC26x0
    • +
        +
      • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal (available in IO Controller as "RFC_GPO1"), signaling the "PA_EN" status, is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far only support differential front-end mode, and will need a run-time modification (not yet implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_03_01_18037

    +
    + Release date: November 3, 2017
    + +

    New features

    +
      +
    • Changes that apply to all devices +
        +
      • [DRV_API] New functions in rfc.c and rfc.h: +
          +
        • __STATIC_INLINE void RFCCpe0IntSelect(uint32_t ui32Mask): This function maps the interrupt lines provided within the argument to CPE0.
        • +
        • __STATIC_INLINE void RFCCpe1IntSelect(uint32_t ui32Mask): This function maps the interrupt lines provided within the argument to CPE1.
        • +
      • +
      • [DRV_SRC] OSC: Add debug/test function OSC_AdjustXoscHfCapArray(). Useful for production preparations when trying to find optimal HF XOSC Cap Array setting for a specific design. Ref. SET_CCFG_MODE_CONF_XOSC_CAP... in ccfg.c
      • +
      • [DRV_SRC] PowerCtrl: Added the following functions: +
          +
        • PowerCtrlPadSleepEnable()
        • +
        • PowerCtrlPadSleepDisable()
        • +
      • +
    • +
    • CC13x0 +
        +
      • [RF_PATCH] MCE: Added new MCE patch for Generic FSK with CC1101-compatible FEC and interleaver ("genfsk_fec_cc1101").
      • +
    • +
    • CC26x0R2 +
        +
      • [RF_API] BLE5: Updated Bluetooth 5 command API ("BLE5"): Added Bluetooth 5 variants of legacy advertiser commands (CMD_BLE5_ADV, CMD_BLE5_ADV_DIR, CMD_BLE5_ADV_NC, CMD_BLE5_ADV_SCAN). These new commands are only available when using an updated CPE BT5 patch.
      • +
      • [RF_API] PROP: In PROP API command CMD_PROP_RADIO_SETUP the bit-fields "symbolRate.bPdifDecim" and "symbolRate.pdifDecim" have been merged into one new bit-field ".symbolRate.decimMode". This is to make the CC2640R2F API the same as for CC13x0.
      • +
      • [RF_PATCH] CPE BT5: Updated CPE BT5 patch to include Bluetooth 5 variants of legacy advertiser commands (CMD_BLE5_ADV, CMD_BLE5_ADV_DIR, CMD_BLE5_ADV_NC, CMD_BLE5_ADV_SCAN).
      • +
    • +
    • CC13x2_CC26x2 +
        +
      • [RF_API] BLE5: Updated Bluetooth 5 command API ("BLE5"): Added Bluetooth 5 variants of legacy advertiser commands (CMD_BLE5_ADV, CMD_BLE5_ADV_DIR, CMD_BLE5_ADV_NC, CMD_BLE5_ADV_SCAN). These new commands are only available when using an updated CPE BT5 or CPE multi-protocol patch.
      • +
      • [RF_API] PROP: In PROP API commands CMD_PROP_RADIO_SETUP and CMD_PROP_RADIO_DIV_SETUP a new bit-field "modulation.deviationStepSz" has been added. This can be used to configure the resolution of the existing bit-field "modulation.deviation".
      • +
      • [RF_PATCH] CPE: Updated CPE BT5 and CPE multi-protocol patches to include Bluetooth 5 variants of legacy advertiser commands (CMD_BLE5_ADV, CMD_BLE5_ADV_DIR, CMD_BLE5_ADV_NC, CMD_BLE5_ADV_SCAN).
      • +
      • [RF_PATCH] CPE: The CPE patch files "rf_patch_cpe_sl_longrange.h" and "rf_patch_cpe_genfsk.h" have been removed. The CPE PROP patch ("rf_patch_cpe_prop.h") already covers these cases and should be used instead. Alternatively, the CPE multi-protocol patch may be used.
      • +
      • [DRV_SRC] Setup: Added support in SetupTrimDevice() to enable "Boost mode" during boot, boosting VDDR to support +14dBm.
      • +
      • [DRV_SRC] sys_ctrl: Added SysCtrlShutdownWithAbort() as a workaround to detect pre-shutdown wakeup events.
      • +
      • [DRV_SRC] sys_ctrl: Added handling of optional temperature compensation of the recharge level (enabled by setting CCFG_MODE_CONF_VDDR_TRIM_SLEEP_TC = 0).
      • +
      • [DRV_SRC] Crypto PKA: Added subtraction function to PKA module and EC-JPAKE updates.
      • +
    • +
    + +

    Improvements

    +
      +
    • Changes that apply to all devices +
        +
      • [DRV_SRC] Eliminated functions in rfc.c and rfc.h:
        + These functions did not provided a safe way to handle clock management, hence they have been removed from the rfc.h file.
        + It is recommended that enabling/disabling clocks in the RF core should be requested through radio commands instead. +
          +
        • __STATIC_INLINE void RFCClockSet(uint32_t ui32Mask)
        • +
        • __STATIC_INLINE void RFCClockClear(uint32_t ui32Mask)
        • +
      • +
      • [HW_INC] General: Updated/improved hardware register descriptions (inc/hw_*.h and doc/../*.html files).
      • +
      • [DRV_SRC] PowerCtrl: The following functions are either removed or marked as derprecated: +
          +
        • PowerCtrlIOFreezeEnable() removed
        • +
        • PowerCtrlIOFreezeDisable() removed
        • +
        • PowerCtrlResetSourceGet() marked as deprecated. It will be removed in a future release. Use SysCtrlResetSourceGet() instead.
        • +
      • +
    • +
    • CC13x0 +
        +
      • [RF_PATCH] MCE: Updated MCE bit-repeat patch ("brepeat") to add support for very long or infinite preamble.
      • +
    • +
    • CC26x0R2 +
        +
      • [RF_PATCH] CPE BT5: Updated CPE BT5 patch for Bluetooth 5 to implement that CPE re-reads the "pConnectReqData" parameter pointer before sending AUX_CONNECT_REQ.
      • +
    • +
    • CC13x2_CC26x2 +
        +
      • [RF_PATCH] CPE BT5: Updated CPE BT5 patch for Bluetooth 5 to implement that CPE re-reads the "pConnectReqData" parameter pointer before sending AUX_CONNECT_REQ.
      • +
      • [RF_PATCH] CPE: Updated CPE BLE, CPE BT5, CPE PROP, and CPE multi-protocol patches with improvement to make the (G)FSK deviation in Tx constant over the frequency band by recalculating the Tx shape when RF synth is programmed to a new frequency.
      • +
      • [DRV_SRC] The following functions are not applicable on these devices and hence been removed from rfc.c and rfc.h: +
          +
        • void RFCRfTrimRead(rfc_radioOp_t *pOpSetup, rfTrim_t* pRfTrim)
        • +
        • void RFCRTrim(rfc_radioOp_t *pOpSetup)
        • +
        • void RFCRfTrimSet(rfTrim_t* pRfTrim)
        • +
        • void RFCAdi3VcoLdoVoltageMode(bool bEnable)
        • +
      • +
      • [DRV_SRC] Crypto SHA2: Updated SHA2 driverlib to support partial hashing of multiple blocks at a time.
      • +
      • [DRV_SRC] sys_ctrl: SysCtrlShutdown() now terminates in a while(1) to make sure it never returns.
      • +
      • [DRV_SRC] AON/sys_ctrl: Removed function AONPMCTLShutDownEnable(), use SysCtrlShutdown() instead.
      • +
    • +
    + +

    Bug fixes

    +
      +
    • Changes that apply to all devices +
        +
      • [RF_API] General: In all API files, resolved a syntax problem with the struct attribute when compiling with GCC or CCS.
      • +
      • [DRV_SRC] Behavioural change in rfc.c and rfc.h: +
          +
        • __STATIC_INLINE void RFCClockEnable(void): This function only enables the interrupts which are needed to get the CM0 running. This is to optimize consumption.
        • +
        • __STATIC_INLINE void RFCHwIntEnable(uint32_t ui32Mask): The old function was clearing the interrupts before enabling.
        • +
        • __STATIC_INLINE void RFCCpeIntEnable(uint32_t ui32Mask): This function only enables the interrupts, regardless if it is mapped to CPE0 or CPE1. It does not modify the pending interrupt flags.
        • +
      • +
      • [DRV_API] Function prototype changes in rfc.c and rfc.h: +
          +
        • uint32_t RFCCpeIntGetAndClear(uint32_t ui32Mask): This function was reading and clearing all the CPE interrupt flags, regardless if the handler routine has actually the right to do so. This could cause problems in applications where multiple users share the CPE interrupts. The new function only handles the interrupts which match the provided bitmask.
        • +
        • void RFCCpePatchReset(void): The function name was aligned with the camel-case naming convention of driverlib functions.
        • +
        • void RFCSynthPowerDown(void): This function is now explicitly takes no argument.
        • +
        • RFCHwIntGetAndClear(uint32_t ui32Mask): The function name was aligned with the camel-case naming convention of driverlib functions.
        • +
        • __STATIC_INLINE void RFCCpe0IntSelectClearEnable(uint32_t ui32Mask): The function was renamed to reflect its internal behavior.
        • +
        • __STATIC_INLINE void RFCCpe1IntSelectClearEnable(uint32_t ui32Mask): The function was renamed to reflect its internal behavior.
        • +
      • +
    • +
    • CC13x2_CC26x2 +
        +
      • [RF_API] IEEE: In API for "IEEE" commands, a type problem for the struct member "CMD_IEEE_RX.pShortEntryList" was fixed. This fix aligns the API structs with the existing API for CC26x0.
      • +
      • [RF_PATCH] CPE: Updated CPE PROP and CPE multi-protocol patches with bug fix: if a packet is received with a proprietary mode Rx command (CMD_PROP_RX*) and a partial read Rx buffer is used, the CPE will hang if an abort command is received while a packet is being received.
      • +
      • [DRV_SRC] Crypto PKA: Fixed issue where PKAGetECCResult would read and uninitialized variable when not copying back the x coordinate.
      • +
      • [DRV_SRC] Crypto PKA: Fixed bug where PKAGetECCResult would calculate an incorrect offset for curvePointY in PKA RAM and copy back an incorrect result.
      • +
      • [DRV_SRC] Setup: SetupTrimDevice(): Include the LPM_BIAS trims in the boot sequence.
      • +
    • +
    + +

    Known issues

    +
      +
    • CC26x0
    • +
        +
      • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: The CPEGPO1 output signal (available in IO Controller as "RFC_GPO1"), signaling the "PA_EN" status, is not functional. The signal does not go low at end of transmission.
      • +
      • [RF_SETTING] BT5: All Bluetooth 5 radio settings so far only support differential front-end mode, and will need a run-time modification (not yet implemented) of trim value in override list to achieve correct settings.
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_02_03_17972

    +
    + Release date: September 21, 2017
    + +

    New features

    +
      +
    • None
    • +
    + +

    Improvements

    +
      +
    • None
    • +
    + +

    Bug fixes

    +
      +
    • CC26x0R2 +
        +
      • [RF_PATCH] CPE BT5: Updated CPE BT5 patch to include bug fix for Bluetooth 5: Address type of received ADV_AUX_IND packets is not treated correctly.
      • +
    • +
    • CC13x2_CC26x2 +
        +
      • [RF_PATCH] CPE BT5: Updated CPE BT5 patch to include bug fix for Bluetooth 5: Address type of received ADV_AUX_IND packets is not treated correctly.
      • +
      • [RF_PATCH] CPE multi-protocol: Updated CPE multi-protocol patch to include bug fix for Bluetooth 5: Address type of received ADV_AUX_IND packets is not treated correctly.
      • +
    • +
    + +

    Known issues

    +
      +
    • CC26x0
    • +
        +
      • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: GPO control not functional. (The PA_EN status signal does not go low).
      • +
    • +
    +
    +
    +
    +

    driverlib_cc13xx_cc26xx_3_02_02_17958

    +
    + Release date: September 21, 2017
    + +

    New features

    +
      +
    • None
    • +
    + +

    Improvements

    +
      +
    • None
    • +
    + +

    Bug fixes

    +
      +
    • CC26x0R2 +
        +
      • [RF_PATCH] CPE BT5: Updated CPE BT5 patch to include bug fix for Bluetooth 5: receiving ADV_EXT_IND that contains AuxPtr with CRC error causes stall.
      • +
    • +
    • CC13x2_CC26x2 +
        +
      • [RF_PATCH] CPE BT5: Updated CPE BT5 patch to include bug fix for Bluetooth 5: receiving ADV_EXT_IND that contains AuxPtr with CRC error causes stall.
      • +
      • [RF_PATCH] CPE multi-protocol: Updated CPE multi-protocol patch to include bug fix for Bluetooth 5: receiving ADV_EXT_IND that contains AuxPtr with CRC error causes stall.
      • +
    • +
    + +

    Known issues

    +
      +
    • CC26x0
    • +
        +
      • [RF_PATCH] General: CMD_SCH_IMM can cause loss of commands.
      • +
      +
    • CC26x0R2 +
        +
      • [RF_API] General: GPO control not functional. (The PA_EN status signal does not go low).
      • +
    • +
    +
    +
    @@ -136,9 +1521,9 @@