diff --git a/config.def.h b/config.def.h
index 25887d474d..b692b11be4 100644
--- a/config.def.h
+++ b/config.def.h
@@ -65,6 +65,7 @@ enum
INPUT_X,
INPUT_DINPUT,
INPUT_PS3,
+ INPUT_PSP2,
INPUT_XENON360,
INPUT_WII,
INPUT_XINPUT,
@@ -144,6 +145,8 @@ enum
#define INPUT_DEFAULT_DRIVER INPUT_SDL
#elif defined(__CELLOS_LV2__)
#define INPUT_DEFAULT_DRIVER INPUT_PS3
+#elif defined(SN_TARGET_PSP2)
+#define INPUT_DEFAULT_DRIVER INPUT_PSP2
#elif defined(GEKKO)
#define INPUT_DEFAULT_DRIVER INPUT_WII
#elif defined(HAVE_XVIDEO)
diff --git a/console/griffin/griffin.c b/console/griffin/griffin.c
index 104d6b12b4..1e13913148 100644
--- a/console/griffin/griffin.c
+++ b/console/griffin/griffin.c
@@ -203,6 +203,8 @@ INPUT
============================================================ */
#if defined(__CELLOS_LV2__)
#include "../../ps3/ps3_input.c"
+#elif defined(SN_TARGET_PSP2)
+#include "../../psp2/psp2_input.c"
#elif defined(GEKKO)
#include "../../gx/gx_input.c"
#elif defined(_XBOX)
diff --git a/driver.c b/driver.c
index c346d9ef2b..93ed76c169 100644
--- a/driver.c
+++ b/driver.c
@@ -120,6 +120,9 @@ static const input_driver_t *input_drivers[] = {
#ifdef __CELLOS_LV2__
&input_ps3,
#endif
+#ifdef SN_TARGET_PSP2
+ &input_psp2,
+#endif
#ifdef HAVE_SDL
&input_sdl,
#endif
diff --git a/driver.h b/driver.h
index 69ffcbeb8e..e92e8c2a08 100644
--- a/driver.h
+++ b/driver.h
@@ -304,6 +304,7 @@ extern const input_driver_t input_sdl;
extern const input_driver_t input_dinput;
extern const input_driver_t input_x;
extern const input_driver_t input_ps3;
+extern const input_driver_t input_psp2;
extern const input_driver_t input_xenon360;
extern const input_driver_t input_gx;
extern const input_driver_t input_xinput;
diff --git a/psp2/psp2_input.c b/psp2/psp2_input.c
new file mode 100644
index 0000000000..ca11275e57
--- /dev/null
+++ b/psp2/psp2_input.c
@@ -0,0 +1,140 @@
+/* RetroArch - A frontend for libretro.
+ * Copyright (C) 2010-2012 - Hans-Kristian Arntzen
+ * Copyright (C) 2011-2012 - Daniel De Matteis
+ *
+ * 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-
+ * ation, either version 3 of the License, or (at your option) any later version.
+ *
+ * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with RetroArch.
+ * If not, see .
+ */
+
+#include
+#include
+
+#include
+#include
+#include
+
+#include "../driver.h"
+#include "../libretro.h"
+#include "../general.h"
+
+#define ANALOGSTICK_DEADZONE_LOW (0x40)
+#define ANALOGSTICK_DEADZONE_HIGH (0xc0
+
+static uint64_t state;
+
+static void psp2_input_poll(void *data)
+{
+ CellPadInfo2 pad_info;
+ (void)data;
+
+ for (unsigned i = 0; i < MAX_PADS; i++)
+ {
+ SceCtrlData state_tmp;
+ int ret = sceCtrlReadBufferPositive(0, &state_tmp, 1);
+
+ if (ret == SCE_OK)
+ {
+ state = 0;
+ state |= (state_tmp.buttons & SCE_CTRL_LEFT) ? PSP2_GAMEPAD_DPAD_LEFT : 0;
+ state |= (state_tmp.buttons & SCE_CTRL_DOWN) ? PSP2_GAMEPAD_DPAD_DOWN : 0;
+ state |= (state_tmp.buttons & SCE_CTRL_RIGHT) ? PSP2_GAMEPAD_DPAD_RIGHT : 0;
+ state |= (state_tmp.buttons & SCE_CTRL_UP) ? PSP2_GAMEPAD_DPAD_UP : 0;
+ state |= (state_tmp.buttons & SCE_CTRL_START) ? PSP2_GAMEPAD_START : 0;
+ state |= (state_tmp.buttons & SCE_CTRL_SELECT) ? PSP2_GAMEPAD_SELECT : 0;
+ state |= (state_tmp.buttons & SCE_CTRL_TRIANGLE) ? PSP2_GAMEPAD_TRIANGLE : 0;
+ state |= (state_tmp.buttons & SCE_CTRL_SQUARE) ? PSP2_GAMEPAD_SQUARE : 0;
+ state |= (state_tmp.buttons & SCE_CTRL_CROSS) ? PSP2_GAMEPAD_CROSS : 0;
+ state |= (state_tmp.buttons & SCE_CTRL_CIRCLE) ? PSP2_GAMEPAD_CIRCLE : 0;
+ state |= (state_tmp.buttons & SCE_CTRL_R) ? PSP2_GAMEPAD_R : 0;
+ state |= (state_tmp.buttons & SCE_CTRL_L) ? PSP2_GAMEPAD_L : 0;
+ state |= (state_tmp.lx < ANALOGSTICK_DEADZONE_LOW) ? PSP2_GAMEPAD_LSTICK_LEFT_MASK : 0;
+ state |= (state_tmp.lx > ANALOGSTICK_DEADZONE_HIGH) ? PSP2_GAMEPAD_LSTICK_RIGHT_MASK : 0;
+ state |= (state_tmp.ly < ANALOGSTICK_DEADZONE_LOW) ? PSP2_GAMEPAD_LSTICK_UP_MASK : 0;
+ state |= (state_tmp.ly > ANALOGSTICK_DEADZONE_HIGH) ? PSP2_GAMEPAD_LSTICK_DOWN_MASK : 0;
+ state |= (state_tmp.rx < ANALOGSTICK_DEADZONE_LOW) ? PSP2_GAMEPAD_RSTICK_LEFT_MASK : 0;
+ state |= (state_tmp.rx > ANALOGSTICK_DEADZONE_HIGH) ? PSP2_GAMEPAD_RSTICK_RIGHT_MASK : 0;
+ state |= (state_tmp.ry < ANALOGSTICK_DEADZONE_LOW) ? PSP2_GAMEPAD_RSTICK_UP_MASK : 0;
+ state |= (state_tmp.ry > ANALOGSTICK_DEADZONE_HIGH) ? PSP2_GAMEPAD_RSTICK_DOWN_MASK : 0;
+ }
+ }
+
+ cellPadGetInfo2(&pad_info);
+}
+
+static int16_t psp2_input_state(void *data, const struct retro_keybind **binds,
+ unsigned port, unsigned device,
+ unsigned index, unsigned id)
+{
+ (void)data;
+
+ uint64_t button = binds[0][id].joykey;
+ int16_t retval = 0;
+
+ switch (device)
+ {
+ case RETRO_DEVICE_JOYPAD:
+ retval = (state & button) ? 1 : 0;
+ break;
+ }
+
+ return retval;
+}
+
+static void psp2_input_set_analog_dpad_mapping(unsigned device, unsigned map_dpad_enum, unsigned controller_id)
+{
+ (void)device;
+}
+
+static void psp2_free_input(void *data)
+{
+ (void)data;
+}
+
+static void* psp2_input_initialize(void)
+{
+ sceCtrlSetSamplingMode(SCE_CTRL_MODE_DIGITALANALOG);
+ return (void*)-1;
+}
+
+static void psp2_input_post_init(void)
+{
+}
+
+static bool psp2_key_pressed(void *data, int key)
+{
+ (void)data;
+
+ switch (key)
+ {
+ default:
+ return false;
+ }
+}
+
+static void psp2_set_default_keybind_lut(unsigned device, unsigned port)
+{
+ (void)device;
+ (void)port;
+}
+
+const input_driver_t input_psp2 = {
+ .init = psp2_input_initialize,
+ .poll = psp2_input_poll,
+ .input_state = psp2_input_state,
+ .key_pressed = psp2_key_pressed,
+ .free = psp2_free_input,
+ .set_default_keybind_lut = psp2_set_default_keybind_lut,
+ .set_analog_dpad_mapping = psp2_input_set_analog_dpad_mapping,
+ .post_init = psp2_input_post_init,
+ .max_pads = MAX_PADS,
+ .ident = "psp2",
+};
+
diff --git a/psp2/psp2_input.h b/psp2/psp2_input.h
new file mode 100644
index 0000000000..86e116f051
--- /dev/null
+++ b/psp2/psp2_input.h
@@ -0,0 +1,43 @@
+/* RetroArch - A frontend for libretro.
+ * Copyright (C) 2010-2012 - Hans-Kristian Arntzen
+ * Copyright (C) 2011-2012 - Daniel De Matteis
+ *
+ * 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-
+ * ation, either version 3 of the License, or (at your option) any later version.
+ *
+ * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with RetroArch.
+ * If not, see .
+ */
+
+#ifndef _PSP2_INPUT_H_
+#define _PSP2_INPUT_H_
+
+enum {
+ PSP2_GAMEPAD_CROSS = 1 << 0,
+ PSP2_GAMEPAD_SQUARE = 1 << 1,
+ PSP2_GAMEPAD_SELECT = 1 << 2,
+ PSP2_GAMEPAD_START = 1 << 3,
+ PSP2_GAMEPAD_DPAD_UP = 1 << 4,
+ PSP2_GAMEPAD_DPAD_DOWN = 1 << 5,
+ PSP2_GAMEPAD_DPAD_LEFT = 1 << 6,
+ PSP2_GAMEPAD_DPAD_RIGHT = 1 << 7,
+ PSP2_GAMEPAD_CIRCLE = 1 << 8,
+ PSP2_GAMEPAD_TRIANGLE = 1 << 9,
+ PSP2_GAMEPAD_L = 1 << 10,
+ PSP2_GAMEPAD_R = 1 << 11,
+ PSP2_GAMEPAD_LSTICK_LEFT_MASK = 1 << 16,
+ PSP2_GAMEPAD_LSTICK_RIGHT_MASK = 1 << 17,
+ PSP2_GAMEPAD_LSTICK_UP_MASK = 1 << 18,
+ PSP2_GAMEPAD_LSTICK_DOWN_MASK = 1 << 19,
+ PSP2_GAMEPAD_RSTICK_LEFT_MASK = 1 << 20,
+ PSP2_GAMEPAD_RSTICK_RIGHT_MASK = 1 << 21,
+ PSP2_GAMEPAD_RSTICK_UP_MASK = 1 << 22,
+ PSP2_GAMEPAD_RSTICK_DOWN_MASK = 1 << 23,
+};
+
+#endif
diff --git a/settings.c b/settings.c
index f480fbb31f..4a4c65d48d 100644
--- a/settings.c
+++ b/settings.c
@@ -113,6 +113,8 @@ const char *config_get_default_input(void)
return "android_input";
case INPUT_PS3:
return "ps3";
+ case INPUT_PSP2:
+ return "psp2";
case INPUT_SDL:
return "sdl";
case INPUT_DINPUT: