static int board_button_irq(int irq, FAR void *context) { static struct timespec time_down; if (board_pwr_button_down()) { led_on(BOARD_LED_RED); clock_gettime(CLOCK_REALTIME, &time_down); power_state_notification(PWR_BUTTON_DOWN); } else { power_state_notification(PWR_BUTTON_UP); led_off(BOARD_LED_RED); struct timespec now; clock_gettime(CLOCK_REALTIME, &now); uint64_t tdown_ms = time_down.tv_sec * 1000 + time_down.tv_nsec / 1000000; uint64_t tnow_ms = now.tv_sec * 1000 + now.tv_nsec / 1000000; if (tdown_ms != 0 && (tnow_ms - tdown_ms) >= MS_PWR_BUTTON_DOWN) { led_on(BOARD_LED_BLUE); if (power_state_notification(PWR_BUTTON_REQUEST_SHUT_DOWN) == PWR_BUTTON_RESPONSE_SHUT_DOWN_NOW) { up_mdelay(200); board_shutdown(); } } else { power_state_notification(PWR_BUTTON_IDEL); } } return OK; }
static int board_button_irq(int irq, FAR void *context) { static struct timespec time_down; if (board_pwr_button_down()) { led_on(BOARD_LED_RED); clock_gettime(CLOCK_REALTIME, &time_down); } else { led_off(BOARD_LED_RED); struct timespec now; clock_gettime(CLOCK_REALTIME, &now); uint64_t tdown_ms = time_down.tv_sec * 1000 + time_down.tv_nsec / 1000000; uint64_t tnow_ms = now.tv_sec * 1000 + now.tv_nsec / 1000000; if (tdown_ms != 0 && (tnow_ms - tdown_ms) >= MS_PWR_BUTTON_DOWN) { led_on(BOARD_LED_BLUE); up_mdelay(200); stm32_pwr_enablebkp(true); /* XXX wow, this is evil - write a magic number into backup register zero */ *(uint32_t *)0x40002850 = 0xdeaddead; stm32_pwr_enablebkp(false); up_mdelay(50); up_systemreset(); while (1); } } return OK; }