31 #define PAD_BIND_RPC_ID1_NEW 0x80000100
32 #define PAD_BIND_RPC_ID2_NEW 0x80000101
34 #define PAD_BIND_RPC_ID1_OLD 0x8000010f
35 #define PAD_BIND_RPC_ID2_OLD 0x8000011f
37 #define PAD_RPCCMD_OPEN_NEW 0x01
38 #define PAD_RPCCMD_SET_MMODE_NEW 0x06
39 #define PAD_RPCCMD_SET_ACTDIR_NEW 0x07
40 #define PAD_RPCCMD_SET_ACTALIGN_NEW 0x08
41 #define PAD_RPCCMD_GET_BTNMASK_NEW 0x09
42 #define PAD_RPCCMD_SET_BTNINFO_NEW 0x0A
43 #define PAD_RPCCMD_SET_VREF_NEW 0x0B
44 #define PAD_RPCCMD_GET_PORTMAX_NEW 0x0C
45 #define PAD_RPCCMD_GET_SLOTMAX_NEW 0x0D
46 #define PAD_RPCCMD_CLOSE_NEW 0x0E
47 #define PAD_RPCCMD_END_NEW 0x0F
48 #define PAD_RPCCMD_INIT 0x10
49 #define PAD_RPCCMD_GET_MODVER 0x12
51 #define PAD_RPCCMD_OPEN_OLD 0x80000100
52 #define PAD_RPCCMD_INFO_ACT 0x80000102
53 #define PAD_RPCCMD_INFO_COMB_OLD 0x80000103
54 #define PAD_RPCCMD_INFO_MODE 0x80000104
55 #define PAD_RPCCMD_SET_MMODE_OLD 0x80000105
56 #define PAD_RPCCMD_SET_ACTDIR_OLD 0x80000106
57 #define PAD_RPCCMD_SET_ACTALIGN_OLD 0x80000107
58 #define PAD_RPCCMD_GET_BTNMASK_OLD 0x80000108
59 #define PAD_RPCCMD_SET_BTNINFO_OLD 0x80000109
60 #define PAD_RPCCMD_SET_VREF_OLD 0x8000010a
61 #define PAD_RPCCMD_GET_PORTMAX_OLD 0x8000010b
62 #define PAD_RPCCMD_GET_SLOTMAX_OLD 0x8000010c
63 #define PAD_RPCCMD_CLOSE_OLD 0x8000010d
64 #define PAD_RPCCMD_END_OLD 0x8000010e
133 unsigned char *padBuf;
147 static const char *padStateString[] = {
157 static const char *padReqStateString[] = {
163 static int padInitialised = 0;
211 } padSetMainModeArgs;
219 } padGetButtonMaskArgs;
224 } padSetButtonInfoArgs;
228 } padSetButtonInfoResult;
239 } padActDirAlignArgs;
253 static void padCleanup(
void)
255 memset(&padsif[0], 0,
sizeof(padsif[0]));
256 memset(&padsif[1], 0,
sizeof(padsif[1]));
266 pdata = PadState[port][slot].padData->newPadData;
267 SyncDCache(pdata, (u8 *)pdata + 256);
269 return (pdata[0].frame < pdata[1].frame) ? &pdata[1] : &pdata[0];
273 padGetDmaStrOld(
int port,
int slot)
277 pdata = PadState[port][slot].padData->oldPadData;
278 SyncDCache(pdata, (u8 *)pdata + 256);
280 return (pdata[0].frame < pdata[1].frame) ? &pdata[1] : &pdata[0];
290 SyncDCache(openSlot, (u8*)openSlot +
sizeof(openSlot));
292 return (openSlot[0].frame < openSlot[1].frame) ? &openSlot[1] : &openSlot[0];
316 if (padsif[0].server && padsif[1].server)
319 padInitialised = 0xFFFFFFFF;
322 padsif[0].server = NULL;
323 padsif[1].server = NULL;
328 static const int rpc_ids[] = {
329 PAD_BIND_RPC_ID1_NEW,
330 PAD_BIND_RPC_ID1_OLD,
333 padsif[0].server = NULL;
334 for (i = 0; i < (
sizeof(rpc_ids)/
sizeof(rpc_ids[0])); i += 1)
335 rpciftmp[i].server = NULL;
339 for (i = 0; i < (
sizeof(rpc_ids)/
sizeof(rpc_ids[0])); i += 1)
341 if ((sceSifBindRpc(&rpciftmp[i], rpc_ids[i], 0) < 0))
343 if (rpciftmp[i].server != NULL)
347 case PAD_BIND_RPC_ID1_NEW:
350 rpc_init_next = PAD_BIND_RPC_ID2_NEW;
353 case PAD_BIND_RPC_ID1_OLD:
356 rpc_init_next = PAD_BIND_RPC_ID2_OLD;
362 memcpy(&padsif[0], &rpciftmp[i],
sizeof(padsif[0]));
366 if (padsif[0].server != NULL)
375 while (!padsif[1].server)
377 if (sceSifBindRpc(&padsif[1], rpc_init_next, 0) < 0)
396 for (i = 0; i < (
sizeof(PadState)/
sizeof(PadState[0])); i += 1)
398 for (j = 0; j < (
sizeof(PadState[0])/
sizeof(PadState[0][0])); j += 1)
400 PadState[i][j].open = 0;
401 PadState[i][j].port = 0;
402 PadState[i][j].slot = 0;
406 switch (padInitialised)
413 buffer.command = PAD_RPCCMD_OPEN_OLD;
414 ret = sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL);
422 buffer.command = PAD_RPCCMD_INIT;
423 buffer.padInitArgs.statBuf = openSlot;
424 ret = sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL);
426 return ret >= 0 ? buffer.padResult.result : 0;
438 switch (padInitialised)
442 buffer.command = PAD_RPCCMD_END_OLD;
447 buffer.command = PAD_RPCCMD_END_NEW;
454 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
457 ret = buffer.padResult.result;
469 if ((
unsigned int)port >= (
sizeof(PadState)/
sizeof(PadState[0])))
471 if ((
unsigned int)slot >= (
sizeof(PadState[0])/
sizeof(PadState[0][0])))
474 switch (padInitialised)
479 if ((u32)padArea & 0xf)
481 printf(
"Address is not 16-byte aligned.\n");
489 if ((u32)padArea & 0x3f)
491 printf(
"Address is not 64-byte aligned.\n");
502 switch (padInitialised)
508 for (i = 0; i < (
sizeof(dma_buf->oldPadData)/
sizeof(dma_buf->oldPadData[0])); i += 1)
512 pdata = &dma_buf->oldPadData[i];
513 memset(pdata->data, 0xff,
sizeof(pdata->data));
516 pdata->state = PAD_STATE_EXECCMD;
517 pdata->reqState = PAD_RSTAT_BUSY;
527 for (i = 0; i < (
sizeof(dma_buf->newPadData)/
sizeof(dma_buf->newPadData[0])); i += 1)
531 pdata = &dma_buf->newPadData[i];
532 memset(pdata->data, 0xff,
sizeof(pdata->data));
535 pdata->state = PAD_STATE_EXECCMD;
536 pdata->reqState = PAD_RSTAT_BUSY;
538 pdata->currentTask = 0;
539 pdata->buttonDataReady = 0;
547 switch (padInitialised)
551 buffer.command = PAD_RPCCMD_OPEN_OLD;
556 buffer.command = PAD_RPCCMD_OPEN_NEW;
562 buffer.padOpenArgs.port = port;
563 buffer.padOpenArgs.slot = slot;
564 buffer.padOpenArgs.padArea = padArea;
566 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
569 PadState[port][slot].open = padInitialised;
570 PadState[port][slot].padData = padArea;
571 PadState[port][slot].padBuf = buffer.padOpenResult.padBuf;
573 return buffer.padOpenResult.result;
581 if ((
unsigned int)port >= (
sizeof(PadState)/
sizeof(PadState[0])))
583 if ((
unsigned int)slot >= (
sizeof(PadState[0])/
sizeof(PadState[0][0])))
586 switch (padInitialised)
590 buffer.command = PAD_RPCCMD_CLOSE_OLD;
595 buffer.command = PAD_RPCCMD_CLOSE_NEW;
602 buffer.padCloseArgs.port = port;
603 buffer.padCloseArgs.slot = slot;
604 buffer.padCloseArgs.mode = 1;
606 ret = sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL);
610 PadState[port][slot].open = 0;
611 return buffer.padResult.result;
617 if ((
unsigned int)port >= (
sizeof(PadState)/
sizeof(PadState[0])))
619 if ((
unsigned int)slot >= (
sizeof(PadState[0])/
sizeof(PadState[0][0])))
622 switch (PadState[port][slot].open)
628 pdata = padGetDmaStrOld(port, slot);
630 memcpy(data, pdata->data, pdata->length);
631 return pdata->length;
639 memcpy(data, pdata->data, pdata->length);
640 return pdata->length;
650 if ((
unsigned int)port >= (
sizeof(PadState)/
sizeof(PadState[0])))
652 if ((
unsigned int)slot >= (
sizeof(PadState[0])/
sizeof(PadState[0][0])))
655 switch (PadState[port][slot].open)
662 pdata = padGetDmaStrOld(port, slot);
663 state = pdata->state;
665 if (state == PAD_STATE_STABLE &&
padGetReqState(port, slot) == PAD_RSTAT_BUSY)
666 return PAD_STATE_EXECCMD;
675 state = pdata->state;
677 if (state == PAD_STATE_ERROR && pdata->findPadRetries)
678 return PAD_STATE_FINDPAD;
680 if (state == PAD_STATE_STABLE &&
padGetReqState(port, slot) == PAD_RSTAT_BUSY)
681 return PAD_STATE_EXECCMD;
692 if ((
unsigned int)port >= (
sizeof(PadState)/
sizeof(PadState[0])))
694 if ((
unsigned int)slot >= (
sizeof(PadState[0])/
sizeof(PadState[0][0])))
697 switch (PadState[port][slot].open)
700 return padGetDmaStrOld(port, slot)->reqState;
711 if ((
unsigned int)port >= (
sizeof(PadState)/
sizeof(PadState[0])))
713 if ((
unsigned int)slot >= (
sizeof(PadState[0])/
sizeof(PadState[0][0])))
716 switch (PadState[port][slot].open)
719 padGetDmaStrOld(port, slot)->reqState = state;
730 padStateInt2String(
int state,
char buf[16])
732 if ((
unsigned int)state < (
sizeof(padStateString)/
sizeof(padStateString[0])))
733 strcpy(buf, padStateString[state]);
737 padReqStateInt2String(
int state,
char buf[16])
739 if ((
unsigned int)state < (
sizeof(padReqStateString)/
sizeof(padReqStateString[0])))
740 strcpy(buf, padReqStateString[state]);
746 switch (padInitialised)
750 buffer.command = PAD_RPCCMD_GET_PORTMAX_OLD;
755 buffer.command = PAD_RPCCMD_GET_PORTMAX_NEW;
762 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
765 return buffer.padResult.result;
771 switch (padInitialised)
775 buffer.command = PAD_RPCCMD_GET_SLOTMAX_OLD;
780 buffer.command = PAD_RPCCMD_GET_SLOTMAX_NEW;
786 buffer.padSlotMaxArgs.port = port;
788 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
791 return buffer.padResult.result;
797 if (padInitialised != 2)
799 buffer.command = PAD_RPCCMD_GET_MODVER;
801 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
804 return buffer.padResult.result;
810 if ((
unsigned int)port >= (
sizeof(PadState)/
sizeof(PadState[0])))
812 if ((
unsigned int)slot >= (
sizeof(PadState[0])/
sizeof(PadState[0][0])))
815 switch (PadState[port][slot].open)
819 buffer.command = PAD_RPCCMD_INFO_MODE;
820 buffer.padInfoModeArgs.port = port;
821 buffer.padInfoModeArgs.slot = slot;
822 buffer.padInfoModeArgs.infoMode = infoMode;
823 buffer.padInfoModeArgs.index = index;
825 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
828 if (buffer.padModeResult.result == 1)
830 return buffer.padModeResult.result;
838 if (pdata->currentTask != 1)
840 if (pdata->reqState == PAD_RSTAT_BUSY)
846 return (pdata->modeCurId == 0xF3) ? 0 : (pdata->modeCurId >> 4);
847 case PAD_MODECUREXID:
848 return (pdata->modeConfig == pdata->currentTask || ((
unsigned int)(pdata->modeCurOffs) >= (
sizeof(pdata->modeTable)/
sizeof(pdata->modeTable[0])))) ? 0 : pdata->modeTable[pdata->modeCurOffs];
849 case PAD_MODECUROFFS:
850 return (pdata->modeConfig == 0) ? 0 : pdata->modeCurOffs;
852 if (pdata->modeConfig != 0) {
854 return pdata->nrOfModes;
855 else if (index < pdata->nrOfModes && ((
unsigned int)index <= (
sizeof(pdata->modeTable)/
sizeof(pdata->modeTable[0]))))
856 return pdata->modeTable[index];
871 switch (padInitialised)
875 buffer.command = PAD_RPCCMD_SET_MMODE_OLD;
880 buffer.command = PAD_RPCCMD_SET_MMODE_NEW;
886 buffer.padSetMainModeArgs.port = port;
887 buffer.padSetMainModeArgs.slot = slot;
888 buffer.padSetMainModeArgs.mode = mode;
889 buffer.padSetMainModeArgs.lock = lock;
891 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
894 if (buffer.padModeResult.result == 1)
896 return buffer.padModeResult.result;
902 return (padGetButtonMask(port, slot) ^ 0x3ffff) ? 0 : 1;
908 return padSetButtonInfo(port, slot, 0xFFF);
914 return padSetButtonInfo(port, slot, 0);
918 padGetButtonMask(
int port,
int slot)
920 switch (padInitialised)
924 buffer.command = PAD_RPCCMD_GET_BTNMASK_OLD;
929 buffer.command = PAD_RPCCMD_GET_BTNMASK_NEW;
935 buffer.padGetButtonMaskArgs.port = port;
936 buffer.padGetButtonMaskArgs.slot = slot;
938 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
941 return buffer.padResult.result;
945 padSetButtonInfo(
int port,
int slot,
int buttonInfo)
947 switch (padInitialised)
951 buffer.command = PAD_RPCCMD_SET_BTNINFO_OLD;
956 buffer.command = PAD_RPCCMD_SET_BTNINFO_NEW;
962 buffer.padSetButtonInfoArgs.port = port;
963 buffer.padSetButtonInfoArgs.slot = slot;
964 buffer.padSetButtonInfoArgs.buttonInfo = buttonInfo;
966 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
969 if (buffer.padSetButtonInfoResult.result == 1)
971 return buffer.padSetButtonInfoResult.result;
977 if ((
unsigned int)port >= (
sizeof(PadState)/
sizeof(PadState[0])))
979 if ((
unsigned int)slot >= (
sizeof(PadState[0])/
sizeof(PadState[0][0])))
982 switch (PadState[port][slot].open)
986 buffer.command = PAD_RPCCMD_INFO_ACT;
987 buffer.padInfoActArgs.port = port;
988 buffer.padInfoActArgs.slot = slot;
989 buffer.padInfoActArgs.actuator = actuator;
990 buffer.padInfoActArgs.act_cmd = cmd;
992 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
995 if (buffer.padModeResult.result == 1)
997 return buffer.padModeResult.result;
1005 if (pdata->currentTask != 1)
1007 if (pdata->modeConfig < 2)
1009 if (actuator >= pdata->nrOfActuators)
1013 return pdata->nrOfActuators;
1015 if ((
unsigned int)actuator >= (
sizeof(pdata->actData)/
sizeof(pdata->actData[0])))
1017 if ((
unsigned int)cmd >= (
sizeof(pdata->actData[0])/
sizeof(pdata->actData[0][0])))
1020 return pdata->actData[actuator][cmd];
1030 switch (padInitialised)
1034 buffer.command = PAD_RPCCMD_SET_ACTALIGN_OLD;
1039 buffer.command = PAD_RPCCMD_SET_ACTALIGN_NEW;
1045 buffer.padActDirAlignArgs.port = port;
1046 buffer.padActDirAlignArgs.slot = slot;
1048 memcpy(buffer.padActDirAlignArgs.align, actAlign,
sizeof(buffer.padActDirAlignArgs.align));
1050 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
1053 if (buffer.padModeResult.result == 1)
1055 return buffer.padModeResult.result;
1061 switch (padInitialised)
1065 buffer.command = PAD_RPCCMD_SET_ACTDIR_OLD;
1070 buffer.command = PAD_RPCCMD_SET_ACTDIR_NEW;
1076 buffer.padActDirAlignArgs.port = port;
1077 buffer.padActDirAlignArgs.slot = slot;
1079 memcpy(buffer.padActDirAlignArgs.align, actAlign,
sizeof(buffer.padActDirAlignArgs.align));
1081 if (sceSifCallRpc(&padsif[0], 1, 0, &buffer,
sizeof(buffer), &buffer,
sizeof(buffer), NULL, NULL) < 0)
1084 return buffer.padModeResult.result;
1095 if (padInitialised != 2)
1098 if ((
unsigned int)slot >= (
sizeof(oslt->openSlots)/
sizeof(oslt->openSlots[0])))
1100 return ((oslt->openSlots[port] >> slot) & 0x1);