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;
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;
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];
266 padGetDmaStrOld(
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;
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;
727 padStateInt2String(
int state,
char buf[16])
729 if ((
unsigned int)state < (
sizeof(padStateString)/
sizeof(padStateString[0])))
730 strcpy(buf, padStateString[state]);
734 padReqStateInt2String(
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);
915 padGetButtonMask(
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;
942 padSetButtonInfo(
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);