new stuff
[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>
3bacb654 7#include <time.h>
9883c3e4
IS
8
9#include <sys/types.h>
10#include <sys/gpio.h>
11#include <sys/ioctl.h>
3bacb654 12#include <sys/time.h>
9883c3e4
IS
13
14#define UP(N) set_pin(N, 1)
15#define DOWN(N) set_pin(N, 0)
16
17#define DEL 100000
18
19#define MEM_WR 0x40
20#define ADDR_AUTO 0x44
21
22#define DISP_ON 0x8f
23#define DISP_OFF 0x80
24#define DISP_1 0x88
25#define DISP_2 0x89
26#define DISP_3 0x8a
27#define DISP_4 0x8b
28#define DISP_5 0x8c
29#define DISP_6 0x8d
30#define DISP_7 0x8e
31#define DISP_8 0x8f
32
9883c3e4
IS
33volatile int g0, g1, g2;
34
3bacb654
IS
35const uint8_t d2seg[] = {
36 0x3F
37 , 0x06
38 , 0x5B
39 , 0x4F
40 , 0x66
41 , 0x6D
42 , 0x7D
43 , 0x07
44 , 0x7F
45 , 0x6F
46 , 0x77
47 , 0x7C
48 , 0x39
49 , 0x5E
50 , 0x79
51 , 0x71
52};
53
54uint8_t dig(uint8_t d) {
55 return d2seg[d];
56}
57
58/*void timer(long usec) {
59 sigset_t sigs;
60 int s;
61
62 sigemptyset(&sigs);
63 sigaddset(&sigs, SIGALRM);
64
65 ualarm(usec, 0);
66 sigwait(&sigs, &s);
67}*/
68
69/*void timer(long usec) {
70 struct timespec t;
71 t.tv_nsec = usec;
72 t.tv_sec = 0;
73
74 nanosleep(&t, NULL);
75}*/
76
9883c3e4 77void kd() {
3bacb654
IS
78
79 asm("movs r0, #0");
80
81 for(int i = 0; i < 10; i++) {
82 asm("movs r0, #10\n\t"
83 "1: subs r0, r0, #1\n\t"
84 "bne 1b");
85 }
86
87/* volatile int t = 0;
88
89 while(t != 80000)
90 t++; */
9883c3e4
IS
91/* struct timespec ts, rem;
92
93 ts.tv_sec = 0;
94 ts.tv_nsec = DEL;
95
96 rem.tv_sec = 0;
97 rem.tv_nsec = 0;
98
3bacb654 99 nanosleep(&ts, &rem); */
9883c3e4
IS
100}
101
102int name2dev(char *s) {
103 if (! strncmp(s, "ser", GPIOPINMAXNAME))
104 return g1;
105 else if (! strncmp(s, "oe", GPIOPINMAXNAME))
106 return g0;
107 else if (! strncmp(s, "rclk", GPIOPINMAXNAME))
108 return g1;
109 else if (! strncmp(s, "srclk", GPIOPINMAXNAME))
110 return g2;
111 else if (! strncmp(s, "srclr", GPIOPINMAXNAME))
112 return g1;
113 else if (! strncmp(s, "dio", GPIOPINMAXNAME))
114 return g2;
115 else if (! strncmp(s, "clk", GPIOPINMAXNAME))
116 return g2;
3bacb654
IS
117 else if (! strncmp(s, "ser2", GPIOPINMAXNAME))
118 return g1;
119 else if (! strncmp(s, "clk-sr", GPIOPINMAXNAME))
120 return g1;
121 else if (! strncmp(s, "shld", GPIOPINMAXNAME))
122 return g1;
123 else if (! strncmp(s, "clr", GPIOPINMAXNAME))
124 return g0;
125
126
9883c3e4
IS
127 else {
128 printf("no gpio pin w/ name %s, exiting..\n", s);
129 exit(2);
130 }
131}
132
133void inth(int f) {
134 close(g0);
135 close(g1);
136 close(g2);
137
138 exit(9);
139}
140
141void ack_wait() {
142 struct gpio_pin_set p;
143 struct gpio_pin_op o;
144 int read = 0;
145
146 p.gp_pin = 6;
147 o.gp_pin = 6;
148 p.gp_flags = GPIO_PIN_INPUT | GPIO_PIN_PULLDOWN;
149 o.gp_value = 0;
150
151 ioctl(name2dev("dio"), GPIOPINWRITE, &o);
152 ioctl(name2dev("dio"), GPIOPINSET, &p);
153
154 while(!read) {
155 printf("waiting..\n");
156 ioctl(name2dev("dio"), GPIOPINREAD, &o);
157 read = o.gp_value;
158 }
159
160 p.gp_flags = GPIO_PIN_OUTPUT;
161 ioctl(name2dev("dio"), GPIOPINREAD, &o);
162}
163
164void set_pin(char *name, int state) {
165 struct gpio_pin_op op;
166
167 strlcpy(op.gp_name, name, GPIOPINMAXNAME);
168 op.gp_value = state;
169
170 ioctl(name2dev(name), GPIOPINWRITE, &op);
171}
172
173void config_pins() {
174 struct gpio_pin_set *ser, *oe, *rclk, *srclk, *srclr, *dio, *clk;
175
9f65bf39
IS
176 /* ??? XXX wtf */
177 system("gpioctl gpio2 6 set out clk");
178 system("gpioctl gpio2 8 set out dio");
179
9883c3e4
IS
180 ser = calloc(1, sizeof(struct gpio_pin_set));
181 oe = calloc(1, sizeof(struct gpio_pin_set));
182 rclk = calloc(1, sizeof(struct gpio_pin_set));
183 srclk = calloc(1, sizeof(struct gpio_pin_set));
184 srclr = calloc(1, sizeof(struct gpio_pin_set));
185 dio = calloc(1, sizeof(struct gpio_pin_set));
186 clk = calloc(1, sizeof(struct gpio_pin_set));
187
188 ser->gp_pin = 12;
189 ser->gp_flags = GPIO_PIN_OUTPUT;
190 strlcpy(ser->gp_name2, "ser", GPIOPINMAXNAME);
191
192 oe->gp_pin = 26;
193 oe->gp_flags = GPIO_PIN_OUTPUT;
194 strlcpy(oe->gp_name2, "oe", GPIOPINMAXNAME);
195
196 rclk->gp_pin = 14;
197 rclk->gp_flags = GPIO_PIN_OUTPUT;
198 strlcpy(rclk->gp_name2, "rclk", GPIOPINMAXNAME);
199
200 srclk->gp_pin = 1;
201 srclk->gp_flags = GPIO_PIN_OUTPUT;
202 strlcpy(srclk->gp_name2, "srclk", GPIOPINMAXNAME);
203
204 srclr->gp_pin = 31;
205 srclr->gp_flags = GPIO_PIN_OUTPUT;
206 strlcpy(srclr->gp_name2, "srclr", GPIOPINMAXNAME);
207
208 dio->gp_pin = 8;
209 dio->gp_flags = GPIO_PIN_OUTPUT;
210 strlcpy(dio->gp_name2, "dio", GPIOPINMAXNAME);
211
212 clk->gp_pin = 6;
213 clk->gp_flags = GPIO_PIN_OUTPUT;
214 strlcpy(clk->gp_name2, "clk", GPIOPINMAXNAME);
215
216 ioctl(name2dev("ser"), GPIOPINSET, ser);
217 ioctl(name2dev("oe"), GPIOPINSET, oe);
218 ioctl(name2dev("rclk"), GPIOPINSET, rclk);
219 ioctl(name2dev("srclk"), GPIOPINSET, srclk);
220 ioctl(name2dev("srclr"), GPIOPINSET, srclr);
221 ioctl(name2dev("dio"), GPIOPINSET, dio);
222 ioctl(name2dev("clk"), GPIOPINSET, clk);
223
224 free(ser);
225 free(oe);
226 free(rclk);
227 free(srclk);
228 free(srclr);
229 free(dio);
230 free(clk);
231}
232
233void pincnt() {
234 g0 = open("/dev/gpio0", O_RDWR);
235 g1 = open("/dev/gpio1", O_RDWR);
236 g2 = open("/dev/gpio2", O_RDWR);
237
238 struct gpio_info *inf0, *inf1, *inf2;
239 inf0 = calloc(1, sizeof(struct gpio_info));
240 inf1 = calloc(1, sizeof(struct gpio_info));
241 inf2 = calloc(1, sizeof(struct gpio_info));
242
243 ioctl(g0, GPIOINFO, inf0);
244 ioctl(g1, GPIOINFO, inf1);
245 ioctl(g2, GPIOINFO, inf2);
246
247 printf("gpio0: %d\ngpio1: %d\ngpio2: %d\n", inf0->gpio_npins, inf1->gpio_npins, inf2->gpio_npins);
248
249 free(inf0);
250 free(inf1);
251 free(inf2);
252}
253
254void start() {
255 DOWN("dio");
256 kd();
257}
258
259void stop() {
260 DOWN("dio");
261 kd();
262 UP("clk");
263 kd();
264 UP("dio");
265 kd();
266}
267
268void byte(uint8_t b) {
269 for(int i = 0; i < 8; i++) {
270 DOWN("clk");
271 kd();
272 (b & 0x1) ? UP("dio") : DOWN("dio");
273 kd();
274 UP("clk");
275 kd();
276 b >>= 1;
277 }
278
279 DOWN("clk");
280 UP("dio");
281 kd();
282 UP("clk");
283 kd();
284 DOWN("dio");
285 kd();
286 DOWN("clk");
287 kd();
288}
289
290void blink(int c, int ms) {
291 for(int i = 0; i < c; i++) {
292 byte(DISP_ON);
293 kd();
294 byte(DISP_OFF);
295 kd();
296 }
297}
298