/*********************************************************************** * * Function: c_entry * * Purpose: Application entry point from the startup code * * Processing: * See function. * * Parameters: None * * Outputs: None * * Returns: Always returns 1, or <0 on an error * * Notes: None * **********************************************************************/ int c_entry(void) { /* Disable interrupts in ARM core */ disable_irq_fiq(); /* Setup miscellaneous board functions */ phy3250_board_init(); /* Set virtual address of MMU table */ cp15_set_vmmu_addr((void *) (IRAM_BASE + (256 * 1024) - (16 * 1024))); /* Initialize interrupt system */ int_initialize(0xFFFFFFFF); /* Install standard IRQ dispatcher at ARM IRQ vector */ int_install_arm_vec_handler(IRQ_VEC, (PFV) lpc32xx_irq_handler); /* Enable simple WDT clock */ clkpwr_clk_en_dis(CLKPWR_WDOG_CLK, 1); /* Install WDT interrupt handler as an IRQ interrupt */ int_install_ext_irq_handler(IRQ_WATCH, (PFV) wdt_user_interrupt, ACTIVE_HIGH, 1); /* Open WDT */ wdtdev = wdt_open(WDT, 0); if (wdtdev == 0) { /* Error */ return -1; } /* Enable IRQ interrupts in the ARM core */ enable_irq(); /* Drive RESETOUT high/low/high using RESFRC1 */ wdtsetup.initial_setup = TRUE; wdtsetup.pause = 1; wdtsetup.resfrc2 = 0; wdtsetup.resfrc1 = 0; wdtsetup.m_res2 = 0; wdtsetup.m_res1 = 0; wdtsetup.ext_match_setup = WDT_EXT_MATCH_IDLE; wdtsetup.match_setup = WDT_MATCH_IDLE; wdtsetup.match0_update = FALSE; wdtsetup.counter_update = FALSE; wdtsetup.pulse_update = FALSE; wdt_ioctl(wdtdev, WDT_SETUP, (UNS_32) &wdtsetup); delay(10000); wdtsetup.resfrc1 = 1; wdt_ioctl(wdtdev, WDT_SETUP, (UNS_32) &wdtsetup); delay(10000); wdtsetup.resfrc1 = 0; wdt_ioctl(wdtdev, WDT_SETUP, (UNS_32) &wdtsetup); delay(10000); #ifdef RESET_CHIP_example /* generate a 10 ms delay followed by a 3 ms */ /* RESETOUT pulse using M_RES2 = 1 */ wdt_ioctl(wdtdev, WDT_TIMER_STOP, 0); wdt_ioctl(wdtdev, WDT_INT_DISABLE, 0); wdt_ioctl(wdtdev, WDT_INT_CLEAR, 0); wdtsetup.initial_setup = TRUE; wdtsetup.pause = 1; wdtsetup.resfrc2 = 0; wdtsetup.resfrc1 = 0; wdtsetup.m_res2 = 1; wdtsetup.m_res1 = 0; wdtsetup.ext_match_setup = WDT_EXT_MATCH_HIGH; wdtsetup.match_setup = WDT_MATCH_EN_INT_RESET; wdtsetup.match0 = 10 * 13000; wdtsetup.match0_update = TRUE; wdtsetup.counter_update = FALSE; wdtsetup.pulse = 3 * 13000 - 5; wdtsetup.pulse_update = TRUE; wdt_ioctl(wdtdev, WDT_SETUP, (UNS_32) &wdtsetup); wdt_ioctl(wdtdev, WDT_INT_CLEAR, 0); wdt_ioctl(wdtdev, WDT_INT_ENABLE, 0); int_enable(IRQ_WATCH); while (1); #endif /* Close WDT */ wdt_close(wdtdev); return 1; }
void exit_cb(uev_t *w, void *UNUSED(arg), int UNUSED(events)) { wdt_close(w->ctx); }