30#define PAD_BIND_RPC_ID1_NEW 0x80000100
31#define PAD_BIND_RPC_ID2_NEW 0x80000101
33#define PAD_BIND_RPC_ID1_OLD 0x8000010f
34#define PAD_BIND_RPC_ID2_OLD 0x8000011f
36#define PAD_RPCCMD_OPEN_NEW 0x01
37#define PAD_RPCCMD_SET_MMODE_NEW 0x06
38#define PAD_RPCCMD_SET_ACTDIR_NEW 0x07
39#define PAD_RPCCMD_SET_ACTALIGN_NEW 0x08
40#define PAD_RPCCMD_GET_BTNMASK_NEW 0x09
41#define PAD_RPCCMD_SET_BTNINFO_NEW 0x0A
42#define PAD_RPCCMD_SET_VREF_NEW 0x0B
43#define PAD_RPCCMD_GET_PORTMAX_NEW 0x0C
44#define PAD_RPCCMD_GET_SLOTMAX_NEW 0x0D
45#define PAD_RPCCMD_CLOSE_NEW 0x0E
46#define PAD_RPCCMD_END_NEW 0x0F
47#define PAD_RPCCMD_INIT 0x10
48#define PAD_RPCCMD_GET_MODVER 0x12
50#define PAD_RPCCMD_OPEN_OLD 0x80000100
51#define PAD_RPCCMD_INFO_ACT 0x80000102
52#define PAD_RPCCMD_INFO_COMB_OLD 0x80000103
53#define PAD_RPCCMD_INFO_MODE 0x80000104
54#define PAD_RPCCMD_SET_MMODE_OLD 0x80000105
55#define PAD_RPCCMD_SET_ACTDIR_OLD 0x80000106
56#define PAD_RPCCMD_SET_ACTALIGN_OLD 0x80000107
57#define PAD_RPCCMD_GET_BTNMASK_OLD 0x80000108
58#define PAD_RPCCMD_SET_BTNINFO_OLD 0x80000109
59#define PAD_RPCCMD_SET_VREF_OLD 0x8000010a
60#define PAD_RPCCMD_GET_PORTMAX_OLD 0x8000010b
61#define PAD_RPCCMD_GET_SLOTMAX_OLD 0x8000010c
62#define PAD_RPCCMD_CLOSE_OLD 0x8000010d
63#define PAD_RPCCMD_END_OLD 0x8000010e
132 unsigned char *padBuf;
142extern int _iop_reboot_count;
147static const char *padStateString[] = {
157static const char *padReqStateString[] = {
163static int padInitialised = 0;
211 } padSetMainModeArgs;
219 } padGetButtonMaskArgs;
224 } padSetButtonInfoArgs;
228 } padSetButtonInfoResult;
239 } padActDirAlignArgs;
259 pdata = PadState[port][slot].padData->newPadData;
260 SyncDCache(pdata, (u8 *)pdata + 256);
262 return (pdata[0].frame < pdata[1].frame) ? &pdata[1] : &pdata[0];
266padGetDmaStrOld(
int port,
int slot)
270 pdata = PadState[port][slot].padData->oldPadData;
271 SyncDCache(pdata, (u8 *)pdata + 256);
273 return (pdata[0].frame < pdata[1].frame) ? &pdata[1] : &pdata[0];
283 SyncDCache(openSlot, (u8*)openSlot +
sizeof(openSlot));
285 return (openSlot[0].frame < openSlot[1].frame) ? &openSlot[1] : &openSlot[0];
304 static int _rb_count = 0;
307 if (_rb_count != _iop_reboot_count)
309 _rb_count = _iop_reboot_count;
316 padInitialised = 0xFFFFFFFF;
319 padsif[0].server = NULL;
320 padsif[1].server = NULL;
325 static const int rpc_ids[] = {
326 PAD_BIND_RPC_ID1_NEW,
327 PAD_BIND_RPC_ID1_OLD,
330 padsif[0].server = NULL;
331 for (i = 0; i < (
sizeof(rpc_ids)/
sizeof(rpc_ids[0])); i += 1)
332 rpciftmp[i].server = NULL;
336 for (i = 0; i < (
sizeof(rpc_ids)/
sizeof(rpc_ids[0])); i += 1)
338 if ((sceSifBindRpc(&rpciftmp[i], rpc_ids[i], 0) < 0))
340 if (rpciftmp[i].server != NULL)
344 case PAD_BIND_RPC_ID1_NEW:
347 rpc_init_next = PAD_BIND_RPC_ID2_NEW;
350 case PAD_BIND_RPC_ID1_OLD:
353 rpc_init_next = PAD_BIND_RPC_ID2_OLD;
359 memcpy(&padsif[0], &rpciftmp[i],
sizeof(padsif[0]));
363 if (padsif[0].server != NULL)
372 while (!padsif[1].server)
374 if (sceSifBindRpc(&padsif[1], rpc_init_next, 0) < 0)
393 for (i = 0; i < (
sizeof(PadState)/
sizeof(PadState[0])); i += 1)
395 for (j = 0; j < (
sizeof(PadState[0])/
sizeof(PadState[0][0])); j += 1)
397 PadState[i][j].open = 0;
398 PadState[i][j].port = 0;
399 PadState[i][j].slot = 0;
403 switch (padInitialised)
410 buffer.command = PAD_RPCCMD_OPEN_OLD;
411 ret = sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL);
419 buffer.command = PAD_RPCCMD_INIT;
420 buffer.padInitArgs.statBuf = openSlot;
421 ret = sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL);
423 return ret >= 0 ? buffer.padResult.result : 0;
435 switch (padInitialised)
439 buffer.command = PAD_RPCCMD_END_OLD;
444 buffer.command = PAD_RPCCMD_END_NEW;
451 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
454 ret = buffer.padResult.result;
466 if ((
unsigned int)port >= (
sizeof(PadState)/
sizeof(PadState[0])))
468 if ((
unsigned int)slot >= (
sizeof(PadState[0])/
sizeof(PadState[0][0])))
471 switch (padInitialised)
476 if ((u32)padArea & 0xf)
478 printf(
"Address is not 16-byte aligned.\n");
486 if ((u32)padArea & 0x3f)
488 printf(
"Address is not 64-byte aligned.\n");
499 switch (padInitialised)
505 for (i = 0; i < (
sizeof(dma_buf->oldPadData)/
sizeof(dma_buf->oldPadData[0])); i += 1)
509 pdata = &dma_buf->oldPadData[i];
510 memset(pdata->data, 0xff,
sizeof(pdata->data));
513 pdata->state = PAD_STATE_EXECCMD;
514 pdata->reqState = PAD_RSTAT_BUSY;
524 for (i = 0; i < (
sizeof(dma_buf->newPadData)/
sizeof(dma_buf->newPadData[0])); i += 1)
528 pdata = &dma_buf->newPadData[i];
529 memset(pdata->data, 0xff,
sizeof(pdata->data));
532 pdata->state = PAD_STATE_EXECCMD;
533 pdata->reqState = PAD_RSTAT_BUSY;
535 pdata->currentTask = 0;
536 pdata->buttonDataReady = 0;
544 switch (padInitialised)
548 buffer.command = PAD_RPCCMD_OPEN_OLD;
553 buffer.command = PAD_RPCCMD_OPEN_NEW;
559 buffer.padOpenArgs.port = port;
560 buffer.padOpenArgs.slot = slot;
561 buffer.padOpenArgs.padArea = padArea;
563 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
566 PadState[port][slot].open = padInitialised;
567 PadState[port][slot].padData = padArea;
568 PadState[port][slot].padBuf = buffer.padOpenResult.padBuf;
570 return buffer.padOpenResult.result;
578 if ((
unsigned int)port >= (
sizeof(PadState)/
sizeof(PadState[0])))
580 if ((
unsigned int)slot >= (
sizeof(PadState[0])/
sizeof(PadState[0][0])))
583 switch (padInitialised)
587 buffer.command = PAD_RPCCMD_CLOSE_OLD;
592 buffer.command = PAD_RPCCMD_CLOSE_NEW;
599 buffer.padCloseArgs.port = port;
600 buffer.padCloseArgs.slot = slot;
601 buffer.padCloseArgs.mode = 1;
603 ret = sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL);
607 PadState[port][slot].open = 0;
608 return buffer.padResult.result;
614 if ((
unsigned int)port >= (
sizeof(PadState)/
sizeof(PadState[0])))
616 if ((
unsigned int)slot >= (
sizeof(PadState[0])/
sizeof(PadState[0][0])))
619 switch (PadState[port][slot].open)
625 pdata = padGetDmaStrOld(port, slot);
627 memcpy(data, pdata->data, pdata->length);
628 return pdata->length;
636 memcpy(data, pdata->data, pdata->length);
637 return pdata->length;
647 if ((
unsigned int)port >= (
sizeof(PadState)/
sizeof(PadState[0])))
649 if ((
unsigned int)slot >= (
sizeof(PadState[0])/
sizeof(PadState[0][0])))
652 switch (PadState[port][slot].open)
659 pdata = padGetDmaStrOld(port, slot);
660 state = pdata->state;
662 if (state == PAD_STATE_STABLE &&
padGetReqState(port, slot) == PAD_RSTAT_BUSY)
663 return PAD_STATE_EXECCMD;
672 state = pdata->state;
674 if (state == PAD_STATE_ERROR && pdata->findPadRetries)
675 return PAD_STATE_FINDPAD;
677 if (state == PAD_STATE_STABLE &&
padGetReqState(port, slot) == PAD_RSTAT_BUSY)
678 return PAD_STATE_EXECCMD;
689 if ((
unsigned int)port >= (
sizeof(PadState)/
sizeof(PadState[0])))
691 if ((
unsigned int)slot >= (
sizeof(PadState[0])/
sizeof(PadState[0][0])))
694 switch (PadState[port][slot].open)
697 return padGetDmaStrOld(port, slot)->reqState;
708 if ((
unsigned int)port >= (
sizeof(PadState)/
sizeof(PadState[0])))
710 if ((
unsigned int)slot >= (
sizeof(PadState[0])/
sizeof(PadState[0][0])))
713 switch (PadState[port][slot].open)
716 padGetDmaStrOld(port, slot)->reqState = state;
727padStateInt2String(
int state,
char buf[16])
729 if ((
unsigned int)state < (
sizeof(padStateString)/
sizeof(padStateString[0])))
730 strcpy(buf, padStateString[state]);
734padReqStateInt2String(
int state,
char buf[16])
736 if ((
unsigned int)state < (
sizeof(padReqStateString)/
sizeof(padReqStateString[0])))
737 strcpy(buf, padReqStateString[state]);
743 switch (padInitialised)
747 buffer.command = PAD_RPCCMD_GET_PORTMAX_OLD;
752 buffer.command = PAD_RPCCMD_GET_PORTMAX_NEW;
759 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
762 return buffer.padResult.result;
768 switch (padInitialised)
772 buffer.command = PAD_RPCCMD_GET_SLOTMAX_OLD;
777 buffer.command = PAD_RPCCMD_GET_SLOTMAX_NEW;
783 buffer.padSlotMaxArgs.port = port;
785 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
788 return buffer.padResult.result;
794 if (padInitialised != 2)
796 buffer.command = PAD_RPCCMD_GET_MODVER;
798 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
801 return buffer.padResult.result;
807 if ((
unsigned int)port >= (
sizeof(PadState)/
sizeof(PadState[0])))
809 if ((
unsigned int)slot >= (
sizeof(PadState[0])/
sizeof(PadState[0][0])))
812 switch (PadState[port][slot].open)
816 buffer.command = PAD_RPCCMD_INFO_MODE;
817 buffer.padInfoModeArgs.port = port;
818 buffer.padInfoModeArgs.slot = slot;
819 buffer.padInfoModeArgs.infoMode = infoMode;
820 buffer.padInfoModeArgs.index = index;
822 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
825 if (buffer.padModeResult.result == 1)
827 return buffer.padModeResult.result;
835 if (pdata->currentTask != 1)
837 if (pdata->reqState == PAD_RSTAT_BUSY)
843 return (pdata->modeCurId == 0xF3) ? 0 : (pdata->modeCurId >> 4);
844 case PAD_MODECUREXID:
845 return (pdata->modeConfig == pdata->currentTask || ((
unsigned int)(pdata->modeCurOffs) >= (
sizeof(pdata->modeTable)/
sizeof(pdata->modeTable[0])))) ? 0 : pdata->modeTable[pdata->modeCurOffs];
846 case PAD_MODECUROFFS:
847 return (pdata->modeConfig == 0) ? 0 : pdata->modeCurOffs;
849 if (pdata->modeConfig != 0) {
851 return pdata->nrOfModes;
852 else if (index < pdata->nrOfModes && ((
unsigned int)index <= (
sizeof(pdata->modeTable)/
sizeof(pdata->modeTable[0]))))
853 return pdata->modeTable[index];
868 switch (padInitialised)
872 buffer.command = PAD_RPCCMD_SET_MMODE_OLD;
877 buffer.command = PAD_RPCCMD_SET_MMODE_NEW;
883 buffer.padSetMainModeArgs.port = port;
884 buffer.padSetMainModeArgs.slot = slot;
885 buffer.padSetMainModeArgs.mode = mode;
886 buffer.padSetMainModeArgs.lock = lock;
888 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
891 if (buffer.padModeResult.result == 1)
893 return buffer.padModeResult.result;
899 return (padGetButtonMask(port, slot) ^ 0x3ffff) ? 0 : 1;
905 return padSetButtonInfo(port, slot, 0xFFF);
911 return padSetButtonInfo(port, slot, 0);
915padGetButtonMask(
int port,
int slot)
917 switch (padInitialised)
921 buffer.command = PAD_RPCCMD_GET_BTNMASK_OLD;
926 buffer.command = PAD_RPCCMD_GET_BTNMASK_NEW;
932 buffer.padGetButtonMaskArgs.port = port;
933 buffer.padGetButtonMaskArgs.slot = slot;
935 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
938 return buffer.padResult.result;
942padSetButtonInfo(
int port,
int slot,
int buttonInfo)
944 switch (padInitialised)
948 buffer.command = PAD_RPCCMD_SET_BTNINFO_OLD;
953 buffer.command = PAD_RPCCMD_SET_BTNINFO_NEW;
959 buffer.padSetButtonInfoArgs.port = port;
960 buffer.padSetButtonInfoArgs.slot = slot;
961 buffer.padSetButtonInfoArgs.buttonInfo = buttonInfo;
963 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
966 if (buffer.padSetButtonInfoResult.result == 1)
968 return buffer.padSetButtonInfoResult.result;
974 if ((
unsigned int)port >= (
sizeof(PadState)/
sizeof(PadState[0])))
976 if ((
unsigned int)slot >= (
sizeof(PadState[0])/
sizeof(PadState[0][0])))
979 switch (PadState[port][slot].open)
983 buffer.command = PAD_RPCCMD_INFO_ACT;
984 buffer.padInfoActArgs.port = port;
985 buffer.padInfoActArgs.slot = slot;
986 buffer.padInfoActArgs.actuator = actuator;
987 buffer.padInfoActArgs.act_cmd = cmd;
989 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
992 if (buffer.padModeResult.result == 1)
994 return buffer.padModeResult.result;
1002 if (pdata->currentTask != 1)
1004 if (pdata->modeConfig < 2)
1006 if (actuator >= pdata->nrOfActuators)
1010 return pdata->nrOfActuators;
1012 if ((
unsigned int)actuator >= (
sizeof(pdata->actData)/
sizeof(pdata->actData[0])))
1014 if ((
unsigned int)cmd >= (
sizeof(pdata->actData[0])/
sizeof(pdata->actData[0][0])))
1017 return pdata->actData[actuator][cmd];
1027 switch (padInitialised)
1031 buffer.command = PAD_RPCCMD_SET_ACTALIGN_OLD;
1036 buffer.command = PAD_RPCCMD_SET_ACTALIGN_NEW;
1042 buffer.padActDirAlignArgs.port = port;
1043 buffer.padActDirAlignArgs.slot = slot;
1045 memcpy(buffer.padActDirAlignArgs.align, actAlign,
sizeof(buffer.padActDirAlignArgs.align));
1047 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
1050 if (buffer.padModeResult.result == 1)
1052 return buffer.padModeResult.result;
1058 switch (padInitialised)
1062 buffer.command = PAD_RPCCMD_SET_ACTDIR_OLD;
1067 buffer.command = PAD_RPCCMD_SET_ACTDIR_NEW;
1073 buffer.padActDirAlignArgs.port = port;
1074 buffer.padActDirAlignArgs.slot = slot;
1076 memcpy(buffer.padActDirAlignArgs.align, actAlign,
sizeof(buffer.padActDirAlignArgs.align));
1078 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
1081 return buffer.padModeResult.result;
1092 if (padInitialised != 2)
1095 if ((
unsigned int)slot >= (
sizeof(oslt->openSlots)/
sizeof(oslt->openSlots[0])))
1097 return ((oslt->openSlots[port] >> slot) & 0x1);
int padPortOpen(int port, int slot, void *padArea)
int padPortInit(int mode)
unsigned char padRead(int port, int slot, struct padButtonStatus *data)
int padInfoMode(int port, int slot, int infoMode, int index)
unsigned char padInfoAct(int port, int slot, int actuator, int cmd)
int padExitPressMode(int port, int slot)
int padGetConnection(int port, int slot)
int padSetActDirect(int port, int slot, const char actAlign[6])
int padSetReqState(int port, int slot, int state)
int padPortClose(int port, int slot)
int padGetState(int port, int slot)
unsigned char padGetReqState(int port, int slot)
static struct pad_data_new * padGetDmaStrNew(int port, int slot)
static struct open_slot * padGetConnDmaStr(void)
int padInfoPressMode(int port, int slot)
int padSetMainMode(int port, int slot, int mode, int lock)
int padEnterPressMode(int port, int slot)
int padGetSlotMax(int port)
int padSetActAlign(int port, int slot, const char actAlign[6])