X-Git-Url: https://hackdaworld.org/gitweb/?p=my-code%2Farm.git;a=blobdiff_plain;f=betty%2Fpwm.c;fp=betty%2Fpwm.c;h=ec1cbf4b02f319e8af1caacbbc0eba578c658637;hp=0000000000000000000000000000000000000000;hb=773f6a91053e99de8afaa6e4b450e13f416ba98c;hpb=9f1a71389dff6cddd11c4b9975a0d1b91806ee2d diff --git a/betty/pwm.c b/betty/pwm.c new file mode 100644 index 0000000..ec1cbf4 --- /dev/null +++ b/betty/pwm.c @@ -0,0 +1,70 @@ +/* + * 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)); +} +