Skip to content

Commit 45116c1

Browse files
author
Edvard Pettersen
committed
[bugfix] Disable SysTick interrupt when dropping to some low-power mode
It was discovered that the SysTick interrupt must be disabled before dropping to some low-power mode. If not, then in some rare occasions a race condition of the device entering/leaving the low-power mode and the SysTick interrupt triggering may clobber the CPU context and in an invalid state, and will in most cases crash the CPU. A "proxy" standby policy is implemented which wraps the actual Power driver standby policy with disabling and enabling the SysTick interrupt, before and after. This ensure the SysTick is always disabled when entering some low-power mode, regardless of which context that triggers the standby policy.
1 parent e9587a2 commit 45116c1

File tree

16 files changed

+57
-23
lines changed

16 files changed

+57
-23
lines changed

arch/cpu/simplelink-cc13xx-cc26xx/dev/clock-arch.c

+24-9
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
#include DeviceFamily_constructPath(driverlib/systick.h)
5252

5353
#include <ti/drivers/dpl/ClockP.h>
54+
#include <ti/drivers/power/PowerCC26XX.h>
5455
/*---------------------------------------------------------------------------*/
5556
#include "watchdog-arch.h"
5657
/*---------------------------------------------------------------------------*/
@@ -161,17 +162,15 @@ clock_arch_enter_idle(void)
161162
/* We are not going to sleep, and hence we don't arm the wakeup clock. */
162163
return false;
163164
}
164-
if(timeout == NO_TIMEOUT) {
165-
/* We are going to some low-power mode without arming the wakeup clock. */
166-
return true;
165+
166+
/* We are dropping to some low-power mode */
167+
168+
/* Arm the wakeup clock with the calculated timeout if there is any */
169+
if(timeout != NO_TIMEOUT) {
170+
ClockP_setTimeout(H_WAKEUP_CLK, timeout);
171+
ClockP_start(H_WAKEUP_CLK);
167172
}
168173

169-
/*
170-
* We are going to some low-power mode. Arm the wakeup clock with the
171-
* calculated.
172-
*/
173-
ClockP_setTimeout(H_WAKEUP_CLK, timeout);
174-
ClockP_start(H_WAKEUP_CLK);
175174
return true;
176175
}
177176
/*---------------------------------------------------------------------------*/
@@ -182,6 +181,22 @@ clock_arch_exit_idle(void)
182181
}
183182
/*---------------------------------------------------------------------------*/
184183
void
184+
clock_arch_standby_policy(void)
185+
{
186+
/*
187+
* XXX: Workaround for an observed issue where if SysTick interrupt is not
188+
* disabled when entering/leaving some low-power mode may in very rare
189+
* occasions clobber the CPU and cause a crash.
190+
*/
191+
SysTickIntDisable();
192+
193+
/* Drop to some low-power mode */
194+
PowerCC26XX_standbyPolicy();
195+
196+
SysTickIntEnable();
197+
}
198+
/*---------------------------------------------------------------------------*/
199+
void
185200
clock_init(void)
186201
{
187202
ClockP_Params clk_params;

arch/cpu/simplelink-cc13xx-cc26xx/dev/clock-arch.h

+5
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ bool clock_arch_enter_idle(void);
5656
*/
5757
void clock_arch_exit_idle(void);
5858
/*---------------------------------------------------------------------------*/
59+
/**
60+
* \brief Called by the Power driver when dropping to some low-power state.
61+
*/
62+
void clock_arch_standby_policy(void);
63+
/*---------------------------------------------------------------------------*/
5964
#endif /* CLOCK_ARCH_H_ */
6065
/*---------------------------------------------------------------------------*/
6166
/**

arch/platform/simplelink/cc13xx-cc26xx/launchpad/cc1310/CC1310_LAUNCHXL.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -708,10 +708,11 @@ const PINCC26XX_HWAttrs PINCC26XX_hwAttrs = {
708708
*/
709709
#include <ti/drivers/Power.h>
710710
#include <ti/drivers/power/PowerCC26XX.h>
711+
#include "clock-arch.h"
711712

712713
const PowerCC26XX_Config PowerCC26XX_config = {
713714
.policyInitFxn = NULL,
714-
.policyFxn = &PowerCC26XX_standbyPolicy,
715+
.policyFxn = &clock_arch_standby_policy,
715716
.calibrateFxn = &PowerCC26XX_calibrate,
716717
.enablePolicy = true,
717718
.calibrateRCOSC_LF = true,

arch/platform/simplelink/cc13xx-cc26xx/launchpad/cc1312r1/CC1312R1_LAUNCHXL.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -779,10 +779,11 @@ const PINCC26XX_HWAttrs PINCC26XX_hwAttrs = {
779779
*/
780780
#include <ti/drivers/Power.h>
781781
#include <ti/drivers/power/PowerCC26X2.h>
782+
#include "clock-arch.h"
782783

783784
const PowerCC26X2_Config PowerCC26X2_config = {
784785
.policyInitFxn = NULL,
785-
.policyFxn = &PowerCC26XX_standbyPolicy,
786+
.policyFxn = &clock_arch_standby_policy,
786787
.calibrateFxn = &PowerCC26XX_calibrate,
787788
.enablePolicy = true,
788789
.calibrateRCOSC_LF = true,

arch/platform/simplelink/cc13xx-cc26xx/launchpad/cc1350-4/CC1350_LAUNCHXL_433.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -704,10 +704,11 @@ const PINCC26XX_HWAttrs PINCC26XX_hwAttrs = {
704704
*/
705705
#include <ti/drivers/Power.h>
706706
#include <ti/drivers/power/PowerCC26XX.h>
707+
#include "clock-arch.h"
707708

708709
const PowerCC26XX_Config PowerCC26XX_config = {
709710
.policyInitFxn = NULL,
710-
.policyFxn = &PowerCC26XX_standbyPolicy,
711+
.policyFxn = &clock_arch_standby_policy,
711712
.calibrateFxn = &PowerCC26XX_calibrate,
712713
.enablePolicy = true,
713714
.calibrateRCOSC_LF = true,

arch/platform/simplelink/cc13xx-cc26xx/launchpad/cc1350/CC1350_LAUNCHXL.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -708,10 +708,11 @@ const PINCC26XX_HWAttrs PINCC26XX_hwAttrs = {
708708
*/
709709
#include <ti/drivers/Power.h>
710710
#include <ti/drivers/power/PowerCC26XX.h>
711+
#include "clock-arch.h"
711712

712713
const PowerCC26XX_Config PowerCC26XX_config = {
713714
.policyInitFxn = NULL,
714-
.policyFxn = &PowerCC26XX_standbyPolicy,
715+
.policyFxn = &clock_arch_standby_policy,
715716
.calibrateFxn = &PowerCC26XX_calibrate,
716717
.enablePolicy = true,
717718
.calibrateRCOSC_LF = true,

arch/platform/simplelink/cc13xx-cc26xx/launchpad/cc1352p-2/CC1352P_2_LAUNCHXL.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -746,10 +746,11 @@ const PINCC26XX_HWAttrs PINCC26XX_hwAttrs = {
746746
*/
747747
#include <ti/drivers/Power.h>
748748
#include <ti/drivers/power/PowerCC26X2.h>
749+
#include "clock-arch.h"
749750

750751
const PowerCC26X2_Config PowerCC26X2_config = {
751752
.policyInitFxn = NULL,
752-
.policyFxn = &PowerCC26XX_standbyPolicy,
753+
.policyFxn = &clock_arch_standby_policy,
753754
.calibrateFxn = &PowerCC26XX_calibrate,
754755
.enablePolicy = true,
755756
.calibrateRCOSC_LF = true,

arch/platform/simplelink/cc13xx-cc26xx/launchpad/cc1352p-4/CC1352P_4_LAUNCHXL.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -746,10 +746,11 @@ const PINCC26XX_HWAttrs PINCC26XX_hwAttrs = {
746746
*/
747747
#include <ti/drivers/Power.h>
748748
#include <ti/drivers/power/PowerCC26X2.h>
749+
#include "clock-arch.h"
749750

750751
const PowerCC26X2_Config PowerCC26X2_config = {
751752
.policyInitFxn = NULL,
752-
.policyFxn = &PowerCC26XX_standbyPolicy,
753+
.policyFxn = &clock_arch_standby_policy,
753754
.calibrateFxn = &PowerCC26XX_calibrate,
754755
.enablePolicy = true,
755756
.calibrateRCOSC_LF = true,

arch/platform/simplelink/cc13xx-cc26xx/launchpad/cc1352p1/CC1352P1_LAUNCHXL.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -755,10 +755,11 @@ const PINCC26XX_HWAttrs PINCC26XX_hwAttrs = {
755755
*/
756756
#include <ti/drivers/Power.h>
757757
#include <ti/drivers/power/PowerCC26X2.h>
758+
#include "clock-arch.h"
758759

759760
const PowerCC26X2_Config PowerCC26X2_config = {
760761
.policyInitFxn = NULL,
761-
.policyFxn = &PowerCC26XX_standbyPolicy,
762+
.policyFxn = &clock_arch_standby_policy,
762763
.calibrateFxn = &PowerCC26XX_calibrate,
763764
.enablePolicy = true,
764765
.calibrateRCOSC_LF = true,

arch/platform/simplelink/cc13xx-cc26xx/launchpad/cc1352r1/CC1352R1_LAUNCHXL.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -765,10 +765,11 @@ const PINCC26XX_HWAttrs PINCC26XX_hwAttrs = {
765765
*/
766766
#include <ti/drivers/Power.h>
767767
#include <ti/drivers/power/PowerCC26X2.h>
768+
#include "clock-arch.h"
768769

769770
const PowerCC26X2_Config PowerCC26X2_config = {
770771
.policyInitFxn = NULL,
771-
.policyFxn = &PowerCC26XX_standbyPolicy,
772+
.policyFxn = &clock_arch_standby_policy,
772773
.calibrateFxn = &PowerCC26XX_calibrate,
773774
.enablePolicy = true,
774775
.calibrateRCOSC_LF = true,

arch/platform/simplelink/cc13xx-cc26xx/launchpad/cc2650/CC2650_LAUNCHXL.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -707,10 +707,11 @@ const PINCC26XX_HWAttrs PINCC26XX_hwAttrs = {
707707
*/
708708
#include <ti/drivers/Power.h>
709709
#include <ti/drivers/power/PowerCC26XX.h>
710+
#include "clock-arch.h"
710711

711712
const PowerCC26XX_Config PowerCC26XX_config = {
712713
.policyInitFxn = NULL,
713-
.policyFxn = &PowerCC26XX_standbyPolicy,
714+
.policyFxn = &clock_arch_standby_policy,
714715
.calibrateFxn = &PowerCC26XX_calibrate,
715716
.enablePolicy = true,
716717
.calibrateRCOSC_LF = true,

arch/platform/simplelink/cc13xx-cc26xx/launchpad/cc26x2r1/CC26X2R1_LAUNCHXL.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -777,10 +777,11 @@ const PINCC26XX_HWAttrs PINCC26XX_hwAttrs = {
777777
*/
778778
#include <ti/drivers/Power.h>
779779
#include <ti/drivers/power/PowerCC26X2.h>
780+
#include "clock-arch.h"
780781

781782
const PowerCC26X2_Config PowerCC26X2_config = {
782783
.policyInitFxn = NULL,
783-
.policyFxn = &PowerCC26XX_standbyPolicy,
784+
.policyFxn = &clock_arch_standby_policy,
784785
.calibrateFxn = &PowerCC26XX_calibrate,
785786
.enablePolicy = true,
786787
.calibrateRCOSC_LF = true,

arch/platform/simplelink/cc13xx-cc26xx/sensortag/cc1350/CC1350STK.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -705,10 +705,11 @@ const PINCC26XX_HWAttrs PINCC26XX_hwAttrs = {
705705
*/
706706
#include <ti/drivers/Power.h>
707707
#include <ti/drivers/power/PowerCC26XX.h>
708+
#include "clock-arch.h"
708709

709710
const PowerCC26XX_Config PowerCC26XX_config = {
710711
.policyInitFxn = NULL,
711-
.policyFxn = &PowerCC26XX_standbyPolicy,
712+
.policyFxn = &clock_arch_standby_policy,
712713
.calibrateFxn = &PowerCC26XX_calibrate,
713714
.enablePolicy = true,
714715
.calibrateRCOSC_LF = true,

arch/platform/simplelink/cc13xx-cc26xx/sensortag/cc2650/CC2650STK.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -706,10 +706,11 @@ const PINCC26XX_HWAttrs PINCC26XX_hwAttrs = {
706706
*/
707707
#include <ti/drivers/Power.h>
708708
#include <ti/drivers/power/PowerCC26XX.h>
709+
#include "clock-arch.h"
709710

710711
const PowerCC26XX_Config PowerCC26XX_config = {
711712
.policyInitFxn = NULL,
712-
.policyFxn = &PowerCC26XX_standbyPolicy,
713+
.policyFxn = &clock_arch_standby_policy,
713714
.calibrateFxn = &PowerCC26XX_calibrate,
714715
.enablePolicy = true,
715716
.calibrateRCOSC_LF = true,

arch/platform/simplelink/cc13xx-cc26xx/srf06/cc13x0/CC1350DK_7XD.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -604,10 +604,11 @@ const PINCC26XX_HWAttrs PINCC26XX_hwAttrs = {
604604
*/
605605
#include <ti/drivers/Power.h>
606606
#include <ti/drivers/power/PowerCC26XX.h>
607+
#include "clock-arch.h"
607608

608609
const PowerCC26XX_Config PowerCC26XX_config = {
609610
.policyInitFxn = NULL,
610-
.policyFxn = &PowerCC26XX_standbyPolicy,
611+
.policyFxn = &clock_arch_standby_policy,
611612
.calibrateFxn = &PowerCC26XX_calibrate,
612613
.enablePolicy = true,
613614
.calibrateRCOSC_LF = true,

arch/platform/simplelink/cc13xx-cc26xx/srf06/cc26x0/CC2650DK_7ID.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -605,10 +605,11 @@ const PINCC26XX_HWAttrs PINCC26XX_hwAttrs = {
605605
*/
606606
#include <ti/drivers/Power.h>
607607
#include <ti/drivers/power/PowerCC26XX.h>
608+
#include "clock-arch.h"
608609

609610
const PowerCC26XX_Config PowerCC26XX_config = {
610611
.policyInitFxn = NULL,
611-
.policyFxn = &PowerCC26XX_standbyPolicy,
612+
.policyFxn = &clock_arch_standby_policy,
612613
.calibrateFxn = &PowerCC26XX_calibrate,
613614
.enablePolicy = true,
614615
.calibrateRCOSC_LF = true,

0 commit comments

Comments
 (0)