X-Git-Url: https://hackdaworld.org/gitweb/?p=my-code%2Farm.git;a=blobdiff_plain;f=betty%2Finterrupts.c;h=24159c005515be363d4dd0f7ab700ac032ecfab8;hp=db2061dd433f66c0a378bfe4c76e4672b9f081d7;hb=7afb73c9bb16cfad0ff1e2455ba1cfd85754c8bc;hpb=945d83a31473b984473f571bb92486991d14aa16 diff --git a/betty/interrupts.c b/betty/interrupts.c index db2061d..24159c0 100644 --- a/betty/interrupts.c +++ b/betty/interrupts.c @@ -15,6 +15,8 @@ static t_interrupt interrupt; * functions */ +// generaal interrupt handling + void interrupt_init(void) { interrupt.default_soft_callback=0; @@ -33,6 +35,11 @@ void interrupt_set_soft_callback(void (*callback)(void)) { interrupt.default_soft_callback=callback; } +void interrupt_set_fiq_callback(void (*callback)(void)) { + + interrupt.fiq_callback=callback; +} + void interrupt_soft_clear(u8 src_number) { VICSoftIntClr=(1<3) @@ -105,7 +140,91 @@ void interrupt_ext_ir_config(u8 eint,u8 wakeup,u8 mode,u8 polarity) { EXTMODE=(EXTMODE&0xf)|(mode<3) + return; + + EXTINT=(1<1) + return; + + if(tcnum==0) { + T0TCR=0x03; + T0TC=0; + T0CTCR=mode|(cap<<2); + T0PR=psv; + } + else { + T1TCR=0x03; + T1TC=0; + T1CTCR=mode|(cap<<2); + T1PR=psv; + } +} + +void interrupt_tc_match_config(u8 tcnum,u8 mnum,u32 val,u8 mode) { + + u32 *mraddr; + + if(tcnum>1) + return; + + if(mnum>3) + return; + + if(tcnum==0) { + T0MCR=(T0MCR&0x0fff)|(mode<<(3*mnum)); + mraddr=(u32 *)&T0MR0; + } + else { + T1MCR=(T1MCR&0x0fff)|(mode<<(3*mnum)); + mraddr=(u32 *)&T1MR0; + } + + *((volatile u32 *)(mraddr+mnum))=val; +} + +void interrupt_tc_capt_config(u8 tcnum,u8 cnum,u8 mode) { + + if(tcnum>1) + return; + + if(cnum>3) + return; + + if(tcnum==0) + T0CCR=(T0CCR&0x0fff)|(mode<<(3*cnum)); + else + T1CCR=(T1CCR&0x0fff)|(mode<<(3*cnum)); +} + +void interrupt_tc_ir_set(u8 tcnum,u8 tcmc) { + + if(tcnum>1) + return; + + if(tcnum==0) { + T0IR=tcmc; + T0TCR=0x01; + } + else { + T1IR=tcmc; + T1TCR=0x01; + } +} + +// pwm interrupts +void interrupt_pwm_ir_set(u8 pwm_channel) { + + PWMIR=(pwm_channel&0x0f)|((pwm_channel&0x70)<<4); } /* @@ -137,5 +256,8 @@ void interrupt_handler_data_abort(void) { // fiq void interrupt_handler_fiq(void) { + + if(interrupt.fiq_callback) + interrupt.fiq_callback(); }