--- /dev/null
+/*
+ * pwm.c - arm pwm interface
+ *
+ * author: hackbard@hackdaworld.org
+ *
+ */
+
+#include "pwm.h"
+
+/*
+ * functions
+ */
+
+void pwm_set_rate_and_prescaler(u32 rate,u32 prescaler) {
+
+ PWMMR0=rate;
+ PWMPR=prescaler;
+}
+
+int pwm_config(u8 pwmchan,u8 mode,u32 val1,u32 val2) {
+
+ u32 *addr;
+
+ addr=(u32 *)&PWMMR0;
+
+ if((pwmchan>6)|(pwmchan<1))
+ return PWM_INVALID_CHAN;
+
+ if(mode==PWM_DOUBLE_EDGE) {
+ if(pwmchan&0x01)
+ return PWM_STUPID;
+ *((volatile u32 *)addr+pwmchan)=val2;
+ *((volatile u32 *)addr+pwmchan-1)=val1;
+ }
+
+ if(mode==PWM_SINGLE_EDGE)
+ *((volatile u32 *)addr+pwmchan)=val1;
+
+ PWMPCR=(PWMPCR&0x7e7c)|(mode<<(2+pwmchan))|(1<<(9+pwmchan));
+
+ return PWM_SET;
+}
+
+int pwm_update_match(u8 pwmchan,u8 mode,u32 val1,u32 val2) {
+
+ u32 *addr;
+
+ addr=(u32 *)&PWMMR0;
+
+ if((pwmchan>6)|(pwmchan<1))
+ return PWM_INVALID_CHAN;
+
+ if(mode==PWM_DOUBLE_EDGE) {
+ if(pwmchan&0x01)
+ return PWM_STUPID;
+ *((volatile u32 *)addr+pwmchan)=val2;
+ *((volatile u32 *)addr+pwmchan-1)=val1;
+ }
+
+ if(mode==PWM_SINGLE_EDGE)
+ *((volatile u32 *)addr+pwmchan)=val1;
+
+ return PWM_SET;
+}
+
+void pwm_match_ctrl_config(u8 matchreg,u8 ctrl) {
+
+ PWMMCR=(PWMMCR&0x1fffff)|(ctrl<<(3*matchreg));
+}
+