30 #include <sys/_tz_structs.h>
36 #define CD_SERVER_SCMD 0x80000593
39 CD_SCMD_READCLOCK = 0x01,
44 CD_SCMD_READ_ILINK_ID,
45 CD_SCMD_WRITE_ILINK_ID,
56 CD_SCMD_READ_CONSOLE_ID,
57 CD_SCMD_WRITE_CONSOLE_ID,
58 CD_SCMD_READ_MECHACON_VERSION,
63 CD_SCMD_AUTO_ADJUST_CTRL,
64 CD_SCMD_READ_MODEL_NAME,
65 CD_SCMD_WRITE_MODEL_NAME,
69 CD_SCMD_CANCELPOWEROFF,
90 #ifdef F__scmd_internals
100 int CdConfigRdWrNumBlocks;
103 extern int initVersionCdvdman;
105 extern int sCmdSemaId;
106 extern u8 sCmdRecvBuff[];
110 extern int CdConfigRdWrNumBlocks;
114 int _CdCheckSCmd(
int cmd);
118 #ifdef F_sceCdReadClock
121 if (_CdCheckSCmd(CD_SCMD_READCLOCK) == 0)
125 printf(
"Libcdvd call Clock read 1\n");
127 if (sceSifCallRpc(&clientSCmd, CD_SCMD_READCLOCK, 0, NULL, 0, sCmdRecvBuff, 16, NULL, NULL) < 0) {
128 SignalSema(sCmdSemaId);
132 memcpy(clock, UNCACHED_SEG(sCmdRecvBuff + 4), 8);
135 printf(
"Libcdvd call Clock read 2\n");
137 SignalSema(sCmdSemaId);
138 return *(
int *)UNCACHED_SEG(sCmdRecvBuff);
149 time_t ps2time(time_t *t)
160 convertfrombcd(&ps2tim);
162 printf(
"ps2time: %d-%d-%d %d:%d:%d\n",
170 tim.tm_sec = ps2tim.
second;
171 tim.tm_min = ps2tim.
minute;
172 tim.tm_hour = ps2tim.
hour;
173 tim.tm_mday = ps2tim.
day;
174 tim.tm_mon = ps2tim.
month - 1;
175 tim.tm_year = ps2tim.
year + 100;
180 offset_save = tz->__tzrule[0].offset;
181 tz->__tzrule[0].offset = -9 * 60 * 60;
185 tz->__tzrule[0].offset = offset_save;
194 #ifdef F_sceCdWriteClock
199 if (_CdCheckSCmd(CD_SCMD_WRITECLOCK) == 0)
202 memcpy(&sCmdSendBuff.clock, clock, 8);
204 if (sceSifCallRpc(&clientSCmd, CD_SCMD_WRITECLOCK, 0, &sCmdSendBuff, 8, sCmdRecvBuff, 16, NULL, NULL) < 0) {
205 SignalSema(sCmdSemaId);
209 memcpy(clock, UNCACHED_SEG(sCmdRecvBuff + 4), 8);
210 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
212 SignalSema(sCmdSemaId);
217 #ifdef F_sceCdGetDiskType
222 if (_CdCheckSCmd(CD_SCMD_GETDISKTYPE) == 0)
225 if (sceSifCallRpc(&clientSCmd, CD_SCMD_GETDISKTYPE, 0, NULL, 0, sCmdRecvBuff, 4, NULL, NULL) < 0) {
226 SignalSema(sCmdSemaId);
230 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
232 SignalSema(sCmdSemaId);
237 #ifdef F_sceCdGetError
242 if (_CdCheckSCmd(CD_SCMD_GETERROR) == 0)
245 if (sceSifCallRpc(&clientSCmd, CD_SCMD_GETERROR, 0, NULL, 0, sCmdRecvBuff, 4, NULL, NULL) < 0) {
246 SignalSema(sCmdSemaId);
250 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
252 SignalSema(sCmdSemaId);
257 #ifdef F_sceCdTrayReq
262 if (_CdCheckSCmd(CD_SCMD_TRAYREQ) == 0)
265 sCmdSendBuff.s32arg = param;
267 if (sceSifCallRpc(&clientSCmd, CD_SCMD_TRAYREQ, 0, &sCmdSendBuff, 4, sCmdRecvBuff, 8, NULL, NULL) < 0) {
268 SignalSema(sCmdSemaId);
273 *traychk = *(u32 *)UNCACHED_SEG(sCmdRecvBuff + 4);
274 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
276 SignalSema(sCmdSemaId);
281 #ifdef F_sceCdApplySCmd
282 int sceCdApplySCmd(u8 cmdNum,
const void *inBuff, u16 inBuffSize,
void *outBuff)
284 if (_CdCheckSCmd(CD_SCMD_SCMD) == 0)
287 sCmdSendBuff.scmd.cmdNum = cmdNum;
288 sCmdSendBuff.scmd.inBuffSize = inBuffSize;
289 memset(sCmdSendBuff.scmd.inBuff, 0, 16);
291 memcpy(sCmdSendBuff.scmd.inBuff, inBuff, inBuffSize);
293 if (sceSifCallRpc(&clientSCmd, CD_SCMD_SCMD, 0, &sCmdSendBuff, 20, sCmdRecvBuff, 16, NULL, NULL) < 0) {
294 SignalSema(sCmdSemaId);
299 memcpy(outBuff, UNCACHED_SEG(sCmdRecvBuff), 16);
300 SignalSema(sCmdSemaId);
310 if (_CdCheckSCmd(CD_SCMD_STATUS) == 0)
313 if (sceSifCallRpc(&clientSCmd, CD_SCMD_STATUS, 0, NULL, 0, sCmdRecvBuff, 4, NULL, NULL) < 0) {
314 SignalSema(sCmdSemaId);
319 printf(
"status called\n");
320 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
322 SignalSema(sCmdSemaId);
332 if (_CdCheckSCmd(CD_SCMD_BREAK) == 0)
335 if (sceSifCallRpc(&clientSCmd, CD_SCMD_BREAK, 0, NULL, 0, sCmdRecvBuff, 4, NULL, NULL) < 0) {
336 SignalSema(sCmdSemaId);
339 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
341 SignalSema(sCmdSemaId);
346 #ifdef F_sceCdCancelPOffRdy
351 if (_CdCheckSCmd(CD_SCMD_CANCELPOWEROFF) == 0)
354 if (sceSifCallRpc(&clientSCmd, CD_SCMD_CANCELPOWEROFF, 0, NULL, 0, sCmdRecvBuff, 8, NULL, NULL) < 0) {
355 SignalSema(sCmdSemaId);
359 *result = *(u32 *)UNCACHED_SEG(sCmdRecvBuff + 4);
360 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
362 SignalSema(sCmdSemaId);
367 #ifdef F_sceCdBlueLedCtrl
368 int sceCdBlueLedCtrl(u8 control, u32 *result)
372 if (_CdCheckSCmd(CD_SCMD_BLUELEDCTRL) == 0)
375 sCmdSendBuff.u32arg = control;
376 if (sceSifCallRpc(&clientSCmd, CD_SCMD_BLUELEDCTRL, 0, &sCmdSendBuff, 4, sCmdRecvBuff, 8, NULL, NULL) < 0) {
377 SignalSema(sCmdSemaId);
381 *result = *(u32 *)UNCACHED_SEG(sCmdRecvBuff + 4);
382 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
384 SignalSema(sCmdSemaId);
389 #ifdef F_sceCdPowerOff
394 if (_CdCheckSCmd(CD_SCMD_POWEROFF) == 0)
397 if (sceSifCallRpc(&clientSCmd, CD_SCMD_POWEROFF, 0, NULL, 0, sCmdRecvBuff, 8, NULL, NULL) < 0) {
398 SignalSema(sCmdSemaId);
402 *result = *(u32 *)UNCACHED_SEG(sCmdRecvBuff + 4);
403 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
405 SignalSema(sCmdSemaId);
415 if (_CdCheckSCmd(CD_SCMD_MMODE) == 0)
418 sCmdSendBuff.s32arg = media;
419 if (sceSifCallRpc(&clientSCmd, CD_SCMD_MMODE, 0, &sCmdSendBuff, 4, sCmdRecvBuff, 4, NULL, NULL) < 0) {
420 SignalSema(sCmdSemaId);
424 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
426 SignalSema(sCmdSemaId);
431 #ifdef F_sceCdChangeThreadPriority
436 if (_CdCheckSCmd(CD_SCMD_SETTHREADPRI) == 0)
439 sCmdSendBuff.s32arg = priority;
440 if (sceSifCallRpc(&clientSCmd, CD_SCMD_SETTHREADPRI, 0, &sCmdSendBuff, 4, sCmdRecvBuff, 4, NULL, NULL) < 0) {
441 SignalSema(sCmdSemaId);
445 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
447 SignalSema(sCmdSemaId);
452 #ifdef F__CdCheckSCmd
453 int _CdCheckSCmd(
int cur_cmd)
456 if (PollSema(sCmdSemaId) != sCmdSemaId) {
458 printf(
"Scmd fail sema cur_cmd:%d keep_cmd:%d\n", cur_cmd, sCmdNum);
463 SignalSema(sCmdSemaId);
469 memset(&clientSCmd, 0,
sizeof(clientSCmd));
470 if (clientSCmd.server)
475 printf(
"Libcdvd bind err S cmd\n");
477 if (clientSCmd.server != 0)
486 #ifdef F_sceCdForbidRead
491 if (_CdCheckSCmd(CD_SCMD_FORBID_READ) == 0)
493 if (sceSifCallRpc(&clientSCmd, CD_SCMD_FORBID_READ, 0, NULL, 0, sCmdRecvBuff, 8, NULL, NULL) >= 0) {
494 *status = ((u32 *)UNCACHED_SEG(sCmdRecvBuff))[1];
495 result = ((
int *)UNCACHED_SEG(sCmdRecvBuff))[0];
499 SignalSema(sCmdSemaId);
504 #ifdef F_sceCdSpinCtrlEE
509 if (_CdCheckSCmd(CD_SCMD_SPIN_CTRL) == 0)
511 sCmdSendBuff.u32arg = speed;
512 if (sceSifCallRpc(&clientSCmd, CD_SCMD_SPIN_CTRL, 0, &sCmdSendBuff, 4, sCmdRecvBuff, 8, NULL, NULL) >= 0) {
513 result = ((
int *)UNCACHED_SEG(sCmdRecvBuff))[0];
517 SignalSema(sCmdSemaId);
522 #ifdef F_sceCdBootCertify
527 if (_CdCheckSCmd(CD_SCMD_BOOT_CERTIFY) == 0)
530 memcpy(sCmdSendBuff.bcertify, romname, 4);
531 if (sceSifCallRpc(&clientSCmd, CD_SCMD_BOOT_CERTIFY, 0, &sCmdSendBuff, 4, sCmdRecvBuff, 4, NULL, NULL) >= 0) {
532 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
537 SignalSema(sCmdSemaId);
542 #ifdef F_sceCdReadSUBQ
547 if (_CdCheckSCmd(CD_SCMD_READ_SUBQ) == 0)
550 if (sceSifCallRpc(&clientSCmd, CD_SCMD_READ_SUBQ, 0, NULL, 0, sCmdRecvBuff, 0x12, NULL, NULL) >= 0) {
551 memcpy(buffer, UNCACHED_SEG(&sCmdRecvBuff[8]), 0x12);
552 *status = *(u32 *)UNCACHED_SEG(&sCmdRecvBuff[4]);
553 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
558 SignalSema(sCmdSemaId);
563 #ifdef F_sceCdForbidDVDP
568 if (_CdCheckSCmd(CD_SCMD_FORBID_DVDP) == 0)
571 if (sceSifCallRpc(&clientSCmd, CD_SCMD_FORBID_DVDP, 0, NULL, 0, sCmdRecvBuff, 8, NULL, NULL) >= 0) {
572 *result = ((u32 *)UNCACHED_SEG(sCmdRecvBuff))[1];
573 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
578 SignalSema(sCmdSemaId);
583 #ifdef F_sceCdAutoAdjustCtrl
588 if (_CdCheckSCmd(CD_SCMD_AUTO_ADJUST_CTRL) == 0)
591 sCmdSendBuff.s32arg = mode;
592 if (sceSifCallRpc(&clientSCmd, CD_SCMD_AUTO_ADJUST_CTRL, 0, &sCmdSendBuff, 4, sCmdRecvBuff, 8, NULL, NULL) >= 0) {
593 *result = ((u32 *)UNCACHED_SEG(sCmdRecvBuff))[1];
594 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
599 SignalSema(sCmdSemaId);
605 int sceCdDecSet(
unsigned char arg1,
unsigned char arg2,
unsigned char shift)
609 if (_CdCheckSCmd(CD_SCMD_DEC_SET) == 0)
612 sCmdSendBuff.decSet.arg1 = arg1;
613 sCmdSendBuff.decSet.arg2 = arg2;
614 sCmdSendBuff.decSet.shift = shift;
616 if (sceSifCallRpc(&clientSCmd, CD_SCMD_DEC_SET, 0, &sCmdSendBuff, 4, sCmdRecvBuff, 16, NULL, NULL) >= 0) {
617 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
622 SignalSema(sCmdSemaId);
627 #ifdef F_sceCdSetHDMode
632 if (_CdCheckSCmd(CD_SCMD_SET_HD_MODE) == 0)
634 sCmdSendBuff.u32arg = mode;
635 if (sceSifCallRpc(&clientSCmd, CD_SCMD_SET_HD_MODE, 0, &sCmdSendBuff, 4, sCmdRecvBuff, 4, NULL, NULL) >= 0) {
636 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
640 SignalSema(sCmdSemaId);
645 #ifdef F_sceCdOpenConfig
650 if (NumBlocks < 0x45) {
651 if (_CdCheckSCmd(CD_SCMD_OPEN_CONFIG) == 0)
654 sCmdSendBuff.u32arg = ((NumBlocks & 0xFF) << 16) | (mode & 0xFF) | ((block & 0xFF) << 8);
655 CdConfigRdWrNumBlocks = NumBlocks;
656 if (sceSifCallRpc(&clientSCmd, CD_SCMD_OPEN_CONFIG, 0, &sCmdSendBuff, 4, sCmdRecvBuff, 8, NULL, NULL) >= 0) {
657 *status = ((u32 *)UNCACHED_SEG(sCmdRecvBuff))[1];
658 result = ((
int *)UNCACHED_SEG(sCmdRecvBuff))[0];
662 SignalSema(sCmdSemaId);
670 #ifdef F_sceCdCloseConfig
675 if (_CdCheckSCmd(CD_SCMD_CLOSE_CONFIG) == 0)
678 if (sceSifCallRpc(&clientSCmd, CD_SCMD_CLOSE_CONFIG, 0, NULL, 0, sCmdRecvBuff, 8, NULL, NULL) >= 0) {
679 *result = ((u32 *)UNCACHED_SEG(sCmdRecvBuff))[1];
680 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
685 SignalSema(sCmdSemaId);
690 #ifdef F_sceCdReadConfig
695 if (_CdCheckSCmd(CD_SCMD_READ_CONFIG) == 0)
698 if (sceSifCallRpc(&clientSCmd, CD_SCMD_READ_CONFIG, 0, NULL, 0, sCmdRecvBuff, 0x408, NULL, NULL) >= 0) {
699 *result = ((
int *)UNCACHED_SEG(sCmdRecvBuff))[1];
700 memcpy(buffer, &((u32 *)UNCACHED_SEG(sCmdRecvBuff))[2], (CdConfigRdWrNumBlocks << 4) - CdConfigRdWrNumBlocks);
701 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
706 SignalSema(sCmdSemaId);
711 #ifdef F_sceCdWriteConfig
716 if (_CdCheckSCmd(CD_SCMD_WRITE_CONFIG) == 0)
719 memcpy(sCmdSendBuff.data, buffer, (CdConfigRdWrNumBlocks << 4) - CdConfigRdWrNumBlocks);
720 if (sceSifCallRpc(&clientSCmd, CD_SCMD_WRITE_CONFIG, 0, &sCmdSendBuff, 0x400, sCmdRecvBuff, 8, NULL, NULL) >= 0) {
721 *result = ((
int *)UNCACHED_SEG(sCmdRecvBuff))[1];
722 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
727 SignalSema(sCmdSemaId);
733 #ifdef F_sceCdReadNVM
738 if (_CdCheckSCmd(CD_SCMD_READ_NVM) == 0)
741 sCmdSendBuff.nvm.address = address;
742 sCmdSendBuff.nvm.value = 0;
743 sCmdSendBuff.nvm.pad = 0;
745 if (sceSifCallRpc(&clientSCmd, CD_SCMD_READ_NVM, 0, &sCmdSendBuff, 8, sCmdRecvBuff, 0x10, NULL, NULL) >= 0) {
746 *data = *(
unsigned short int *)UNCACHED_SEG(&sCmdRecvBuff[8]);
747 *result = *(u8 *)UNCACHED_SEG(&sCmdRecvBuff[10]);
748 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
753 SignalSema(sCmdSemaId);
758 #ifdef F_sceCdWriteNVM
763 if (_CdCheckSCmd(CD_SCMD_WRITE_NVM) == 0)
766 sCmdSendBuff.nvm.address = address;
767 sCmdSendBuff.nvm.value = data;
768 sCmdSendBuff.nvm.pad = 0;
770 if (sceSifCallRpc(&clientSCmd, CD_SCMD_WRITE_NVM, 0, &sCmdSendBuff, 8, sCmdRecvBuff, 0x10, NULL, NULL) >= 0) {
771 *result = *(u8 *)UNCACHED_SEG(&sCmdRecvBuff[10]);
772 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
777 SignalSema(sCmdSemaId);
783 int sceCdRI(
unsigned char *buffer, u32 *result)
787 if (_CdCheckSCmd(CD_SCMD_READ_ILINK_ID) == 0)
790 if (sceSifCallRpc(&clientSCmd, CD_SCMD_READ_ILINK_ID, 0, NULL, 0, sCmdRecvBuff, 16, NULL, NULL) >= 0) {
791 memcpy(buffer, UNCACHED_SEG(&sCmdRecvBuff[8]), 8);
792 *result = *(u32 *)UNCACHED_SEG(&sCmdRecvBuff[4]);
793 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
798 SignalSema(sCmdSemaId);
804 int sceCdWI(
const unsigned char *buffer, u32 *status)
808 if (_CdCheckSCmd(CD_SCMD_WRITE_ILINK_ID) == 0)
811 memcpy(sCmdSendBuff.id, buffer, 8);
812 if (sceSifCallRpc(&clientSCmd, CD_SCMD_WRITE_ILINK_ID, 0, &sCmdSendBuff, 8, sCmdRecvBuff, 8, NULL, NULL) >= 0) {
813 *status = *(u32 *)UNCACHED_SEG(&sCmdRecvBuff[4]);
814 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
819 SignalSema(sCmdSemaId);
824 #ifdef F_sceCdReadConsoleID
829 if (_CdCheckSCmd(CD_SCMD_READ_CONSOLE_ID) == 0)
832 if (sceSifCallRpc(&clientSCmd, CD_SCMD_READ_CONSOLE_ID, 0, NULL, 0, sCmdRecvBuff, 16, NULL, NULL) >= 0) {
833 memcpy(buffer, UNCACHED_SEG(&sCmdRecvBuff[8]), 8);
834 *result = *(u32 *)UNCACHED_SEG(&sCmdRecvBuff[4]);
835 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
840 SignalSema(sCmdSemaId);
845 #ifdef F_sceCdWriteConsoleID
850 if (_CdCheckSCmd(CD_SCMD_WRITE_CONSOLE_ID) == 0)
853 memcpy(sCmdSendBuff.id, buffer, 8);
854 if (sceSifCallRpc(&clientSCmd, CD_SCMD_WRITE_CONSOLE_ID, 0, &sCmdSendBuff, 8, sCmdRecvBuff, 8, NULL, NULL) >= 0) {
855 *result = *(u32 *)UNCACHED_SEG(&sCmdRecvBuff[4]);
856 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
861 SignalSema(sCmdSemaId);
867 int sceCdMV(
unsigned char *buffer, u32 *result)
871 if (_CdCheckSCmd(CD_SCMD_READ_MECHACON_VERSION) == 0)
874 if (sceSifCallRpc(&clientSCmd, CD_SCMD_READ_MECHACON_VERSION, 0, NULL, 0, sCmdRecvBuff, 16, NULL, NULL) >= 0) {
876 memcpy(buffer, UNCACHED_SEG(&sCmdRecvBuff[8]), (initVersionCdvdman >= 0x200) ? 4 : 3);
877 *result = *(u32 *)UNCACHED_SEG(&sCmdRecvBuff[4]);
878 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
883 SignalSema(sCmdSemaId);
888 #ifdef F_sceCdCtrlADout
893 if (_CdCheckSCmd(CD_SCMD_CTRL_AD_OUT) == 0)
896 sCmdSendBuff.s32arg = arg1;
897 if (sceSifCallRpc(&clientSCmd, CD_SCMD_CTRL_AD_OUT, 0, &sCmdSendBuff, 4, sCmdRecvBuff, 8, NULL, NULL) >= 0) {
898 *result = *(u32 *)UNCACHED_SEG(&sCmdRecvBuff[4]);
899 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
904 SignalSema(sCmdSemaId);
910 int sceCdRM(
char *buffer, u32 *result)
914 if (_CdCheckSCmd(CD_SCMD_READ_MODEL_NAME) == 0)
917 if (sceSifCallRpc(&clientSCmd, CD_SCMD_READ_MODEL_NAME, 0, NULL, 0, sCmdRecvBuff, 0x18, NULL, NULL) >= 0) {
918 memcpy(buffer, UNCACHED_SEG(&sCmdRecvBuff[8]), 16);
919 *result = *(u32 *)UNCACHED_SEG(&sCmdRecvBuff[4]);
920 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
925 SignalSema(sCmdSemaId);
931 int sceCdWM(
const char *buffer, u32 *result)
935 if (_CdCheckSCmd(CD_SCMD_WRITE_MODEL_NAME) == 0)
938 memcpy(sCmdSendBuff.mname, buffer, 16);
939 if (sceSifCallRpc(&clientSCmd, CD_SCMD_WRITE_MODEL_NAME, 0, &sCmdSendBuff, 0x10, sCmdRecvBuff, 8, NULL, NULL) >= 0) {
940 *result = *(u32 *)UNCACHED_SEG(&sCmdRecvBuff[4]);
941 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
946 SignalSema(sCmdSemaId);
951 #ifdef F_sceCdNoticeGameStart
965 *result = (u8)out[0];
973 int _CdSyncS(
int mode)
977 printf(
"S cmd wait\n");
978 while (sceSifCheckStatRpc(&clientSCmd))
983 return sceSifCheckStatRpc(&clientSCmd);