}
}
-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:
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);
}
/*
/* button init */
button.mode=BUTTON_INT;
button_init(&button);
- button_set_retries(&button,0);
+ button_set_retries(&button,30);
/* flash init */
flash_init();
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 ...
while(1) {
+ pause(0xffffff);
+ uart0_send_string((char *)announce);
}
return 0;
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(i<INTERRUPT_MAX_VIC) {
+ if((*cntl&0x1f)==src_number) {
+ *(addr+i)=callback;
+ return INTERRUPT_CALLBACK_CHANGED;
+ }
+ i++;
+ }
+
+ return INTERRUPT_SRC_NOT_USED;
+}
+
void interrupt_ext_ir_config(u8 eint,u8 wakeup,u8 mode,u8 polarity) {
if(eint>3)
EXTMODE=(EXTMODE&0xf)|(mode<<eint);
EXTPOLAR=(EXTPOLAR&0xf)|(polarity<<eint);
- EXTINT=(EXTINT&0xf)|(1<<eint);
+}
+
+void interrupt_ext_ir_set(u8 eint) {
+
+ if(eint>3)
+ return;
+
+ EXTINT=(1<<eint);
+}
+
+void interrupt_ack(void) {
+
+ VICVectAddr=0;
}
/*
#define INTERRUPT_SET 0x00
#define INTERRUPT_USED 0x01
#define INTERRUPT_PRIORITY_USED 0x02
+#define INTERRUPT_CALLBACK_CHANGED 0x03
+#define INTERRUPT_SRC_NOT_USED 0x04
/* type definitions */
void interrupt_clear(u8 src_number);
void interrupt_soft_enable(u8 src_number);
int interrupt_enable(u8 src_number,u8 mode,u8 priority,u32 callback_addr);
+int interrupt_change_callback(u8 src_number,u32 callback_addr);
void interrupt_ext_ir_config(u8 eint,u8 wakeup,u8 mode,u8 polarity);
+void interrupt_ext_ir_set(u8 eint);
+void interrupt_ack(void);
void interrupt_handler_reset(void);
void interrupt_handler_undef_instruction(void);