diff --git a/Makefile.ps2 b/Makefile.ps2 index 642a9940dd..13afa113b4 100644 --- a/Makefile.ps2 +++ b/Makefile.ps2 @@ -1,5 +1,5 @@ BUILD_PRX = 0 -DEBUG = 0 +DEBUG = 1 HAVE_KERNEL_PRX = 0 HAVE_LOGGER = 0 HAVE_FILE_LOGGER = 0 @@ -15,7 +15,8 @@ IRX_DIR = $(PS2SDK)/iop/irx TARGET = retroarchps2.elf ifeq ($(DEBUG), 1) - OPTIMIZE_LV := -O0 -g + OPTIMIZE_LV := -O2 -g + RARCH_DEFINES += -DDEBUG else OPTIMIZE_LV := -O2 endif @@ -32,7 +33,7 @@ GPVAL = -G0 CFLAGS = $(OPTIMIZE_LV) -ffast-math -fsingle-precision-constant ASFLAGS = $(CFLAGS) -RARCH_DEFINES = -DPS2 -DUSE_IOP_CTYPE_MACRO -D_MIPS_ARCH_R5900 -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DWANT_ZLIB +RARCH_DEFINES += -DPS2 -DUSE_IOP_CTYPE_MACRO -D_MIPS_ARCH_R5900 -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DWANT_ZLIB RARCH_DEFINES += -DHAVE_GRIFFIN=1 -DRARCH_INTERNAL -DRARCH_CONSOLE -DHAVE_MENU -DHAVE_RGUI -DHAVE_FILTERS_BUILTIN -DHAVE_7ZIP -DHAVE_CC_RESAMPLER LIBDIR = @@ -40,7 +41,7 @@ LDFLAGS = -L$(PS2SDK)/ports/lib -L$(PS2DEV)/gsKit/lib -L$(PS2SDK)/ee/lib -L. #LIBS = $(WHOLE_START) -lretro_ps2 $(WHOLE_END) -lstdc++ -lm -lz -lgskit -ldmakit -lpng -laudsrv -lpad -lcdvd -lmad -lfileXio -lpatches LIBS = -Xlinker --start-group LIBS += $(WHOLE_START) -lretro_ps2 $(WHOLE_END) -LIBS += -lfileXio -lm -lg -lz -ldebug -lfileXio -laudsrv -lpatches -lpoweroff -ldma -lgskit -ldmakit +LIBS += -lfileXio -lm -lg -lz -ldebug -lfileXio -laudsrv -lpatches -lpoweroff -ldma -lgskit -ldmakit -lpad #IRX modules # IRX modules - modules have to be in IRX_DIR diff --git a/frontend/drivers/platform_ps2.c b/frontend/drivers/platform_ps2.c index 2c6b9a3b06..760a9e7f06 100644 --- a/frontend/drivers/platform_ps2.c +++ b/frontend/drivers/platform_ps2.c @@ -306,6 +306,10 @@ static void frontend_ps2_get_environment_settings(int *argc, char *argv[], static void frontend_ps2_init(void *data) { SifInitRpc(0); +#if !defined(DEBUG) + while(!SifIopReset(NULL, 0)){}; // Comment this line if you don't wanna debug the output +#endif + while(!SifIopSync()){}; SifInitRpc(0); sbv_patch_enable_lmb(); diff --git a/griffin/griffin.c b/griffin/griffin.c index 89ab44800c..d2b8b5dedc 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -571,7 +571,7 @@ INPUT #include "../input/drivers_joypad/psp_joypad.c" #elif defined(PS2) #include "../input/drivers/ps2_input.c" -// #include "../input/drivers_joypad/ps2_joypad.c" +#include "../input/drivers_joypad/ps2_joypad.c" #elif defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH) || defined(HAVE_COCOA_METAL) #include "../input/drivers/cocoa_input.c" #elif defined(_3DS) diff --git a/input/drivers_joypad/ps2_joypad.c b/input/drivers_joypad/ps2_joypad.c index 61a541be29..969c075ebe 100644 --- a/input/drivers_joypad/ps2_joypad.c +++ b/input/drivers_joypad/ps2_joypad.c @@ -1,6 +1,7 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2010-2014 - Hans-Kristian Arntzen * Copyright (C) 2011-2017 - Daniel De Matteis + * Copyright (C) 2013-2014 - CatalystG * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- @@ -15,26 +16,24 @@ */ #include -#include +#include +#include #include "../input_driver.h" -#include "../../tasks/tasks_internal.h" - -#include "../../configuration.h" - -#include "../../defines/ps2_defines.h" - -#ifdef HAVE_MENU -#include "../../menu/menu_driver.h" -#endif +#include "libpad.h" #define PS2_MAX_PADS 1 -static uint64_t pad_state[PS2_MAX_PADS]; -static int16_t analog_state[PS2_MAX_PADS][2][2]; +/* + * Global var's + */ +// pad_dma_buf is provided by the user, one buf for each pad +// contains the pad's current state +static char padBuf[256] __attribute__((aligned(64))); + +static uint64_t pad_state[PS2_MAX_PADS]; -extern uint64_t lifecycle_state; static const char *ps2_joypad_name(unsigned pad) { @@ -48,134 +47,94 @@ static bool ps2_joypad_init(void *data) for (i = 0; i < players_count; i++) { - if (!input_autoconfigure_connect( - ps2_joypad_name(i), - NULL, - ps2_joypad.ident, - i, - 0, - 0 - )) + bool auto_configure = input_autoconfigure_connect( ps2_joypad_name(i), + NULL, + ps2_joypad.ident, + i, + 0, + 0); + if (!auto_configure) { input_config_set_device_name(i, ps2_joypad_name(i)); + } + + padInit(i); + + int ret; + int port, slot; + + port = 0; // 0 -> Connector 1, 1 -> Connector 2 + slot = 0; // Always zero if not using multitap + + printf("PortMax: %d\n", padGetPortMax()); + printf("SlotMax: %d\n", padGetSlotMax(port)); + + + if((ret = padPortOpen(port, slot, padBuf)) == 0) { + printf("padOpenPort failed: %d\n", ret); + } + + } return true; } -static bool ps2_joypad_button(unsigned port_num, uint16_t key) +static bool ps2_joypad_button(unsigned port_num, uint16_t joykey) { if (port_num >= PS2_MAX_PADS) return false; - return (pad_state[port_num] & (UINT64_C(1) << key)); + return (pad_state[port_num] & (UINT64_C(1) << joykey)); } static void ps2_joypad_get_buttons(unsigned port_num, input_bits_t *state) { - if (port_num < PS2_MAX_PADS) - { - BITS_COPY16_PTR( state, pad_state[port_num] ); - } - else - BIT256_CLEAR_ALL_PTR(state); + BIT256_CLEAR_ALL_PTR(state); } static int16_t ps2_joypad_axis(unsigned port_num, uint32_t joyaxis) { - int val = 0; - int axis = -1; - bool is_neg = false; - bool is_pos = false; - - if (joyaxis == AXIS_NONE || port_num >= PS2_MAX_PADS) - return 0; - - if (AXIS_NEG_GET(joyaxis) < 4) - { - axis = AXIS_NEG_GET(joyaxis); - is_neg = true; - } - else if (AXIS_POS_GET(joyaxis) < 4) - { - axis = AXIS_POS_GET(joyaxis); - is_pos = true; - } - - switch (axis) - { - case 0: - val = analog_state[port_num][0][0]; - break; - case 1: - val = analog_state[port_num][0][1]; - break; - case 2: - val = analog_state[port_num][1][0]; - break; - case 3: - val = analog_state[port_num][1][1]; - break; - } - - if (is_neg && val > 0) - val = 0; - else if (is_pos && val < 0) - val = 0; - - return val; + return 0; } static void ps2_joypad_poll(void) { unsigned player; unsigned players_count = PS2_MAX_PADS; - - BIT64_CLEAR(lifecycle_state, RARCH_MENU_TOGGLE); + struct padButtonStatus buttons; for (player = 0; player < players_count; player++) { unsigned j, k; unsigned i = player; unsigned p = player; - int32_t state_tmp = padGetState(player, player); - + + int ret = padRead(player, player, &buttons); // port, slot, buttons + if (ret != 0) + { + int32_t state_tmp = 0xffff ^ buttons.btns; - pad_state[i] = 0; - analog_state[i][0][0] = analog_state[i][0][1] = - analog_state[i][1][0] = analog_state[i][1][1] = 0; + pad_state[i] = 0; -#ifdef HAVE_KERNEL_PRX - state_tmp.Buttons = (state_tmp.Buttons & 0x0000FFFF) - | (read_system_buttons() & 0xFFFF0000); -#endif - - pad_state[i] |= (state_tmp & PAD_LEFT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0; - pad_state[i] |= (state_tmp & PAD_DOWN) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0; - pad_state[i] |= (state_tmp & PAD_RIGHT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_RIGHT) : 0; - pad_state[i] |= (state_tmp & PAD_UP) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_UP) : 0; - pad_state[i] |= (state_tmp & PAD_START) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_START) : 0; - pad_state[i] |= (state_tmp & PAD_SELECT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_SELECT) : 0; - pad_state[i] |= (state_tmp & PAD_TRIANGLE) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_X) : 0; - pad_state[i] |= (state_tmp & PAD_SQUARE) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_Y) : 0; - pad_state[i] |= (state_tmp & PAD_CROSS) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_B) : 0; - pad_state[i] |= (state_tmp & PAD_CIRCLE) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_A) : 0; - pad_state[i] |= (state_tmp & PAD_R1) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R) : 0; - pad_state[i] |= (state_tmp & PAD_L1) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L) : 0; - pad_state[i] |= (state_tmp & PAD_R2) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R2) : 0; - pad_state[i] |= (state_tmp & PAD_L2) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L2) : 0; - pad_state[i] |= (state_tmp & PAD_R3) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R3) : 0; - pad_state[i] |= (state_tmp & PAD_L3) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L3) : 0; - -#ifdef HAVE_KERNEL_PRX - if (state_tmp & PS2_CTRL_NOTE) - BIT64_SET(lifecycle_state, RARCH_MENU_TOGGLE); -#endif - - for (j = 0; j < 2; j++) - for (k = 0; k < 2; k++) - if (analog_state[i][j][k] == -0x8000) - analog_state[i][j][k] = -0x7fff; + pad_state[i] |= (state_tmp & PAD_LEFT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0; + pad_state[i] |= (state_tmp & PAD_DOWN) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0; + pad_state[i] |= (state_tmp & PAD_RIGHT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_RIGHT) : 0; + pad_state[i] |= (state_tmp & PAD_UP) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_UP) : 0; + pad_state[i] |= (state_tmp & PAD_START) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_START) : 0; + pad_state[i] |= (state_tmp & PAD_SELECT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_SELECT) : 0; + pad_state[i] |= (state_tmp & PAD_TRIANGLE) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_X) : 0; + pad_state[i] |= (state_tmp & PAD_SQUARE) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_Y) : 0; + pad_state[i] |= (state_tmp & PAD_CROSS) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_B) : 0; + pad_state[i] |= (state_tmp & PAD_CIRCLE) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_A) : 0; + pad_state[i] |= (state_tmp & PAD_R1) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R) : 0; + pad_state[i] |= (state_tmp & PAD_L1) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L) : 0; + pad_state[i] |= (state_tmp & PAD_R2) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R2) : 0; + pad_state[i] |= (state_tmp & PAD_L2) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L2) : 0; + pad_state[i] |= (state_tmp & PAD_R3) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R3) : 0; + pad_state[i] |= (state_tmp & PAD_L3) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L3) : 0; + } } + } static bool ps2_joypad_query_pad(unsigned pad) diff --git a/input/drivers_joypad/ps2_joypad_copy.c b/input/drivers_joypad/ps2_joypad_copy.c new file mode 100644 index 0000000000..e69de29bb2 diff --git a/input/input_driver.c b/input/input_driver.c index 0d3f6c3ea0..2e264c7159 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -165,7 +165,7 @@ static input_device_driver_t *joypad_drivers[] = { &psp_joypad, #endif #if defined(PS2) -// &ps2_joypad, // TODO: FJTRUJY + &ps2_joypad, #endif #ifdef _3DS &ctr_joypad,