initial commit
[bort-panel.git] / seg.h
CommitLineData
9883c3e4
IS
1#include <stdlib.h>
2#include <fcntl.h>
3#include <signal.h>
4#include <unistd.h>
5#include <string.h>
6#include <stdio.h>
7
8#include <sys/types.h>
9#include <sys/gpio.h>
10#include <sys/ioctl.h>
11
12#define UP(N) set_pin(N, 1)
13#define DOWN(N) set_pin(N, 0)
14
15#define DEL 100000
16
17#define MEM_WR 0x40
18#define ADDR_AUTO 0x44
19
20#define DISP_ON 0x8f
21#define DISP_OFF 0x80
22#define DISP_1 0x88
23#define DISP_2 0x89
24#define DISP_3 0x8a
25#define DISP_4 0x8b
26#define DISP_5 0x8c
27#define DISP_6 0x8d
28#define DISP_7 0x8e
29#define DISP_8 0x8f
30
31
32volatile int g0, g1, g2;
33
34void kd() {
35/* struct timespec ts, rem;
36
37 ts.tv_sec = 0;
38 ts.tv_nsec = DEL;
39
40 rem.tv_sec = 0;
41 rem.tv_nsec = 0;
42
43 nanosleep(&ts, &rem);
44 */
45}
46
47int name2dev(char *s) {
48 if (! strncmp(s, "ser", GPIOPINMAXNAME))
49 return g1;
50 else if (! strncmp(s, "oe", GPIOPINMAXNAME))
51 return g0;
52 else if (! strncmp(s, "rclk", GPIOPINMAXNAME))
53 return g1;
54 else if (! strncmp(s, "srclk", GPIOPINMAXNAME))
55 return g2;
56 else if (! strncmp(s, "srclr", GPIOPINMAXNAME))
57 return g1;
58 else if (! strncmp(s, "dio", GPIOPINMAXNAME))
59 return g2;
60 else if (! strncmp(s, "clk", GPIOPINMAXNAME))
61 return g2;
62 else {
63 printf("no gpio pin w/ name %s, exiting..\n", s);
64 exit(2);
65 }
66}
67
68void inth(int f) {
69 close(g0);
70 close(g1);
71 close(g2);
72
73 exit(9);
74}
75
76void ack_wait() {
77 struct gpio_pin_set p;
78 struct gpio_pin_op o;
79 int read = 0;
80
81 p.gp_pin = 6;
82 o.gp_pin = 6;
83 p.gp_flags = GPIO_PIN_INPUT | GPIO_PIN_PULLDOWN;
84 o.gp_value = 0;
85
86 ioctl(name2dev("dio"), GPIOPINWRITE, &o);
87 ioctl(name2dev("dio"), GPIOPINSET, &p);
88
89 while(!read) {
90 printf("waiting..\n");
91 ioctl(name2dev("dio"), GPIOPINREAD, &o);
92 read = o.gp_value;
93 }
94
95 p.gp_flags = GPIO_PIN_OUTPUT;
96 ioctl(name2dev("dio"), GPIOPINREAD, &o);
97}
98
99void set_pin(char *name, int state) {
100 struct gpio_pin_op op;
101
102 strlcpy(op.gp_name, name, GPIOPINMAXNAME);
103 op.gp_value = state;
104
105 ioctl(name2dev(name), GPIOPINWRITE, &op);
106}
107
108void config_pins() {
109 struct gpio_pin_set *ser, *oe, *rclk, *srclk, *srclr, *dio, *clk;
110
111 ser = calloc(1, sizeof(struct gpio_pin_set));
112 oe = calloc(1, sizeof(struct gpio_pin_set));
113 rclk = calloc(1, sizeof(struct gpio_pin_set));
114 srclk = calloc(1, sizeof(struct gpio_pin_set));
115 srclr = calloc(1, sizeof(struct gpio_pin_set));
116 dio = calloc(1, sizeof(struct gpio_pin_set));
117 clk = calloc(1, sizeof(struct gpio_pin_set));
118
119 ser->gp_pin = 12;
120 ser->gp_flags = GPIO_PIN_OUTPUT;
121 strlcpy(ser->gp_name2, "ser", GPIOPINMAXNAME);
122
123 oe->gp_pin = 26;
124 oe->gp_flags = GPIO_PIN_OUTPUT;
125 strlcpy(oe->gp_name2, "oe", GPIOPINMAXNAME);
126
127 rclk->gp_pin = 14;
128 rclk->gp_flags = GPIO_PIN_OUTPUT;
129 strlcpy(rclk->gp_name2, "rclk", GPIOPINMAXNAME);
130
131 srclk->gp_pin = 1;
132 srclk->gp_flags = GPIO_PIN_OUTPUT;
133 strlcpy(srclk->gp_name2, "srclk", GPIOPINMAXNAME);
134
135 srclr->gp_pin = 31;
136 srclr->gp_flags = GPIO_PIN_OUTPUT;
137 strlcpy(srclr->gp_name2, "srclr", GPIOPINMAXNAME);
138
139 dio->gp_pin = 8;
140 dio->gp_flags = GPIO_PIN_OUTPUT;
141 strlcpy(dio->gp_name2, "dio", GPIOPINMAXNAME);
142
143 clk->gp_pin = 6;
144 clk->gp_flags = GPIO_PIN_OUTPUT;
145 strlcpy(clk->gp_name2, "clk", GPIOPINMAXNAME);
146
147 ioctl(name2dev("ser"), GPIOPINSET, ser);
148 ioctl(name2dev("oe"), GPIOPINSET, oe);
149 ioctl(name2dev("rclk"), GPIOPINSET, rclk);
150 ioctl(name2dev("srclk"), GPIOPINSET, srclk);
151 ioctl(name2dev("srclr"), GPIOPINSET, srclr);
152 ioctl(name2dev("dio"), GPIOPINSET, dio);
153 ioctl(name2dev("clk"), GPIOPINSET, clk);
154
155 free(ser);
156 free(oe);
157 free(rclk);
158 free(srclk);
159 free(srclr);
160 free(dio);
161 free(clk);
162}
163
164void pincnt() {
165 g0 = open("/dev/gpio0", O_RDWR);
166 g1 = open("/dev/gpio1", O_RDWR);
167 g2 = open("/dev/gpio2", O_RDWR);
168
169 struct gpio_info *inf0, *inf1, *inf2;
170 inf0 = calloc(1, sizeof(struct gpio_info));
171 inf1 = calloc(1, sizeof(struct gpio_info));
172 inf2 = calloc(1, sizeof(struct gpio_info));
173
174 ioctl(g0, GPIOINFO, inf0);
175 ioctl(g1, GPIOINFO, inf1);
176 ioctl(g2, GPIOINFO, inf2);
177
178 printf("gpio0: %d\ngpio1: %d\ngpio2: %d\n", inf0->gpio_npins, inf1->gpio_npins, inf2->gpio_npins);
179
180 free(inf0);
181 free(inf1);
182 free(inf2);
183}
184
185void start() {
186 DOWN("dio");
187 kd();
188}
189
190void stop() {
191 DOWN("dio");
192 kd();
193 UP("clk");
194 kd();
195 UP("dio");
196 kd();
197}
198
199void byte(uint8_t b) {
200 for(int i = 0; i < 8; i++) {
201 DOWN("clk");
202 kd();
203 (b & 0x1) ? UP("dio") : DOWN("dio");
204 kd();
205 UP("clk");
206 kd();
207 b >>= 1;
208 }
209
210 DOWN("clk");
211 UP("dio");
212 kd();
213 UP("clk");
214 kd();
215 DOWN("dio");
216 kd();
217 DOWN("clk");
218 kd();
219}
220
221void blink(int c, int ms) {
222 for(int i = 0; i < c; i++) {
223 byte(DISP_ON);
224 kd();
225 byte(DISP_OFF);
226 kd();
227 }
228}
229
230