2 // this is pulled from cpasjuste and/or pickle
4 #if defined (_PANDORA) || !defined (EMULATOR)
6 /* cribbed from pnd_keytypes.h so as to make it unnecessary */
7 #define BITS_PER_LONG (sizeof(long) * 8)
8 #define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1)
15 #include <stdlib.h> /* abs() */
16 #include <linux/input.h> /* struct input_event */
18 #include "pnd_io_gpio.h"
19 //#include "pnd_keytype.h"
21 unsigned char GLES2D_Pad [ pke_pad_max ];
24 int fd_usbk, fd_usbm, fd_gpio, fd_pndk, fd_nub1, fd_nub2, fd_ts, rd, i, j, k;
25 struct input_event ev[64];
28 unsigned long bit[EV_MAX][NBITS(KEY_MAX)];
29 char dev_name[256] = "Unknown";
32 char pnd_nub1[9] = "vsense66";
33 char pnd_nub2[9] = "vsense67";
34 char pnd_key[19] = "omap_twl4030keypad";
35 char pnd_gpio[10] = "gpio-keys";
42 #define NUB1_CUTOFF 100
43 #define NUB2_CUTOFF 100
46 void PND_Setup_Controls ( void ) {
47 //printf( "Setting up Pandora Controls\n" );
51 fd_pndk = PND_OpenEventDeviceByName(pnd_key);
53 fd_gpio = PND_OpenEventDeviceByName(pnd_gpio);
54 // Pandora analog nub's
55 fd_nub1 = PND_OpenEventDeviceByName(pnd_nub1);
56 fd_nub2 = PND_OpenEventDeviceByName(pnd_nub2);
60 void PND_Close_Controls ( void ) {
61 //printf( "Closing Pandora Controls\n" );
74 void PND_SendKeyEvents ( void ) {
75 PND_ReadEvents( fd_pndk, DEV_PNDK );
76 PND_ReadEvents( fd_gpio, DEV_GPIO );
77 PND_ReadEvents( fd_nub1, DEV_NUB1 );
78 PND_ReadEvents( fd_nub2, DEV_NUB2 );
81 void PND_ReadEvents ( int fd, int device ) {
85 rd = read ( fd, ev, sizeof(struct input_event) * 64 );
87 if ( rd > (int) sizeof(struct input_event) ) {
88 for (i = 0; i < rd / sizeof(struct input_event); i++) {
89 PND_CheckEvent ( &ev[i], device );
98 void PND_CheckEvent ( struct input_event *event, int device ) {
101 // printf( "Device %d Type %d Code %d Value %d\n", device, event->type, event->code, event->value );
103 value = event->value;
105 switch( event->type ) {
109 switch( event->code ) {
112 if ( event->value ) {
113 GLES2D_Pad[pke_pad_up] = 1;
115 GLES2D_Pad[pke_pad_up] = 0;
120 if ( event->value ) {
121 GLES2D_Pad[pke_pad_down] = 1;
123 GLES2D_Pad[pke_pad_down] = 0;
128 if ( event->value ) {
129 GLES2D_Pad[pke_pad_left] = 1;
131 GLES2D_Pad[pke_pad_left] = 0;
136 if ( event->value ) {
137 GLES2D_Pad[pke_pad_right] = 1;
139 GLES2D_Pad[pke_pad_right] = 0;
144 if ( event->value ) {
145 GLES2D_Pad[pke_pad_menu] = 1;
147 GLES2D_Pad[pke_pad_menu] = 0;
152 if ( event->value ) printf("START\n");
156 if ( event->value ) printf("SELECT\n");
160 if ( event->value ) {
161 GLES2D_Pad[pke_pad_x] = 1;
163 GLES2D_Pad[pke_pad_x] = 0;
168 if ( event->value ) {
169 GLES2D_Pad[pke_pad_y] = 1;
171 GLES2D_Pad[pke_pad_y] = 0;
176 if ( event->value ) {
177 GLES2D_Pad[pke_pad_a] = 1;
179 GLES2D_Pad[pke_pad_a] = 0;
184 if ( event->value ) {
185 GLES2D_Pad[pke_pad_b] = 1;
187 GLES2D_Pad[pke_pad_b] = 0;
192 if ( event->value ) {
193 GLES2D_Pad[pke_pad_l] = 1;
195 GLES2D_Pad[pke_pad_l] = 0;
200 if ( event->value ) {
201 GLES2D_Pad[pke_pad_r] = 1;
203 GLES2D_Pad[pke_pad_r] = 0;
217 if ( event->code == ABS_X ) {
218 //printf( "nub1 x %3d\n", value );
219 if( abs(value) > NUB1_CUTOFF ) {
222 } else if( value < 0 ) {
229 if( event->code == ABS_Y ) {
230 //printf( "nub1 y %3d\n", value );
231 if( abs(value) > NUB1_CUTOFF ) {
234 } else if( value < 0 ) {
243 if(event->code == ABS_X) {
244 //printf( "nub2 x %3d\n", value );
245 if( abs(value) > NUB2_CUTOFF ) {
248 } else if( value < 0 ) {
255 if(event->code == ABS_Y) {
256 //printf( "nub2 y %3d\n", value );
257 if( abs(value) > NUB2_CUTOFF ) {
260 } else if( value < 0 ) {
275 int PND_OpenEventDeviceByID ( int event_id ) {
278 snprintf( event_name, sizeof(event_name), "/dev/input/event%d", event_id );
279 printf( "Device: %s\n", event_name );
280 if ((fd = open(event_name, O_RDONLY | O_NDELAY)) < 0) {
281 perror("ERROR: Could not open device");
285 if (ioctl(fd, EVIOCGVERSION, &version)) {
286 perror("evtest: can't get version");
290 printf("Input driver version is %d.%d.%d\n",
291 version >> 16, (version >> 8) & 0xff, version & 0xff);
293 ioctl(fd, EVIOCGID, id);
294 printf("Input device ID: bus 0x%x vendor 0x%x product 0x%x version 0x%x\n",
295 id[ID_BUS], id[ID_VENDOR], id[ID_PRODUCT], id[ID_VERSION]);
297 ioctl(fd, EVIOCGNAME(sizeof(dev_name)), dev_name);
298 printf("Input device name: \"%s\"\n", dev_name);
303 int PND_OpenEventDeviceByName ( char device_name[] ) {
306 for (i = 0; 1; i++) {
308 snprintf( event_name, sizeof(event_name), "/dev/input/event%d", i );
309 printf( "Device: %s\n", event_name );
310 if ((fd = open(event_name, O_RDONLY | O_NDELAY)) < 0) {
311 perror("ERROR: Could not open device");
315 if (fd < 0) break; /* no more devices */
317 ioctl(fd, EVIOCGNAME(sizeof(dev_name)), dev_name);
318 if (strcmp(dev_name, device_name) == 0) {
320 if (ioctl(fd, EVIOCGVERSION, &version)) {
321 perror("evtest: can't get version");
325 printf("Input driver version is %d.%d.%d\n",
326 version >> 16, (version >> 8) & 0xff, version & 0xff);
328 ioctl(fd, EVIOCGID, id);
329 printf("Input device ID: bus 0x%x vendor 0x%x product 0x%x version 0x%x\n",
330 id[ID_BUS], id[ID_VENDOR], id[ID_PRODUCT], id[ID_VERSION]);
332 ioctl(fd, EVIOCGNAME(sizeof(dev_name)), dev_name);
333 printf("Input device name: \"%s\"\n", dev_name);
338 close(fd); /* we don't need this device */
344 int PND_Pad_RecentlyPressed ( pnd_keytype_e num ) {
345 static int GLES2D_Pad_old [ pke_pad_max ];
347 if ( !GLES2D_Pad_old[num] && GLES2D_Pad[num] ) {
348 GLES2D_Pad_old[num] = GLES2D_Pad[num];
352 GLES2D_Pad_old[num] = GLES2D_Pad[num];