forgot to add the pwm code
[my-code/arm.git] / betty / pwm.c
1 /*
2  * pwm.c - arm pwm interface
3  *
4  * author: hackbard@hackdaworld.org
5  *
6  */
7
8 #include "pwm.h"
9
10 /*
11  * functions
12  */
13
14 void pwm_set_rate_and_prescaler(u32 rate,u32 prescaler) {
15
16         PWMMR0=rate;
17         PWMPR=prescaler;
18 }
19         
20 int pwm_config(u8 pwmchan,u8 mode,u32 val1,u32 val2) {
21
22         u32 *addr;
23
24         addr=(u32 *)&PWMMR0;
25
26         if((pwmchan>6)|(pwmchan<1))
27                 return PWM_INVALID_CHAN;
28
29         if(mode==PWM_DOUBLE_EDGE) {
30                 if(pwmchan&0x01)
31                         return PWM_STUPID;
32                 *((volatile u32 *)addr+pwmchan)=val2;
33                 *((volatile u32 *)addr+pwmchan-1)=val1;
34         }
35
36         if(mode==PWM_SINGLE_EDGE)
37                 *((volatile u32 *)addr+pwmchan)=val1;
38
39         PWMPCR=(PWMPCR&0x7e7c)|(mode<<(2+pwmchan))|(1<<(9+pwmchan));
40
41         return PWM_SET;
42 }
43
44 int pwm_update_match(u8 pwmchan,u8 mode,u32 val1,u32 val2) {
45
46         u32 *addr;
47
48         addr=(u32 *)&PWMMR0;
49
50         if((pwmchan>6)|(pwmchan<1))
51                 return PWM_INVALID_CHAN;
52
53         if(mode==PWM_DOUBLE_EDGE) {
54                 if(pwmchan&0x01)
55                         return PWM_STUPID;
56                 *((volatile u32 *)addr+pwmchan)=val2;
57                 *((volatile u32 *)addr+pwmchan-1)=val1;
58         }
59
60         if(mode==PWM_SINGLE_EDGE)
61                 *((volatile u32 *)addr+pwmchan)=val1;
62
63         return PWM_SET;
64 }
65
66 void pwm_match_ctrl_config(u8 matchreg,u8 ctrl) {
67
68         PWMMCR=(PWMMCR&0x1fffff)|(ctrl<<(3*matchreg));
69 }
70