0fe88612885f515b7fed40cca2b24a0bf4738f31
[pandora-libraries.git] / lib / pnd_io_gpio.c
1
2 #if defined (_PANDORA) || !defined (EMULATOR)
3
4 #include <stdlib.h> /* abs() */
5 #include <linux/input.h> /* struct input_event */
6
7 #include "pnd_io_gpio.h"
8 #include "pnd_keytype.h"
9
10 unsigned char GLES2D_Pad [ pke_pad_max ];
11
12 char event_name[30];
13 int fd_usbk, fd_usbm, fd_gpio, fd_pndk, fd_nub1, fd_nub2, fd_ts, rd, i, j, k;
14 struct input_event ev[64];
15 int version;
16 unsigned short id[4];
17 unsigned long bit[EV_MAX][NBITS(KEY_MAX)];
18 char dev_name[256] = "Unknown";
19 int absolute[5];
20
21 char pnd_nub1[9]  = "vsense66";
22 char pnd_nub2[9]  = "vsense67";
23 char pnd_key[19]  = "omap_twl4030keypad";
24 char pnd_gpio[10] = "gpio-keys";
25
26 #define DEV_NUB1 0
27 #define DEV_NUB2 1
28 #define DEV_PNDK 2
29 #define DEV_GPIO 3
30
31 #define NUB1_CUTOFF 100
32 #define NUB2_CUTOFF 100
33 #define NUB2_SCALE  10
34
35 void PND_Setup_Controls ( void ) {
36   //printf( "Setting up Pandora Controls\n" );
37
38   // Static Controls
39   // Pandora keyboard
40   fd_pndk = PND_OpenEventDeviceByName(pnd_key);
41   // Pandora buttons
42   fd_gpio = PND_OpenEventDeviceByName(pnd_gpio);
43   // Pandora analog nub's
44   fd_nub1 = PND_OpenEventDeviceByName(pnd_nub1);
45   fd_nub2 = PND_OpenEventDeviceByName(pnd_nub2);
46
47 }
48
49 void PND_Close_Controls ( void ) {
50   //printf( "Closing Pandora Controls\n" );
51
52   if( fd_pndk > 0 )
53     close(fd_pndk );
54   if( fd_gpio > 0 )
55     close(fd_gpio );
56   if( fd_nub1 > 0 )
57     close(fd_nub1 );
58   if( fd_nub2 > 0 )
59     close(fd_nub2 );
60
61 }
62
63 void PND_SendKeyEvents ( void ) {
64   PND_ReadEvents( fd_pndk, DEV_PNDK );
65   PND_ReadEvents( fd_gpio, DEV_GPIO );
66   PND_ReadEvents( fd_nub1, DEV_NUB1 );
67   PND_ReadEvents( fd_nub2, DEV_NUB2 );
68 }
69
70 void PND_ReadEvents ( int fd, int device ) {
71
72   if ( fd != 0 ) {
73
74     rd = read ( fd, ev, sizeof(struct input_event) * 64 );
75
76     if ( rd > (int) sizeof(struct input_event) ) {
77       for (i = 0; i < rd / sizeof(struct input_event); i++) {
78         PND_CheckEvent ( &ev[i], device );
79       }
80     }
81   
82   } // got fd?
83
84   return;
85 }
86
87 void PND_CheckEvent ( struct input_event *event, int device ) {
88   int value;
89
90   // printf( "Device %d Type %d Code %d Value %d\n", device, event->type, event->code, event->value );
91
92   value = event->value;
93
94   switch( event->type ) {
95
96   case EV_KEY:
97
98     switch( event->code ) {
99
100     case KEY_UP:
101       if ( event->value ) {     
102         GLES2D_Pad[pke_pad_up] = 1;
103       } else {
104         GLES2D_Pad[pke_pad_up] = 0;
105       }
106       break;
107
108     case KEY_DOWN:
109       if ( event->value ) {     
110         GLES2D_Pad[pke_pad_down] = 1;
111       } else {
112         GLES2D_Pad[pke_pad_down] = 0;
113       }
114       break;
115
116     case KEY_LEFT:
117       if ( event->value ) {     
118         GLES2D_Pad[pke_pad_left] = 1;
119       } else {
120         GLES2D_Pad[pke_pad_left] = 0;
121       }
122       break;
123
124     case KEY_RIGHT:
125       if ( event->value ) {     
126         GLES2D_Pad[pke_pad_right] = 1;
127       } else {
128         GLES2D_Pad[pke_pad_right] = 0;
129       }
130       break;
131
132     case KEY_MENU:
133       if ( event->value ) {     
134         GLES2D_Pad[pke_pad_menu] = 1;
135       } else {
136         GLES2D_Pad[pke_pad_menu] = 0;
137       }
138       break;
139
140     case BTN_START:
141       if ( event->value ) printf("START\n");
142       break;
143
144     case BTN_SELECT:
145       if ( event->value ) printf("SELECT\n");
146       break;
147
148     case BTN_X:
149       if ( event->value ) {     
150         GLES2D_Pad[pke_pad_x] = 1;
151       } else {
152         GLES2D_Pad[pke_pad_x] = 0;
153       }
154       break;
155
156     case BTN_Y:
157       if ( event->value ) {     
158         GLES2D_Pad[pke_pad_y] = 1;
159       } else {
160         GLES2D_Pad[pke_pad_y] = 0;
161       }
162       break;
163
164     case BTN_A:
165       if ( event->value ) {     
166         GLES2D_Pad[pke_pad_a] = 1;
167       } else {
168         GLES2D_Pad[pke_pad_a] = 0;
169       }
170       break;
171
172     case BTN_B:
173       if ( event->value ) {     
174         GLES2D_Pad[pke_pad_b] = 1;
175       } else {
176         GLES2D_Pad[pke_pad_b] = 0;
177       }
178       break;
179
180     case BTN_TL:
181       if ( event->value ) {     
182         GLES2D_Pad[pke_pad_l] = 1;
183       } else {
184         GLES2D_Pad[pke_pad_l] = 0;
185       }
186       break;
187
188     case BTN_TR:
189       if ( event->value ) {     
190         GLES2D_Pad[pke_pad_r] = 1;
191       } else {
192         GLES2D_Pad[pke_pad_r] = 0;
193       }
194       break;
195
196     default:
197       break;
198     }
199     break;
200     
201   case EV_ABS:
202
203     switch ( device ) {
204
205     case DEV_NUB1:
206       if ( event->code == ABS_X ) {
207         //printf( "nub1 x %3d\n", value );
208         if( abs(value) > NUB1_CUTOFF ) {
209           if( value > 0 ) {
210             value = 1;
211           } else if( value < 0 ) {
212             value = 1;                                              
213           }
214         } else {
215         }
216       }
217         
218       if( event->code == ABS_Y ) {
219         //printf( "nub1 y %3d\n", value );
220         if( abs(value) > NUB1_CUTOFF ) {
221           if( value > 0 ) {
222             value = 1;
223           } else if( value < 0 ) {
224             value = 1;
225           }
226         } else {
227         }
228       }
229       break;
230
231     case DEV_NUB2:
232       if(event->code == ABS_X) {
233         //printf( "nub2 x %3d\n", value );
234         if( abs(value) > NUB2_CUTOFF ) {
235           if( value > 0 ) {
236             value = 1;
237           } else if( value < 0 ) {
238             value = 1;                                              
239           }
240         } else {
241         }
242       }
243         
244       if(event->code == ABS_Y) {
245         //printf( "nub2 y %3d\n", value );
246         if( abs(value) > NUB2_CUTOFF ) {
247           if( value > 0 ) {
248             value = 1;
249           } else if( value < 0 ) {
250             value = 1;
251           }
252         } else {
253         }
254       }
255       break;
256
257     }
258     break;
259   }
260
261   return;
262 }
263
264 int PND_OpenEventDeviceByID ( int event_id ) {
265   int fd;
266
267   snprintf( event_name, sizeof(event_name), "/dev/input/event%d", event_id );
268   printf( "Device: %s\n", event_name );
269   if ((fd = open(event_name, O_RDONLY |  O_NDELAY)) < 0) {
270     perror("ERROR: Could not open device");
271     return 0;
272   }
273
274   if (ioctl(fd, EVIOCGVERSION, &version)) {
275     perror("evtest: can't get version");
276     return 0;
277   }
278
279   printf("Input driver version is %d.%d.%d\n",
280          version >> 16, (version >> 8) & 0xff, version & 0xff);
281
282   ioctl(fd, EVIOCGID, id);
283   printf("Input device ID: bus 0x%x vendor 0x%x product 0x%x version 0x%x\n",
284          id[ID_BUS], id[ID_VENDOR], id[ID_PRODUCT], id[ID_VERSION]);
285
286   ioctl(fd, EVIOCGNAME(sizeof(dev_name)), dev_name);
287   printf("Input device name: \"%s\"\n", dev_name);
288
289   return fd;
290 }
291
292 int PND_OpenEventDeviceByName ( char device_name[] ) {
293   int fd;
294
295   for (i = 0; 1; i++) {
296
297     snprintf( event_name, sizeof(event_name), "/dev/input/event%d", i );
298     printf( "Device: %s\n", event_name );
299     if ((fd = open(event_name, O_RDONLY |  O_NDELAY)) < 0) {
300       perror("ERROR: Could not open device");
301       return 0;
302     }
303
304     if (fd < 0) break; /* no more devices */
305
306     ioctl(fd, EVIOCGNAME(sizeof(dev_name)), dev_name);
307     if (strcmp(dev_name, device_name) == 0) {
308
309       if (ioctl(fd, EVIOCGVERSION, &version)) {
310         perror("evtest: can't get version");
311         return 0;
312       }
313
314       printf("Input driver version is %d.%d.%d\n",
315              version >> 16, (version >> 8) & 0xff, version & 0xff);
316
317       ioctl(fd, EVIOCGID, id);
318       printf("Input device ID: bus 0x%x vendor 0x%x product 0x%x version 0x%x\n",
319              id[ID_BUS], id[ID_VENDOR], id[ID_PRODUCT], id[ID_VERSION]);
320
321       ioctl(fd, EVIOCGNAME(sizeof(dev_name)), dev_name);
322       printf("Input device name: \"%s\"\n", dev_name);
323                   
324       return fd;
325     }
326
327     close(fd); /* we don't need this device */
328   }
329
330   return 0;
331 }
332
333 int PND_Pad_RecentlyPressed ( pnd_keytype_e num ) {
334   static int GLES2D_Pad_old [ pke_pad_max ];
335
336   if ( !GLES2D_Pad_old[num] && GLES2D_Pad[num] ) {
337     GLES2D_Pad_old[num] = GLES2D_Pad[num];
338     return 1;
339   }
340
341   GLES2D_Pad_old[num] = GLES2D_Pad[num];
342
343   return 0;
344 }
345
346 #endif