summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDaniel Campora <daniel@wipy.io>2015-08-09 18:54:29 +0200
committerDaniel Campora <daniel@wipy.io>2015-08-09 22:15:18 +0200
commit2673374d18c529800a4c89dc0a9d66c5b9dafb54 (patch)
tree42903b4a63e0d186c38133560132f042e5627f9c
parent651c870d77fdb34b50d74a4388bdc364d3b7a42e (diff)
downloadmicropython-2673374d18c529800a4c89dc0a9d66c5b9dafb54.tar.gz
micropython-2673374d18c529800a4c89dc0a9d66c5b9dafb54.zip
cc3200: Refactor PRCM special user bits implementation.
-rw-r--r--cc3200/bootmgr/main.c4
-rw-r--r--cc3200/hal/prcm.c80
-rw-r--r--cc3200/hal/prcm.h16
-rw-r--r--cc3200/misc/mperror.c2
-rw-r--r--cc3200/mods/pybsleep.c2
-rw-r--r--cc3200/mptask.c8
6 files changed, 36 insertions, 76 deletions
diff --git a/cc3200/bootmgr/main.c b/cc3200/bootmgr/main.c
index 32210e6de9..ecf6de99b4 100644
--- a/cc3200/bootmgr/main.c
+++ b/cc3200/bootmgr/main.c
@@ -171,7 +171,7 @@ static void bootmgr_board_init(void) {
mperror_init0();
// clear the safe boot flag, since we can't trust its content after reset
- PRCMClearSafeBootRequest();
+ PRCMClearSpecialBit(PRCM_SAFE_BOOT_BIT);
}
//*****************************************************************************
@@ -287,7 +287,7 @@ static void wait_for_safe_boot (sBootInfo_t *psBootInfo) {
// turn off the system led
MAP_GPIOPinWrite(MICROPY_SYS_LED_PORT, MICROPY_SYS_LED_PORT_PIN, 0);
// request a safe boot to the application
- PRCMRequestSafeBoot();
+ PRCMSetSpecialBit(PRCM_SAFE_BOOT_BIT);
}
// deinit the safe boot pin
mperror_deinit_sfe_pin();
diff --git a/cc3200/hal/prcm.c b/cc3200/hal/prcm.c
index d48b3ce77e..773fc90fb0 100644
--- a/cc3200/hal/prcm.c
+++ b/cc3200/hal/prcm.c
@@ -129,11 +129,12 @@
//*****************************************************************************
//
// Bit: 31 is used to indicate use of RTC. If set as '1', RTC feature is used.
-// Bit: 30 is used to indicate that a safe boot should be performed
-// bit: 29 is used to indicate that the last reset was caused by the WDT
-// Bits: 28 to 26 are unused
+// Bit: 30 is used to indicate that a safe boot should be performed.
+// bit: 29 is used to indicate that the last reset was caused by the WDT.
+// bit: 28 is used to indicate that the board is booting for the first time after being programmed in factory.
+// Bits: 27 and 26 are unused.
// Bits: 25 to 16 are used to save millisecond part of RTC reference.
-// Bits: 15 to 0 are being used for HW Changes / ECO
+// Bits: 15 to 0 are being used for HW Changes / ECO.
//
//*****************************************************************************
@@ -254,94 +255,49 @@ static const PRCM_PeriphRegs_t PRCM_PeriphRegsList[] =
//*****************************************************************************
//
-//! Requests a safe boot
+//! Set a special bit
//!
//! \return None.
//
//*****************************************************************************
-void PRCMRequestSafeBoot(void)
+void PRCMSetSpecialBit(unsigned char bit)
{
unsigned int uiRegValue;
- uiRegValue = MAP_PRCMHIBRegRead(RTC_MSEC_U32_REG_ADDR) | (1 << 30);
+ uiRegValue = MAP_PRCMHIBRegRead(RTC_MSEC_U32_REG_ADDR) | (1 << bit);
PRCMHIBRegWrite(RTC_MSEC_U32_REG_ADDR, uiRegValue);
}
//*****************************************************************************
//
-//! Clear the safe boot request
+//! Clear a special bit
//!
//! \return None.
//
//*****************************************************************************
-void PRCMClearSafeBootRequest(void)
+void PRCMClearSpecialBit(unsigned char bit)
{
unsigned int uiRegValue;
- uiRegValue = MAP_PRCMHIBRegRead(RTC_MSEC_U32_REG_ADDR) & (~(1 << 30));
+ uiRegValue = MAP_PRCMHIBRegRead(RTC_MSEC_U32_REG_ADDR) & (~(1 << bit));
PRCMHIBRegWrite(RTC_MSEC_U32_REG_ADDR, uiRegValue);
}
//*****************************************************************************
//
-//! Read the safe boot request bit. This bit is cleared after reading.
+//! Read a special bit
//!
-//! \return Value of the safe boot bit
+//! \return Value of the bit
//
//*****************************************************************************
-tBoolean PRCMIsSafeBootRequested(void)
+tBoolean PRCMGetSpecialBit(unsigned char bit)
{
- tBoolean safeboot = (MAP_PRCMHIBRegRead(RTC_MSEC_U32_REG_ADDR) & (1 << 30)) ? true : false;
-
- PRCMClearSafeBootRequest();
-
- return safeboot;
-}
-
-//*****************************************************************************
-//
-//! Signals that a WDT reset has occurred
-//!
-//! \return None.
-//
-//*****************************************************************************
-void PRCMSignalWDTReset(void)
-{
- unsigned int uiRegValue;
-
- uiRegValue = MAP_PRCMHIBRegRead(RTC_MSEC_U32_REG_ADDR) | (1 << 29);
-
- PRCMHIBRegWrite(RTC_MSEC_U32_REG_ADDR, uiRegValue);
-}
-
-//*****************************************************************************
-//
-//! Clear the WDT reset signal
-//!
-//! \return None.
-//
-//*****************************************************************************
-void PRCMClearWDTResetSignal(void)
-{
- unsigned int uiRegValue;
-
- uiRegValue = MAP_PRCMHIBRegRead(RTC_MSEC_U32_REG_ADDR) & (~(1 << 29));
-
- PRCMHIBRegWrite(RTC_MSEC_U32_REG_ADDR, uiRegValue);
-}
-
-//*****************************************************************************
-//
-//! Read the WDT reset signal bit
-//!
-//! \return Value of the WDT reset signal bit
-//
-//*****************************************************************************
-tBoolean PRCMWasResetBecauseOfWDT(void)
-{
- return (MAP_PRCMHIBRegRead(RTC_MSEC_U32_REG_ADDR) & (1 << 29)) ? true : false;
+ tBoolean value = (MAP_PRCMHIBRegRead(RTC_MSEC_U32_REG_ADDR) & (1 << bit)) ? true : false;
+ // special bits must be cleared immediatelly after reading
+ PRCMClearSpecialBit(bit);
+ return value;
}
//*****************************************************************************
diff --git a/cc3200/hal/prcm.h b/cc3200/hal/prcm.h
index a00bf9d774..110d8326ea 100644
--- a/cc3200/hal/prcm.h
+++ b/cc3200/hal/prcm.h
@@ -193,16 +193,20 @@ unsigned char ulRstReg;
#define PRCM_ADC 0x000000FF
//*****************************************************************************
+// User bits in the PRCM persistent registers
+//*****************************************************************************
+#define PRCM_SAFE_BOOT_BIT 30
+#define PRCM_WDT_RESET_BIT 29
+#define PRCM_FIRST_BOOT_BIT 28
+
+//*****************************************************************************
//
// API Function prototypes
//
//*****************************************************************************
-extern void PRCMRequestSafeBoot(void);
-extern void PRCMClearSafeBootRequest(void);
-extern tBoolean PRCMIsSafeBootRequested(void);
-extern void PRCMSignalWDTReset(void);
-extern void PRCMClearWDTResetSignal(void);
-extern tBoolean PRCMWasResetBecauseOfWDT(void);
+extern void PRCMSetSpecialBit(unsigned char bit);
+extern void PRCMClearSpecialBit(unsigned char bit);
+extern tBoolean PRCMGetSpecialBit(unsigned char bit);
extern void PRCMSOCReset(void);
extern void PRCMMCUReset(tBoolean bIncludeSubsystem);
extern unsigned long PRCMSysResetCauseGet(void);
diff --git a/cc3200/misc/mperror.c b/cc3200/misc/mperror.c
index cf2a1c8c1e..d1e9f46fb5 100644
--- a/cc3200/misc/mperror.c
+++ b/cc3200/misc/mperror.c
@@ -115,7 +115,7 @@ void mperror_bootloader_check_reset_cause (void) {
// since the reset cause will be changed, we must store the right reason
// so that the application knows it when booting for the next time
- PRCMSignalWDTReset();
+ PRCMSetSpecialBit(PRCM_WDT_RESET_BIT);
MAP_PRCMHibernateWakeupSourceEnable(PRCM_HIB_SLOW_CLK_CTR);
// set the sleep interval to 10ms
diff --git a/cc3200/mods/pybsleep.c b/cc3200/mods/pybsleep.c
index f810f91403..112f1a24f4 100644
--- a/cc3200/mods/pybsleep.c
+++ b/cc3200/mods/pybsleep.c
@@ -178,7 +178,7 @@ void pybsleep_init0 (void) {
pybsleep_reset_cause = PYB_SLP_WDT_RESET;
break;
case PRCM_HIB_EXIT:
- if (PRCMWasResetBecauseOfWDT()) {
+ if (PRCMGetSpecialBit(PRCM_WDT_RESET_BIT)) {
pybsleep_reset_cause = PYB_SLP_WDT_RESET;
}
else {
diff --git a/cc3200/mptask.c b/cc3200/mptask.c
index f14200ac37..6d66c90742 100644
--- a/cc3200/mptask.c
+++ b/cc3200/mptask.c
@@ -105,7 +105,10 @@ void TASK_Micropython (void *pvParameters) {
// initialize the garbage collector with the top of our stack
uint32_t sp = gc_helper_get_sp();
gc_collect_init (sp);
- bool safeboot = false;
+
+#ifndef DEBUG
+ bool safeboot = PRCMGetSpecialBit(PRCM_SAFE_BOOT_BIT);
+#endif
mptask_pre_init();
@@ -161,9 +164,6 @@ soft_reset:
else {
// only if not comming out of hibernate or a soft reset
mptask_enter_ap_mode();
- #ifndef DEBUG
- safeboot = PRCMIsSafeBootRequested();
- #endif
}
// enable telnet and ftp