cc3200: Refactor PRCM special user bits implementation.

pull/1411/head
Daniel Campora 2015-08-09 18:54:29 +02:00
rodzic 651c870d77
commit 2673374d18
6 zmienionych plików z 36 dodań i 76 usunięć

Wyświetl plik

@ -171,7 +171,7 @@ static void bootmgr_board_init(void) {
mperror_init0(); mperror_init0();
// clear the safe boot flag, since we can't trust its content after reset // 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 // turn off the system led
MAP_GPIOPinWrite(MICROPY_SYS_LED_PORT, MICROPY_SYS_LED_PORT_PIN, 0); MAP_GPIOPinWrite(MICROPY_SYS_LED_PORT, MICROPY_SYS_LED_PORT_PIN, 0);
// request a safe boot to the application // request a safe boot to the application
PRCMRequestSafeBoot(); PRCMSetSpecialBit(PRCM_SAFE_BOOT_BIT);
} }
// deinit the safe boot pin // deinit the safe boot pin
mperror_deinit_sfe_pin(); mperror_deinit_sfe_pin();

Wyświetl plik

@ -129,11 +129,12 @@
//***************************************************************************** //*****************************************************************************
// //
// Bit: 31 is used to indicate use of RTC. If set as '1', RTC feature is used. // 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: 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: 29 is used to indicate that the last reset was caused by the WDT.
// Bits: 28 to 26 are unused // 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: 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. //! \return None.
// //
//***************************************************************************** //*****************************************************************************
void PRCMRequestSafeBoot(void) void PRCMSetSpecialBit(unsigned char bit)
{ {
unsigned int uiRegValue; 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); PRCMHIBRegWrite(RTC_MSEC_U32_REG_ADDR, uiRegValue);
} }
//***************************************************************************** //*****************************************************************************
// //
//! Clear the safe boot request //! Clear a special bit
//! //!
//! \return None. //! \return None.
// //
//***************************************************************************** //*****************************************************************************
void PRCMClearSafeBootRequest(void) void PRCMClearSpecialBit(unsigned char bit)
{ {
unsigned int uiRegValue; 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); 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; tBoolean value = (MAP_PRCMHIBRegRead(RTC_MSEC_U32_REG_ADDR) & (1 << bit)) ? true : false;
// special bits must be cleared immediatelly after reading
PRCMClearSafeBootRequest(); PRCMClearSpecialBit(bit);
return value;
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;
} }
//***************************************************************************** //*****************************************************************************

Wyświetl plik

@ -192,17 +192,21 @@ unsigned char ulRstReg;
// PRCM_ADC should never be used in any user code. // PRCM_ADC should never be used in any user code.
#define PRCM_ADC 0x000000FF #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 // API Function prototypes
// //
//***************************************************************************** //*****************************************************************************
extern void PRCMRequestSafeBoot(void); extern void PRCMSetSpecialBit(unsigned char bit);
extern void PRCMClearSafeBootRequest(void); extern void PRCMClearSpecialBit(unsigned char bit);
extern tBoolean PRCMIsSafeBootRequested(void); extern tBoolean PRCMGetSpecialBit(unsigned char bit);
extern void PRCMSignalWDTReset(void);
extern void PRCMClearWDTResetSignal(void);
extern tBoolean PRCMWasResetBecauseOfWDT(void);
extern void PRCMSOCReset(void); extern void PRCMSOCReset(void);
extern void PRCMMCUReset(tBoolean bIncludeSubsystem); extern void PRCMMCUReset(tBoolean bIncludeSubsystem);
extern unsigned long PRCMSysResetCauseGet(void); extern unsigned long PRCMSysResetCauseGet(void);

Wyświetl plik

@ -115,7 +115,7 @@ void mperror_bootloader_check_reset_cause (void) {
// since the reset cause will be changed, we must store the right reason // 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 // 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); MAP_PRCMHibernateWakeupSourceEnable(PRCM_HIB_SLOW_CLK_CTR);
// set the sleep interval to 10ms // set the sleep interval to 10ms

Wyświetl plik

@ -178,7 +178,7 @@ void pybsleep_init0 (void) {
pybsleep_reset_cause = PYB_SLP_WDT_RESET; pybsleep_reset_cause = PYB_SLP_WDT_RESET;
break; break;
case PRCM_HIB_EXIT: case PRCM_HIB_EXIT:
if (PRCMWasResetBecauseOfWDT()) { if (PRCMGetSpecialBit(PRCM_WDT_RESET_BIT)) {
pybsleep_reset_cause = PYB_SLP_WDT_RESET; pybsleep_reset_cause = PYB_SLP_WDT_RESET;
} }
else { else {

Wyświetl plik

@ -105,7 +105,10 @@ void TASK_Micropython (void *pvParameters) {
// initialize the garbage collector with the top of our stack // initialize the garbage collector with the top of our stack
uint32_t sp = gc_helper_get_sp(); uint32_t sp = gc_helper_get_sp();
gc_collect_init (sp); gc_collect_init (sp);
bool safeboot = false;
#ifndef DEBUG
bool safeboot = PRCMGetSpecialBit(PRCM_SAFE_BOOT_BIT);
#endif
mptask_pre_init(); mptask_pre_init();
@ -161,9 +164,6 @@ soft_reset:
else { else {
// only if not comming out of hibernate or a soft reset // only if not comming out of hibernate or a soft reset
mptask_enter_ap_mode(); mptask_enter_ap_mode();
#ifndef DEBUG
safeboot = PRCMIsSafeBootRequested();
#endif
} }
// enable telnet and ftp // enable telnet and ftp