+#elif defined(POLLUX_BUILD)
+ // caanoo
+ static const int evdev_to_gp2x[] = {
+ GP2X_A, GP2X_X, GP2X_B, GP2X_Y, GP2X_L, GP2X_R,
+ GP2X_HOME, 0, GP2X_START, GP2X_SELECT, GP2X_PUSH
+ };
+ int keybits[KEY_CNT / sizeof(int)];
+ struct input_absinfo ainfo;
+ int lzone = analog_sensitivity_level * lzone_step;
+ u32 retval = 0;
+ int i, ret;
+
+ ret = ioctl(gpsp_gp2x_indev, EVIOCGKEY(sizeof(keybits)), keybits);
+ if (ret == -1) {
+ perror("EVIOCGKEY ioctl failed");
+ sleep(1);
+ return 0;
+ }
+
+ for (i = 0; i < sizeof(evdev_to_gp2x) / sizeof(evdev_to_gp2x[0]); i++) {
+ if (KEYBITS_BIT(BTN_TRIGGER + i))
+ retval |= evdev_to_gp2x[i];
+ }
+
+ if (lzone != 0)
+ lzone--;
+
+ ret = ioctl(gpsp_gp2x_indev, EVIOCGABS(ABS_X), &ainfo);
+ if (ret != -1) {
+ if (ainfo.value <= abs_min + lzone) retval |= GP2X_LEFT;
+ else if (ainfo.value >= abs_max - lzone) retval |= GP2X_RIGHT;
+ }
+ ret = ioctl(gpsp_gp2x_indev, EVIOCGABS(ABS_Y), &ainfo);
+ if (ret != -1) {
+ if (ainfo.value <= abs_min + lzone) retval |= GP2X_UP;
+ else if (ainfo.value >= abs_max - lzone) retval |= GP2X_DOWN;
+ }
+
+ return retval;