1.1 --- a/stage2/irq.c Sat May 14 21:40:59 2016 +0200
1.2 +++ b/stage2/irq.c Sat May 14 22:47:06 2016 +0200
1.3 @@ -32,31 +32,40 @@
1.4 {
1.5 handle_error_level();
1.6 timer_init_irq();
1.7 + gpio_init_irq();
1.8 init_interrupts();
1.9 }
1.10
1.11 void irq_handle()
1.12 {
1.13 - unsigned short i;
1.14 -
1.15 /* Check interrupt identity. */
1.16
1.17 if (REG_INTC_IPR & (1 << TIMER_CHAN_IRQ)) {
1.18
1.19 - /* Switch task. */
1.20 -
1.21 - switch_task();
1.22 -
1.23 /* Clear interrupt status. */
1.24
1.25 timer_clear();
1.26 + }
1.27 +
1.28 + /* GPIO interrupts. */
1.29 +
1.30 + if (REG_INTC_IPR & (1 << GPIO_IRQ)) {
1.31 +
1.32 + /* Check for the power button. */
1.33 +
1.34 + if (gpio_have_irq(GPIO_POWER)) {
1.35 +
1.36 + /* Switch task. */
1.37 +
1.38 + switch_task();
1.39 +
1.40 + /* Clear interrupt status. */
1.41 +
1.42 + gpio_clear(GPIO_POWER);
1.43 + }
1.44 + }
1.45
1.46 /* Handle other interrupts, anyway. */
1.47
1.48 - } else {
1.49 - for (i = 0; i < 32; i++) {
1.50 - if (REG_INTC_IPR & (1 << i))
1.51 - __intc_ack_irq(i);
1.52 - }
1.53 - }
1.54 + irq_clear();
1.55 }