X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=frontend%2Fplat_pandora.c;h=9ec747dba96f10dba7bfd26eb2b77113de4ae035;hp=d7837ce759de60ada4e3e34adb5bbab4d371e4f0;hb=7d5140f5d608cfe3f69cc4d75e78c8c2b30b7d1a;hpb=55b0eeea6028e00741e620d28ab3211c49b8515f diff --git a/frontend/plat_pandora.c b/frontend/plat_pandora.c index d7837ce7..9ec747db 100644 --- a/frontend/plat_pandora.c +++ b/frontend/plat_pandora.c @@ -14,15 +14,16 @@ #include #include #include +#include #include #include "common/input.h" +#include "linux/in_evdev.h" #include "plugin_lib.h" #include "plat.h" +#include "plat_omap.h" #include "main.h" - -static int fdnub[2]; -static int analog_init_done; +#include "menu.h" static const char * const pandora_gpio_keys[KEY_MAX + 1] = { [0 ... KEY_MAX] = NULL, @@ -41,7 +42,7 @@ static const char * const pandora_gpio_keys[KEY_MAX + 1] = { [KEY_MENU] = "Pandora", }; -struct in_default_bind in_evdev_defbinds[] = { +static const struct in_default_bind in_evdev_defbinds[] = { { KEY_UP, IN_BINDTYPE_PLAYER12, DKEY_UP }, { KEY_DOWN, IN_BINDTYPE_PLAYER12, DKEY_DOWN }, { KEY_LEFT, IN_BINDTYPE_PLAYER12, DKEY_LEFT }, @@ -56,6 +57,7 @@ struct in_default_bind in_evdev_defbinds[] = { { KEY_RIGHTCTRL, IN_BINDTYPE_PLAYER12, DKEY_R1 }, { KEY_Q, IN_BINDTYPE_PLAYER12, DKEY_L2 }, { KEY_P, IN_BINDTYPE_PLAYER12, DKEY_R2 }, + { KEY_MENU, IN_BINDTYPE_EMU, SACTION_MINIMIZE }, { KEY_SPACE, IN_BINDTYPE_EMU, SACTION_ENTER_MENU }, { KEY_1, IN_BINDTYPE_EMU, SACTION_SAVE_STATE }, { KEY_2, IN_BINDTYPE_EMU, SACTION_LOAD_STATE }, @@ -66,103 +68,148 @@ struct in_default_bind in_evdev_defbinds[] = { { 0, 0, 0 } }; -static void analog_init(void) -{ - int i, nub; +static const char pnd_script_base[] = "sudo -n /usr/pandora/scripts"; +static char **pnd_filter_list; - fdnub[0] = fdnub[1] = -1; +static void scan_for_filters(void) +{ + struct dirent *ent; + int i, count = 0; + char **mfilters; + char buff[64]; + DIR *dir; - for (i = nub = 0; nub < 2; i++) - { - long absbits[(ABS_MAX+1) / sizeof(long) / 8]; - int ret, fd, support = 0; - char name[64]; + dir = opendir("/etc/pandora/conf/dss_fir"); + if (dir == NULL) { + perror("filter opendir"); + return; + } - snprintf(name, sizeof(name), "/dev/input/event%d", i); - fd = open(name, O_RDONLY|O_NONBLOCK); - if (fd == -1) { - if (errno == EACCES) - continue; /* maybe we can access next one */ + while (1) { + errno = 0; + ent = readdir(dir); + if (ent == NULL) { + if (errno != 0) + perror("readdir"); break; } - /* check supported events */ - ret = ioctl(fd, EVIOCGBIT(0, sizeof(support)), &support); - if (ret == -1) { - printf("pandora: ioctl failed on %s\n", name); - goto skip; - } - - if (!(support & (1 << EV_ABS))) - goto skip; - - ret = ioctl(fd, EVIOCGNAME(sizeof(name)), name); - if (ret == -1 || strncmp(name, "nub", 3) != 0) - goto skip; - - ret = ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(absbits)), absbits); - if (ret == -1) - goto skip; - if ((absbits[0] & ((1 << ABS_X)|(1 << ABS_Y))) != ((1 << ABS_X)|(1 << ABS_Y))) - goto skip; - - printf("pandora: found analog #%d \"%s\"\n", nub, name); - fdnub[nub++] = fd; - continue; + if (ent->d_type != DT_REG && ent->d_type != DT_LNK) + continue; -skip: - close(fd); + count++; } - if (nub != 2) - printf("pandora: warning: not all nubs found: %d\n", nub); + if (count == 0) + return; - analog_init_done = 1; -} - -void in_update_analogs(void) -{ - int *nubp[2] = { in_a1, in_a2 }; - struct input_absinfo ainfo; - int i, fd, v, ret; + mfilters = calloc(count + 1, sizeof(mfilters[0])); + if (mfilters == NULL) + return; - if (!analog_init_done) - analog_init(); + rewinddir(dir); + for (i = 0; (ent = readdir(dir)); ) { + size_t len; - for (i = 0; i < 2; i++) { - fd = fdnub[i]; - if (fd < 0) + if (ent->d_type != DT_REG && ent->d_type != DT_LNK) continue; - ret = ioctl(fd, EVIOCGABS(ABS_X), &ainfo); - if (ret == -1) { - perror("ioctl"); + len = strlen(ent->d_name); + + // skip pre-HF5 extra files + if (len >= 3 && strcmp(ent->d_name + len - 3, "_v3") == 0) continue; - } - v = ainfo.value / 2 + 127; - nubp[i][0] = v < 0 ? 0 : v; + if (len >= 3 && strcmp(ent->d_name + len - 3, "_v5") == 0) + continue; + + // have to cut "_up_h" for pre-HF5 + if (len > 5 && strcmp(ent->d_name + len - 5, "_up_h") == 0) + len -= 5; - ret = ioctl(fd, EVIOCGABS(ABS_Y), &ainfo); - if (ret == -1) { - perror("ioctl"); + if (len > sizeof(buff) - 1) continue; - } - v = ainfo.value / 2 + 127; - nubp[i][1] = v < 0 ? 0 : v; + + strncpy(buff, ent->d_name, len); + buff[len] = 0; + mfilters[i] = strdup(buff); + if (mfilters[i] != NULL) + i++; } - //printf("%4d %4d %4d %4d\n", in_a1[0], in_a1[1], in_a2[0], in_a2[1]); + closedir(dir); + + pnd_filter_list = mfilters; + menu_set_filter_list((void *)mfilters); } -int plat_rescan_inputs(void) +int plat_init(void) { + int gpiokeys_id; + + plat_omap_init(); + + in_evdev_init(in_evdev_defbinds); in_probe(); - in_set_config(in_name_to_id("evdev:gpio-keys"), IN_CFG_KEY_NAMES, + gpiokeys_id = in_name_to_id("evdev:gpio-keys"); + in_set_config(gpiokeys_id, IN_CFG_KEY_NAMES, pandora_gpio_keys, sizeof(pandora_gpio_keys)); + in_set_config(gpiokeys_id, IN_CFG_DEFAULT_DEV, NULL, 0); + in_adev[0] = in_name_to_id("evdev:nub0"); + in_adev[1] = in_name_to_id("evdev:nub1"); + + scan_for_filters(); return 0; } -static const char pnd_script_base[] = "sudo -n /usr/pandora/scripts"; +void plat_finish(void) +{ + plat_omap_finish(); +} + +static void apply_lcdrate(int pal) +{ + char buf[128]; + + snprintf(buf, sizeof(buf), "%s/op_lcdrate.sh %d", + pnd_script_base, pal ? 50 : 60); + system(buf); +} + +static void apply_filter(int which) +{ + char buf[128]; + int i; + + if (pnd_filter_list == NULL) + return; + + for (i = 0; i < which; i++) + if (pnd_filter_list[i] == NULL) + return; + + if (pnd_filter_list[i] == NULL) + return; + + snprintf(buf, sizeof(buf), "%s/op_videofir.sh %s", + pnd_script_base, pnd_filter_list[i]); + system(buf); +} + +void plat_gvideo_open(int is_pal) +{ + static int old_pal = -1, old_filter = -1; + + if (is_pal != old_pal) { + apply_lcdrate(is_pal); + old_pal = is_pal; + } + if (filter != old_filter) { + apply_filter(filter); + old_filter = filter; + } + + plat_omap_gvideo_open(); +} int plat_cpu_clock_get(void) { @@ -199,3 +246,12 @@ int plat_get_bat_capacity(void) } return ret; } + +void plat_step_volume(int is_up) +{ +} + +void plat_trigger_vibrate(int is_strong) +{ +} +