2 #if defined (_PANDORA) || !defined (EMULATOR)
4 #include <stdlib.h> /* abs() */
5 #include <linux/input.h> /* struct input_event */
7 #include "pnd_io_gpio.h"
8 #include "pnd_keytype.h"
10 unsigned char GLES2D_Pad [ pke_pad_max ];
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];
17 unsigned long bit[EV_MAX][NBITS(KEY_MAX)];
18 char dev_name[256] = "Unknown";
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";
31 #define NUB1_CUTOFF 100
32 #define NUB2_CUTOFF 100
35 void PND_Setup_Controls ( void ) {
36 //printf( "Setting up Pandora Controls\n" );
40 fd_pndk = PND_OpenEventDeviceByName(pnd_key);
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);
49 void PND_Close_Controls ( void ) {
50 //printf( "Closing Pandora Controls\n" );
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 );
70 void PND_ReadEvents ( int fd, int device ) {
74 rd = read ( fd, ev, sizeof(struct input_event) * 64 );
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 );
87 void PND_CheckEvent ( struct input_event *event, int device ) {
90 // printf( "Device %d Type %d Code %d Value %d\n", device, event->type, event->code, event->value );
94 switch( event->type ) {
98 switch( event->code ) {
101 if ( event->value ) {
102 GLES2D_Pad[pke_pad_up] = 1;
104 GLES2D_Pad[pke_pad_up] = 0;
109 if ( event->value ) {
110 GLES2D_Pad[pke_pad_down] = 1;
112 GLES2D_Pad[pke_pad_down] = 0;
117 if ( event->value ) {
118 GLES2D_Pad[pke_pad_left] = 1;
120 GLES2D_Pad[pke_pad_left] = 0;
125 if ( event->value ) {
126 GLES2D_Pad[pke_pad_right] = 1;
128 GLES2D_Pad[pke_pad_right] = 0;
133 if ( event->value ) {
134 GLES2D_Pad[pke_pad_menu] = 1;
136 GLES2D_Pad[pke_pad_menu] = 0;
141 if ( event->value ) printf("START\n");
145 if ( event->value ) printf("SELECT\n");
149 if ( event->value ) {
150 GLES2D_Pad[pke_pad_x] = 1;
152 GLES2D_Pad[pke_pad_x] = 0;
157 if ( event->value ) {
158 GLES2D_Pad[pke_pad_y] = 1;
160 GLES2D_Pad[pke_pad_y] = 0;
165 if ( event->value ) {
166 GLES2D_Pad[pke_pad_a] = 1;
168 GLES2D_Pad[pke_pad_a] = 0;
173 if ( event->value ) {
174 GLES2D_Pad[pke_pad_b] = 1;
176 GLES2D_Pad[pke_pad_b] = 0;
181 if ( event->value ) {
182 GLES2D_Pad[pke_pad_l] = 1;
184 GLES2D_Pad[pke_pad_l] = 0;
189 if ( event->value ) {
190 GLES2D_Pad[pke_pad_r] = 1;
192 GLES2D_Pad[pke_pad_r] = 0;
206 if ( event->code == ABS_X ) {
207 //printf( "nub1 x %3d\n", value );
208 if( abs(value) > NUB1_CUTOFF ) {
211 } else if( value < 0 ) {
218 if( event->code == ABS_Y ) {
219 //printf( "nub1 y %3d\n", value );
220 if( abs(value) > NUB1_CUTOFF ) {
223 } else if( value < 0 ) {
232 if(event->code == ABS_X) {
233 //printf( "nub2 x %3d\n", value );
234 if( abs(value) > NUB2_CUTOFF ) {
237 } else if( value < 0 ) {
244 if(event->code == ABS_Y) {
245 //printf( "nub2 y %3d\n", value );
246 if( abs(value) > NUB2_CUTOFF ) {
249 } else if( value < 0 ) {
264 int PND_OpenEventDeviceByID ( int event_id ) {
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");
274 if (ioctl(fd, EVIOCGVERSION, &version)) {
275 perror("evtest: can't get version");
279 printf("Input driver version is %d.%d.%d\n",
280 version >> 16, (version >> 8) & 0xff, version & 0xff);
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]);
286 ioctl(fd, EVIOCGNAME(sizeof(dev_name)), dev_name);
287 printf("Input device name: \"%s\"\n", dev_name);
292 int PND_OpenEventDeviceByName ( char device_name[] ) {
295 for (i = 0; 1; i++) {
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");
304 if (fd < 0) break; /* no more devices */
306 ioctl(fd, EVIOCGNAME(sizeof(dev_name)), dev_name);
307 if (strcmp(dev_name, device_name) == 0) {
309 if (ioctl(fd, EVIOCGVERSION, &version)) {
310 perror("evtest: can't get version");
314 printf("Input driver version is %d.%d.%d\n",
315 version >> 16, (version >> 8) & 0xff, version & 0xff);
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]);
321 ioctl(fd, EVIOCGNAME(sizeof(dev_name)), dev_name);
322 printf("Input device name: \"%s\"\n", dev_name);
327 close(fd); /* we don't need this device */
333 int PND_Pad_RecentlyPressed ( pnd_keytype_e num ) {
334 static int GLES2D_Pad_old [ pke_pad_max ];
336 if ( !GLES2D_Pad_old[num] && GLES2D_Pad[num] ) {
337 GLES2D_Pad_old[num] = GLES2D_Pad[num];
341 GLES2D_Pad_old[num] = GLES2D_Pad[num];