summaryrefslogtreecommitdiff
path: root/relay_control.c
diff options
context:
space:
mode:
Diffstat (limited to 'relay_control.c')
-rw-r--r--relay_control.c95
1 files changed, 95 insertions, 0 deletions
diff --git a/relay_control.c b/relay_control.c
new file mode 100644
index 0000000..7b0e59c
--- /dev/null
+++ b/relay_control.c
@@ -0,0 +1,95 @@
1#include <linux/init.h>
2#include <linux/module.h>
3#include <linux/gpio.h>
4#include <linux/string.h>
5
6MODULE_LICENSE("GPL");
7
8#define RELAY_K1 18
9#define RELAY_K2 23
10#define RELAY_K3 24
11#define RELAY_K4 25
12
13#define NO_OFF 0
14#define NO_ON 1
15
16static struct kobject *relay_kobject;
17
18static ssize_t set_relay(struct kobject *kobj, struct kobj_attribute *attr, const char *buff, size_t count) {
19 int relay = 0;
20 u8 v = 0;
21 sscanf(buff, "%hhd", &v);
22
23 if (strcmp(attr->attr.name, "relay1") == 0) {
24 relay = RELAY_K1;
25 } else if (strcmp(attr->attr.name, "relay2") == 0) {
26 relay = RELAY_K2;
27 } else if (strcmp(attr->attr.name, "relay3") == 0) {
28 relay = RELAY_K3;
29 } else if (strcmp(attr->attr.name, "relay4") == 0) {
30 relay = RELAY_K4;
31 }
32
33 gpio_set_value(relay, (v == 0) ? NO_OFF : NO_ON);
34 return count;
35}
36
37static ssize_t get_relay(struct kobject *kobj, struct kobj_attribute *attr, char *buff) {
38 int relay = 0;
39 if (strcmp(attr->attr.name, "relay1") == 0) {
40 relay = RELAY_K1;
41 } else if (strcmp(attr->attr.name, "relay2") == 0) {
42 relay = RELAY_K2;
43 } else if (strcmp(attr->attr.name, "relay3") == 0) {
44 relay = RELAY_K3;
45 } else if (strcmp(attr->attr.name, "relay4") == 0) {
46 relay = RELAY_K4;
47 }
48 return sprintf(buff, "%d", gpio_get_value(relay));
49}
50
51static struct kobj_attribute relay1_attribute = __ATTR(relay1, (S_IWUSR | S_IRUGO), get_relay, set_relay);
52static struct kobj_attribute relay2_attribute = __ATTR(relay2, (S_IWUSR | S_IRUGO), get_relay, set_relay);
53static struct kobj_attribute relay3_attribute = __ATTR(relay3, (S_IWUSR | S_IRUGO), get_relay, set_relay);
54static struct kobj_attribute relay4_attribute = __ATTR(relay4, (S_IWUSR | S_IRUGO), get_relay, set_relay);
55
56static int __init relay_init(void) {
57 gpio_request(RELAY_K1, "RELAY_K1");
58 gpio_request(RELAY_K2, "RELAY_K2");
59 gpio_request(RELAY_K3, "RELAY_K3");
60 gpio_request(RELAY_K4, "RELAY_K4");
61
62 gpio_direction_output(RELAY_K1, NO_ON);
63 gpio_direction_output(RELAY_K2, NO_ON);
64 gpio_direction_output(RELAY_K3, NO_ON);
65 gpio_direction_output(RELAY_K4, NO_ON);
66
67 relay_kobject = kobject_create_and_add("relay", NULL);
68
69 if (sysfs_create_file(relay_kobject, &relay1_attribute.attr)) {
70 pr_debug("failed to create relay1 sysfs!\n");
71 }
72 if (sysfs_create_file(relay_kobject, &relay2_attribute.attr)) {
73 pr_debug("failed to create relay2 sysfs!\n");
74 }
75 if (sysfs_create_file(relay_kobject, &relay3_attribute.attr)) {
76 pr_debug("failed to create relay3 sysfs!\n");
77 }
78 if (sysfs_create_file(relay_kobject, &relay4_attribute.attr)) {
79 pr_debug("failed to create relay4 sysfs!\n");
80 }
81
82 return 0;
83}
84
85static void __exit relay_exit(void) {
86 kobject_put(relay_kobject);
87
88 gpio_free(RELAY_K1);
89 gpio_free(RELAY_K2);
90 gpio_free(RELAY_K3);
91 gpio_free(RELAY_K4);
92}
93
94module_init(relay_init);
95module_exit(relay_exit);