All,
I am seeing an occasional problem following a watchdog timer re-boot. Our product uses a watchdog reset to implement a user-controlled re-boot of our product.
A user re-boot request will bring code execution to the following:
timer->wdtcr = TIMER_WDTCR_WDKEY(0x1111); timer->wdtcr = TIMER_WDTCR_WDKEY(0x2222);
while (1);
Whereby, the watchdog timer will generate a reset condition. Our MMU configuration is as follows:
const ESAL_GE_MEM_REGION ESAL_DP_MEM_Region_Data[ESAL_DP_MEM_NUM_REGIONS] =
{
/* MEMORY REGION 1 - INT SRAM (INSTRUCTION) */
{(VOID *)0x00000000, /* Physical Start */
(VOID *)0x00000000, /* Virtual Start */
ESAL_GE_MEM_16K, /* Size */
ESAL_NOCACHE, /* Cache type */
ESAL_RAM, /* Memory type */
ESAL_INST}, /* Memory access */
/* MEMORY REGION 2 - INT ROM (INSTRUCTION) */
{(VOID *)0x00004000, /* Physical Start */
(VOID *)0x00004000, /* Virtual Start */
ESAL_GE_MEM_16K, /* Size */
ESAL_NOCACHE, /* Cache type */
ESAL_ROM, /* Memory type */
ESAL_INST}, /* Memory access */
/* MEMORY REGION 3 - INT SRAM (DATA) */
{(VOID *)0x00008000, /* Physical Start */
(VOID *)0x00008000, /* Virtual Start */
ESAL_GE_MEM_16K, /* Size */
ESAL_NOCACHE, /* Cache type */
ESAL_RAM, /* Memory type */
ESAL_DATA}, /* Memory access */
/* MEMORY REGION 4 - INT ROM (DATA) */
{(VOID *)0x0000C000, /* Physical Start */
(VOID *)0x0000C000, /* Virtual Start */
ESAL_GE_MEM_16K, /* Size */
ESAL_NOCACHE, /* Cache type */
ESAL_ROM, /* Memory type */
ESAL_DATA}, /* Memory access */
/* MEMORY REGION 5 - Flash/NAND/SRAM/DC */
{(VOID *)0x02000000, /* Physical Start */
(VOID *)0x02000000, /* Virtual Start */
ESAL_GE_MEM_64M, /* Size */
ESAL_NOCACHE, /* Cache type */
ESAL_ROM, /* Memory type */
ESAL_INST_AND_DATA}, /* Memory access */
/* MEMORY REGION 6 - FPGA */
{(VOID *)0x06000000, /* Physical Start */
(VOID *)0x06000000, /* Virtual Start */
ESAL_GE_MEM_1M, /* Size */
ESAL_NOCACHE, /* Cache type */
ESAL_MEM_MAPPED, /* Memory type */
ESAL_DATA}, /* Memory access */
/* MEMORY REGION 8 - DDR SDRAM (cached) */
{(VOID *)0x80000000, /* Physical Start */
(VOID *)0x80000000, /* Virtual Start */
ESAL_GE_MEM_128M, /* Size */
ESAL_WRITEBACK, /* Cache type */
ESAL_RAM, /* Memory type */
ESAL_INST_AND_DATA}, /* Memory access */
/* MEMORY REGION 9 - DDR SDRAM (uncached) */
{(VOID *)0x88000000, /* Physical Start */
(VOID *)0x88000000, /* Virtual Start */
ESAL_GE_MEM_128M, /* Size */
ESAL_NOCACHE, /* Cache type */
ESAL_RAM, /* Memory type */
ESAL_INST_AND_DATA}, /* Memory access */
/* MEMORY REGION 10 - MEMORY MAPPED REGISTERS */
{(VOID *)ESAL_DP_PERIPH_BASE, /* Physical Start */
(VOID *)ESAL_DP_PERIPH_BASE, /* Virtual Start */
ESAL_GE_MEM_4M, /* Size */
ESAL_NOCACHE, /* Cache type */
ESAL_MEM_MAPPED, /* Memory type */
ESAL_DATA} /* Memory access */
};
and our boot mode is 01 (boot from AEMIF).
When the problem occurs and I stop execution in the debugger, I see that the MMU is off and the PC is in unmapped memory, sequentially executing bogus instructions consisting of all zero's. Over time, the PC wraps back around to 0 and the problem corrects itself.
Has anyone seen this behavior and can you help me identify the root cause? Thank you very much!
Best Regards,
Ron