I did run a test on obtaining external input data by simulating an external input source (hardcoded input values). This code snippet will also show how to work with the above mentioned functions. Please note that the snippet, as is, does not represent a runnable program, you'll need to build one around of it.
Code: Select all
#include <systemctrl.h>
/**
* This structure is used to copy external input data into PSP internal controller buffers.
*/
typedef struct {
/** Unknown. Is set to 0xC by Sony. */
s32 unk1;
/**
* Pointer to a transfer function to copy input data into a PSP internal controller buffer.
* <copyInputData> should return a value >= 0 on success, < 0 otherwise.
*/
s32(*copyInputData)(void *src, SceCtrlDataExt *dest);
} SceCtrlInputDataTransferHandler;
typedef struct {
/**
* The time stamp of the time during which sampling was performed. Time unit is microseconds.
* Can be used to get the time period of a button pressing event.
*/
u32 timeStamp;
/** The currently pressed button. Bitwise OR'ed values of ::SceCtrlPadButtons. */
u32 buttons;
/** Analog Stick X-axis offset (0 - 0xFF). Left = 0, Right = 0xFF. */
unsigned char aX;
/** Analog Stick Y-axis offset (0 - 0xFF). Up = 0, Down = 0xFF. */
unsigned char aY;
/** Reserved. Values are normally set to 0. */
unsigned char rsrv[6];
/** Unknown. */
s32 unk1;
/** Unknown. */
s32 unk2;
/** Unknown. */
s32 unk3;
/** Unknown. */
s32 unk4;
/** Unknown. */
s32 unk5;
/** Unknown. */
s32 unk6;
/** Unknown. */
s32 unk7;
/** Unknown. */
s32 unk8;
} SceCtrlDataExt;
/* Source buffer containing input data to copy. */
SceCtrlDataExt src = {
// Any structure members can be set.
.buttons = 0x12345678,
.aX = 255,
.aY = 0,
.unk1 = 0x10000000,
.unk2 = 0x10000001,
.unk3 = 0x10000002
};
s32 copyFunc(SceCtrlDataExt *src, SceCtrlDataExt *dest);
SceCtrlInputDataTransferHandler transferHandler = {
.unk1 = 0xC,
.copyInputData = copyFunc
};
s32(*sceCtrlExtendInternalCtrlBuffers)(unsigned char inputMode, SceCtrlInputDataTransferHandler *transferHandler, void *inputSource);
s32(*sceCtrlPeekBufferPositiveExtra)(u32 inputMode, SceCtrlDataExt *data, unsigned char nBufs);
s32 copyFunc(SceCtrlDataExt *src, SceCtrlDataExt *dest)
{
dest->buttons = src->buttons;
dest->aX = src->aX;
dest->aY = src->aY;
dest->unk1 = src->unk1;
dest->unk2 = src->unk2;
dest->unk3 = src->unk3;
return 0;
}
void testFunc()
{
// setup function calls (firmware 6.60)
sceCtrlExtendInternalCtrlBuffers = sctrlHENFindFunction("sceController_Service", "sceCtrl_driver", 0xE467BEC8);
sceCtrlExtendInternalCtrlBuffers(1, &transferHandler, &src);
sceCtrlPeekBufferPositiveExtra = sctrlHENFindFunction("sceController_Service", "sceCtrl_driver", 0xD4692E77);
SceCtrlDataExt data;
memset(&data, 0, sizeof data);
// Obtain external input data
sceCtrlPeekBufferPositiveExtra(1, &data, 1);
// data now contains external input data, i.e. data.aX = 255, data.aY = 0, data.unk1 = 0x10000000,....
}
Let me know if this commit fixes the problems with POPS.

