-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpwm_driver2.c
86 lines (79 loc) · 2.51 KB
/
pwm_driver2.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <stdio.h>
#include <malloc.h>
#include "pwm_driver2.h"
int pwm_driver2_prepare_device(pwm_driver2_descriptor_ptr driver) {
return pwm_prepare_device(driver->pwm) & \
gpio_prepare_device(driver->enable) & \
gpio_prepare_device(driver->direction);
}
pwm_driver2_t* pwm_driver2_open(pwm_driver2_descriptor_ptr driver) {
if (!pwm_driver2_prepare_device(driver)) {
printf("Cannot prepare driver %d\n", driver->id);
return NULL;
}
pwm_driver2_t* pwm_driver2 = malloc(sizeof(pwm_driver2_t));
pwm_driver2->pwm = pwm_open(driver->pwm, 50000);
if (!pwm_driver2->pwm) {
free(pwm_driver2);
return NULL;
}
pwm_driver2->direction = gpio_open(driver->direction, GPIO_OUT);
if (!pwm_driver2->direction) {
pwm_close(pwm_driver2->pwm);
free(pwm_driver2);
return NULL;
}
pwm_driver2->enable = driver->enable;
if (!gpio_write_direction_file(pwm_driver2->enable, GPIO_OUT)) {
pwm_close(pwm_driver2->pwm);
gpio_close(pwm_driver2->direction);
free(pwm_driver2);
return NULL;
}
pwm_driver2->pwm->zero = 0;
pwm_set_duty(pwm_driver2->pwm, pwm_driver2->pwm->zero);
gpio_write_value_file(pwm_driver2->enable, 0);
return pwm_driver2;
}
void pwm_driver2_close(pwm_driver2_t* pwm_driver2) {
if (pwm_driver2 == NULL)
return;
gpio_write_value_file(pwm_driver2->enable, 0);
gpio_close(pwm_driver2->direction);
pwm_close(pwm_driver2->pwm);
free(pwm_driver2);
}
int pwm_driver2_enable(pwm_driver2_t* pwm_driver2) {
if (!pwm_write_run_file(pwm_driver2->pwm->pin, 1))
return 0;
if (!gpio_write_value_file(pwm_driver2->enable, 1)) {
pwm_write_run_file(pwm_driver2->pwm->pin, 0);
return 0;
}
return -1;
}
int pwm_driver2_disable(pwm_driver2_t* pwm_driver2) {
if ( pwm_write_run_file(pwm_driver2->pwm->pin, 0) && gpio_write_value_file(pwm_driver2->enable, 0) )
return -1;
else
return 0;
}
int pwm_driver2_set_period(pwm_driver2_t* pwm_driver2, long period) {
int status = pwm_write_period_file(pwm_driver2->pwm->pin, period);
if (status)
pwm_driver2->pwm->zero = .5*pwm_driver2->pwm->period;
return status;
}
int pwm_driver2_set_command(pwm_driver2_t* pwm_driver2, float command) {
long duty;
if (command >= 0) {
gpio_set_value(pwm_driver2->direction, 0);
duty = command * pwm_driver2->pwm->period;
}
else {
gpio_set_value(pwm_driver2->direction, 1);
duty = -command * pwm_driver2->pwm->period;
}
duty = duty < pwm_driver2->pwm->period ? duty : pwm_driver2->pwm->period;
return pwm_set_duty(pwm_driver2->pwm, duty);
}