Example #1
0
/***********************************************************************
 *
 * 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;
}
Example #2
0
void exit_cb(uev_t *w, void *UNUSED(arg), int UNUSED(events))
{
	wdt_close(w->ctx);
}