timer interrupts hopefully work now (pwm and isr not yet working!)
[my-code/arm.git] / betty / interrupts.c
index 0e0baa3..24159c0 100644 (file)
@@ -151,20 +151,22 @@ void interrupt_ext_ir_set(u8 eint) {
 }
 
 // timer counter interrupts
-void interrupt_tc_config(u8 tcnum,u8 mode,u8 cap,u32 psc) {
+void interrupt_tc_config(u8 tcnum,u8 mode,u8 cap,u32 psv) {
 
        if(tcnum>1)
                return;
 
        if(tcnum==0) {
                T0TCR=0x03;
+               T0TC=0;
                T0CTCR=mode|(cap<<2);
-               T0PR=psc;
+               T0PR=psv;
        }
        else {
                T1TCR=0x03;
+               T1TC=0;
                T1CTCR=mode|(cap<<2);
-               T1PR=psc;
+               T1PR=psv;
        }
 }
 
@@ -179,15 +181,15 @@ void interrupt_tc_match_config(u8 tcnum,u8 mnum,u32 val,u8 mode) {
                return;
 
        if(tcnum==0) {
-               T0MCR=mode<<(3*mnum);
-               mrddr=&T0MR0
+               T0MCR=(T0MCR&0x0fff)|(mode<<(3*mnum));
+               mraddr=(u32 *)&T0MR0;
        }
        else {
-               T1MCR=mode<<(3*mnum);
-               mrddr=&T1MR0
+               T1MCR=(T1MCR&0x0fff)|(mode<<(3*mnum));
+               mraddr=(u32 *)&T1MR0;
        }
 
-       mraddr[mnum]=val;
+       *((volatile u32 *)(mraddr+mnum))=val;
 }
 
 void interrupt_tc_capt_config(u8 tcnum,u8 cnum,u8 mode) {
@@ -199,9 +201,9 @@ void interrupt_tc_capt_config(u8 tcnum,u8 cnum,u8 mode) {
                return;
 
        if(tcnum==0)
-               T0CCR=mode<<(3*cnum);
+               T0CCR=(T0CCR&0x0fff)|(mode<<(3*cnum));
        else
-               T1CCR=mode<<(3*cnum);
+               T1CCR=(T1CCR&0x0fff)|(mode<<(3*cnum));
 }
 
 void interrupt_tc_ir_set(u8 tcnum,u8 tcmc) {
@@ -209,10 +211,20 @@ void interrupt_tc_ir_set(u8 tcnum,u8 tcmc) {
        if(tcnum>1)
                return;
 
-       if(tcnum==0)
+       if(tcnum==0) {
                T0IR=tcmc;
-       else
+               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);
 }
 
 /*