From: hackbard Date: Thu, 20 Sep 2007 23:39:41 +0000 (+0200) Subject: basic interrupt approach succeded, buttons (extint) working perfectly from X-Git-Url: https://hackdaworld.org/gitweb/?a=commitdiff_plain;h=b75b1bf631a3bb68f50f65c65736b1bf743f51b7;p=my-code%2Farm.git basic interrupt approach succeded, buttons (extint) working perfectly from flash AND ram :) --- diff --git a/betty/betty.c b/betty/betty.c index 0bd6d0a..bac6614 100644 --- a/betty/betty.c +++ b/betty/betty.c @@ -37,9 +37,11 @@ void display_string_page(u8 x,u8 p,u8 *s,u8 f,u8 o,u8 sp) { } } -void input_event(void) { +void __attribute__ ((interrupt("IRQ"))) input_event(void) { - /* button test! */ + u8 noret,tries; + + /* button scan */ if(button_get_event(&button)) { switch(button.key[0]) { case BUTTON_POWER: @@ -109,6 +111,20 @@ void input_event(void) { break; } } + + /* resume the interrupt at button release */ + noret=1; + while(noret) { + tries=0xff; + noret=1; + while(tries--) { + noret=IOPIN0&(1<<30)?0:1; + if(noret) + break; + } + } + interrupt_ack(); + interrupt_ext_ir_set(INTERRUPT_EXT3); } /* @@ -139,7 +155,7 @@ int main() { /* button init */ button.mode=BUTTON_INT; button_init(&button); - button_set_retries(&button,0); + button_set_retries(&button,30); /* flash init */ flash_init(); @@ -153,7 +169,9 @@ int main() { interrupt_ext_ir_config(INTERRUPT_EXT3,INTERRUPT_EXT_NOWAKE, INTERRUPT_EXT_MODE_EDGE, INTERRUPT_EXT_POLAR_LOW); - interrupt_enable(INTERRUPT_EINT3,INTERRUPT_MODE_VIRQ,0,(u32)input_event); + interrupt_ext_ir_set(INTERRUPT_EXT3); + interrupt_enable(INTERRUPT_EINT3,INTERRUPT_MODE_VIRQ, + 0,(u32)input_event); /* * start it ... @@ -167,6 +185,8 @@ int main() { while(1) { + pause(0xffffff); + uart0_send_string((char *)announce); } return 0; diff --git a/betty/interrupts.c b/betty/interrupts.c index db2061d..e344f05 100644 --- a/betty/interrupts.c +++ b/betty/interrupts.c @@ -95,6 +95,26 @@ int interrupt_enable(u8 src_number,u8 mode,u8 priority,u32 callback_addr) { return INTERRUPT_SET; } +int interrupt_change_callback(u8 src_number,u32 callback) { + + int i; + u32 *addr,*cntl; + + cntl=(u32 *)&VICVectCntl0; + addr=(u32 *)&VICVectAddr0; + + i=0; + while(i3) @@ -105,7 +125,19 @@ void interrupt_ext_ir_config(u8 eint,u8 wakeup,u8 mode,u8 polarity) { EXTMODE=(EXTMODE&0xf)|(mode<3) + return; + + EXTINT=(1<