30 #include <sys/_tz_structs.h>
35 #define CD_SERVER_SCMD 0x80000593
38 CD_SCMD_READCLOCK = 0x01,
43 CD_SCMD_READ_ILINK_ID,
44 CD_SCMD_WRITE_ILINK_ID,
55 CD_SCMD_READ_CONSOLE_ID,
56 CD_SCMD_WRITE_CONSOLE_ID,
57 CD_SCMD_READ_MECHACON_VERSION,
62 CD_SCMD_AUTO_ADJUST_CTRL,
63 CD_SCMD_READ_MODEL_NAME,
64 CD_SCMD_WRITE_MODEL_NAME,
68 CD_SCMD_CANCELPOWEROFF,
89 #ifdef F__scmd_internals
101 int CdConfigRdWrNumBlocks;
104 extern int initVersionCdvdman;
107 extern int sCmdSemaId;
108 extern u8 sCmdRecvBuff[];
112 extern int CdConfigRdWrNumBlocks;
116 int _CdCheckSCmd(
int cmd);
120 #ifdef F_sceCdReadClock
123 if (_CdCheckSCmd(CD_SCMD_READCLOCK) == 0)
127 printf(
"Libcdvd call Clock read 1\n");
129 if (sceSifCallRpc(&clientSCmd, CD_SCMD_READCLOCK, 0, NULL, 0, sCmdRecvBuff, 16, NULL, NULL) < 0) {
130 SignalSema(sCmdSemaId);
134 memcpy(clock, UNCACHED_SEG(sCmdRecvBuff + 4), 8);
137 printf(
"Libcdvd call Clock read 2\n");
139 SignalSema(sCmdSemaId);
140 return *(
int *)UNCACHED_SEG(sCmdRecvBuff);
151 time_t ps2time(time_t *t)
162 convertfrombcd(&ps2tim);
164 printf(
"ps2time: %d-%d-%d %d:%d:%d\n",
172 tim.tm_sec = ps2tim.
second;
173 tim.tm_min = ps2tim.
minute;
174 tim.tm_hour = ps2tim.
hour;
175 tim.tm_mday = ps2tim.
day;
176 tim.tm_mon = ps2tim.
month - 1;
177 tim.tm_year = ps2tim.
year + 100;
182 offset_save = tz->__tzrule[0].offset;
183 tz->__tzrule[0].offset = -9 * 60 * 60;
187 tz->__tzrule[0].offset = offset_save;
196 #ifdef F_sceCdWriteClock
201 if (_CdCheckSCmd(CD_SCMD_WRITECLOCK) == 0)
204 memcpy(&sCmdSendBuff.clock, clock, 8);
206 if (sceSifCallRpc(&clientSCmd, CD_SCMD_WRITECLOCK, 0, &sCmdSendBuff, 8, sCmdRecvBuff, 16, NULL, NULL) < 0) {
207 SignalSema(sCmdSemaId);
211 memcpy(clock, UNCACHED_SEG(sCmdRecvBuff + 4), 8);
212 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
214 SignalSema(sCmdSemaId);
219 #ifdef F_sceCdGetDiskType
224 if (_CdCheckSCmd(CD_SCMD_GETDISKTYPE) == 0)
227 if (sceSifCallRpc(&clientSCmd, CD_SCMD_GETDISKTYPE, 0, NULL, 0, sCmdRecvBuff, 4, NULL, NULL) < 0) {
228 SignalSema(sCmdSemaId);
232 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
234 SignalSema(sCmdSemaId);
239 #ifdef F_sceCdGetError
244 if (_CdCheckSCmd(CD_SCMD_GETERROR) == 0)
247 if (sceSifCallRpc(&clientSCmd, CD_SCMD_GETERROR, 0, NULL, 0, sCmdRecvBuff, 4, NULL, NULL) < 0) {
248 SignalSema(sCmdSemaId);
252 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
254 SignalSema(sCmdSemaId);
259 #ifdef F_sceCdTrayReq
264 if (_CdCheckSCmd(CD_SCMD_TRAYREQ) == 0)
267 sCmdSendBuff.s32arg = param;
269 if (sceSifCallRpc(&clientSCmd, CD_SCMD_TRAYREQ, 0, &sCmdSendBuff, 4, sCmdRecvBuff, 8, NULL, NULL) < 0) {
270 SignalSema(sCmdSemaId);
275 *traychk = *(u32 *)UNCACHED_SEG(sCmdRecvBuff + 4);
276 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
278 SignalSema(sCmdSemaId);
283 #ifdef F_sceCdApplySCmd
284 int sceCdApplySCmd(u8 cmdNum,
const void *inBuff, u16 inBuffSize,
void *outBuff)
286 if (_CdCheckSCmd(CD_SCMD_SCMD) == 0)
289 sCmdSendBuff.scmd.cmdNum = cmdNum;
290 sCmdSendBuff.scmd.inBuffSize = inBuffSize;
291 memset(sCmdSendBuff.scmd.inBuff, 0, 16);
293 memcpy(sCmdSendBuff.scmd.inBuff, inBuff, inBuffSize);
295 if (sceSifCallRpc(&clientSCmd, CD_SCMD_SCMD, 0, &sCmdSendBuff, 20, sCmdRecvBuff, 16, NULL, NULL) < 0) {
296 SignalSema(sCmdSemaId);
301 memcpy(outBuff, UNCACHED_SEG(sCmdRecvBuff), 16);
302 SignalSema(sCmdSemaId);
312 if (_CdCheckSCmd(CD_SCMD_STATUS) == 0)
315 if (sceSifCallRpc(&clientSCmd, CD_SCMD_STATUS, 0, NULL, 0, sCmdRecvBuff, 4, NULL, NULL) < 0) {
316 SignalSema(sCmdSemaId);
321 printf(
"status called\n");
322 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
324 SignalSema(sCmdSemaId);
334 if (_CdCheckSCmd(CD_SCMD_BREAK) == 0)
337 if (sceSifCallRpc(&clientSCmd, CD_SCMD_BREAK, 0, NULL, 0, sCmdRecvBuff, 4, NULL, NULL) < 0) {
338 SignalSema(sCmdSemaId);
341 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
343 SignalSema(sCmdSemaId);
348 #ifdef F_sceCdCancelPOffRdy
353 if (_CdCheckSCmd(CD_SCMD_CANCELPOWEROFF) == 0)
356 if (sceSifCallRpc(&clientSCmd, CD_SCMD_CANCELPOWEROFF, 0, NULL, 0, sCmdRecvBuff, 8, NULL, NULL) < 0) {
357 SignalSema(sCmdSemaId);
361 *result = *(u32 *)UNCACHED_SEG(sCmdRecvBuff + 4);
362 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
364 SignalSema(sCmdSemaId);
369 #ifdef F_sceCdBlueLedCtrl
370 int sceCdBlueLedCtrl(u8 control, u32 *result)
374 if (_CdCheckSCmd(CD_SCMD_BLUELEDCTRL) == 0)
377 sCmdSendBuff.u32arg = control;
378 if (sceSifCallRpc(&clientSCmd, CD_SCMD_BLUELEDCTRL, 0, &sCmdSendBuff, 4, sCmdRecvBuff, 8, NULL, NULL) < 0) {
379 SignalSema(sCmdSemaId);
383 *result = *(u32 *)UNCACHED_SEG(sCmdRecvBuff + 4);
384 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
386 SignalSema(sCmdSemaId);
391 #ifdef F_sceCdPowerOff
396 if (_CdCheckSCmd(CD_SCMD_POWEROFF) == 0)
399 if (sceSifCallRpc(&clientSCmd, CD_SCMD_POWEROFF, 0, NULL, 0, sCmdRecvBuff, 8, NULL, NULL) < 0) {
400 SignalSema(sCmdSemaId);
404 *result = *(u32 *)UNCACHED_SEG(sCmdRecvBuff + 4);
405 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
407 SignalSema(sCmdSemaId);
417 if (_CdCheckSCmd(CD_SCMD_MMODE) == 0)
420 sCmdSendBuff.s32arg = media;
421 if (sceSifCallRpc(&clientSCmd, CD_SCMD_MMODE, 0, &sCmdSendBuff, 4, sCmdRecvBuff, 4, NULL, NULL) < 0) {
422 SignalSema(sCmdSemaId);
426 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
428 SignalSema(sCmdSemaId);
433 #ifdef F_sceCdChangeThreadPriority
438 if (_CdCheckSCmd(CD_SCMD_SETTHREADPRI) == 0)
441 sCmdSendBuff.s32arg = priority;
442 if (sceSifCallRpc(&clientSCmd, CD_SCMD_SETTHREADPRI, 0, &sCmdSendBuff, 4, sCmdRecvBuff, 4, NULL, NULL) < 0) {
443 SignalSema(sCmdSemaId);
447 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
449 SignalSema(sCmdSemaId);
454 #ifdef F__CdCheckSCmd
455 int _CdCheckSCmd(
int cur_cmd)
458 if (PollSema(sCmdSemaId) != sCmdSemaId) {
460 printf(
"Scmd fail sema cur_cmd:%d keep_cmd:%d\n", cur_cmd, sCmdNum);
464 ReferThreadStatus(CdThreadId, &CdThreadParam);
466 SignalSema(sCmdSemaId);
476 printf(
"Libcdvd bind err S cmd\n");
478 if (clientSCmd.server != 0)
489 #ifdef F_sceCdForbidRead
494 if (_CdCheckSCmd(CD_SCMD_FORBID_READ) == 0)
496 if (sceSifCallRpc(&clientSCmd, CD_SCMD_FORBID_READ, 0, NULL, 0, sCmdRecvBuff, 8, NULL, NULL) >= 0) {
497 *status = ((u32 *)UNCACHED_SEG(sCmdRecvBuff))[1];
498 result = ((
int *)UNCACHED_SEG(sCmdRecvBuff))[0];
502 SignalSema(sCmdSemaId);
507 #ifdef F_sceCdSpinCtrlEE
512 if (_CdCheckSCmd(CD_SCMD_SPIN_CTRL) == 0)
514 sCmdSendBuff.u32arg = speed;
515 if (sceSifCallRpc(&clientSCmd, CD_SCMD_SPIN_CTRL, 0, &sCmdSendBuff, 4, sCmdRecvBuff, 8, NULL, NULL) >= 0) {
516 result = ((
int *)UNCACHED_SEG(sCmdRecvBuff))[0];
520 SignalSema(sCmdSemaId);
525 #ifdef F_sceCdBootCertify
530 if (_CdCheckSCmd(CD_SCMD_BOOT_CERTIFY) == 0)
533 memcpy(sCmdSendBuff.bcertify, romname, 4);
534 if (sceSifCallRpc(&clientSCmd, CD_SCMD_BOOT_CERTIFY, 0, &sCmdSendBuff, 4, sCmdRecvBuff, 4, NULL, NULL) >= 0) {
535 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
540 SignalSema(sCmdSemaId);
545 #ifdef F_sceCdReadSUBQ
550 if (_CdCheckSCmd(CD_SCMD_READ_SUBQ) == 0)
553 if (sceSifCallRpc(&clientSCmd, CD_SCMD_READ_SUBQ, 0, NULL, 0, sCmdRecvBuff, 0x12, NULL, NULL) >= 0) {
554 memcpy(buffer, UNCACHED_SEG(&sCmdRecvBuff[8]), 0x12);
555 *status = *(u32 *)UNCACHED_SEG(&sCmdRecvBuff[4]);
556 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
561 SignalSema(sCmdSemaId);
566 #ifdef F_sceCdForbidDVDP
571 if (_CdCheckSCmd(CD_SCMD_FORBID_DVDP) == 0)
574 if (sceSifCallRpc(&clientSCmd, CD_SCMD_FORBID_DVDP, 0, NULL, 0, sCmdRecvBuff, 8, NULL, NULL) >= 0) {
575 *result = ((u32 *)UNCACHED_SEG(sCmdRecvBuff))[1];
576 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
581 SignalSema(sCmdSemaId);
586 #ifdef F_sceCdAutoAdjustCtrl
591 if (_CdCheckSCmd(CD_SCMD_AUTO_ADJUST_CTRL) == 0)
594 sCmdSendBuff.s32arg = mode;
595 if (sceSifCallRpc(&clientSCmd, CD_SCMD_AUTO_ADJUST_CTRL, 0, &sCmdSendBuff, 4, sCmdRecvBuff, 8, NULL, NULL) >= 0) {
596 *result = ((u32 *)UNCACHED_SEG(sCmdRecvBuff))[1];
597 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
602 SignalSema(sCmdSemaId);
608 int sceCdDecSet(
unsigned char arg1,
unsigned char arg2,
unsigned char shift)
612 if (_CdCheckSCmd(CD_SCMD_DEC_SET) == 0)
615 sCmdSendBuff.decSet.arg1 = arg1;
616 sCmdSendBuff.decSet.arg2 = arg2;
617 sCmdSendBuff.decSet.shift = shift;
619 if (sceSifCallRpc(&clientSCmd, CD_SCMD_DEC_SET, 0, &sCmdSendBuff, 4, sCmdRecvBuff, 16, NULL, NULL) >= 0) {
620 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
625 SignalSema(sCmdSemaId);
630 #ifdef F_sceCdSetHDMode
635 if (_CdCheckSCmd(CD_SCMD_SET_HD_MODE) == 0)
637 sCmdSendBuff.u32arg = mode;
638 if (sceSifCallRpc(&clientSCmd, CD_SCMD_SET_HD_MODE, 0, &sCmdSendBuff, 4, sCmdRecvBuff, 4, NULL, NULL) >= 0) {
639 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
643 SignalSema(sCmdSemaId);
648 #ifdef F_sceCdOpenConfig
653 if (NumBlocks < 0x45) {
654 if (_CdCheckSCmd(CD_SCMD_OPEN_CONFIG) == 0)
657 sCmdSendBuff.u32arg = ((NumBlocks & 0xFF) << 16) | (mode & 0xFF) | ((block & 0xFF) << 8);
658 CdConfigRdWrNumBlocks = NumBlocks;
659 if (sceSifCallRpc(&clientSCmd, CD_SCMD_OPEN_CONFIG, 0, &sCmdSendBuff, 4, sCmdRecvBuff, 8, NULL, NULL) >= 0) {
660 *status = ((u32 *)UNCACHED_SEG(sCmdRecvBuff))[1];
661 result = ((
int *)UNCACHED_SEG(sCmdRecvBuff))[0];
665 SignalSema(sCmdSemaId);
673 #ifdef F_sceCdCloseConfig
678 if (_CdCheckSCmd(CD_SCMD_CLOSE_CONFIG) == 0)
681 if (sceSifCallRpc(&clientSCmd, CD_SCMD_CLOSE_CONFIG, 0, NULL, 0, sCmdRecvBuff, 8, NULL, NULL) >= 0) {
682 *result = ((u32 *)UNCACHED_SEG(sCmdRecvBuff))[1];
683 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
688 SignalSema(sCmdSemaId);
693 #ifdef F_sceCdReadConfig
698 if (_CdCheckSCmd(CD_SCMD_READ_CONFIG) == 0)
701 if (sceSifCallRpc(&clientSCmd, CD_SCMD_READ_CONFIG, 0, NULL, 0, sCmdRecvBuff, 0x408, NULL, NULL) >= 0) {
702 *result = ((
int *)UNCACHED_SEG(sCmdRecvBuff))[1];
703 memcpy(buffer, &((u32 *)UNCACHED_SEG(sCmdRecvBuff))[2], (CdConfigRdWrNumBlocks << 4) - CdConfigRdWrNumBlocks);
704 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
709 SignalSema(sCmdSemaId);
714 #ifdef F_sceCdWriteConfig
719 if (_CdCheckSCmd(CD_SCMD_WRITE_CONFIG) == 0)
722 memcpy(sCmdSendBuff.data, buffer, (CdConfigRdWrNumBlocks << 4) - CdConfigRdWrNumBlocks);
723 if (sceSifCallRpc(&clientSCmd, CD_SCMD_WRITE_CONFIG, 0, &sCmdSendBuff, 0x400, sCmdRecvBuff, 8, NULL, NULL) >= 0) {
724 *result = ((
int *)UNCACHED_SEG(sCmdRecvBuff))[1];
725 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
730 SignalSema(sCmdSemaId);
736 #ifdef F_sceCdReadNVM
741 if (_CdCheckSCmd(CD_SCMD_READ_NVM) == 0)
744 sCmdSendBuff.nvm.address = address;
745 sCmdSendBuff.nvm.value = 0;
746 sCmdSendBuff.nvm.pad = 0;
748 if (sceSifCallRpc(&clientSCmd, CD_SCMD_READ_NVM, 0, &sCmdSendBuff, 8, sCmdRecvBuff, 0x10, NULL, NULL) >= 0) {
749 *data = *(
unsigned short int *)UNCACHED_SEG(&sCmdRecvBuff[8]);
750 *result = *(u8 *)UNCACHED_SEG(&sCmdRecvBuff[10]);
751 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
756 SignalSema(sCmdSemaId);
761 #ifdef F_sceCdWriteNVM
766 if (_CdCheckSCmd(CD_SCMD_WRITE_NVM) == 0)
769 sCmdSendBuff.nvm.address = address;
770 sCmdSendBuff.nvm.value = data;
771 sCmdSendBuff.nvm.pad = 0;
773 if (sceSifCallRpc(&clientSCmd, CD_SCMD_WRITE_NVM, 0, &sCmdSendBuff, 8, sCmdRecvBuff, 0x10, NULL, NULL) >= 0) {
774 *result = *(u8 *)UNCACHED_SEG(&sCmdRecvBuff[10]);
775 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
780 SignalSema(sCmdSemaId);
786 int sceCdRI(
unsigned char *buffer, u32 *result)
790 if (_CdCheckSCmd(CD_SCMD_READ_ILINK_ID) == 0)
793 if (sceSifCallRpc(&clientSCmd, CD_SCMD_READ_ILINK_ID, 0, NULL, 0, sCmdRecvBuff, 16, NULL, NULL) >= 0) {
794 memcpy(buffer, UNCACHED_SEG(&sCmdRecvBuff[8]), 8);
795 *result = *(u32 *)UNCACHED_SEG(&sCmdRecvBuff[4]);
796 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
801 SignalSema(sCmdSemaId);
807 int sceCdWI(
const unsigned char *buffer, u32 *status)
811 if (_CdCheckSCmd(CD_SCMD_WRITE_ILINK_ID) == 0)
814 memcpy(sCmdSendBuff.id, buffer, 8);
815 if (sceSifCallRpc(&clientSCmd, CD_SCMD_WRITE_ILINK_ID, 0, &sCmdSendBuff, 8, sCmdRecvBuff, 8, NULL, NULL) >= 0) {
816 *status = *(u32 *)UNCACHED_SEG(&sCmdRecvBuff[4]);
817 result = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
822 SignalSema(sCmdSemaId);
827 #ifdef F_sceCdReadConsoleID
832 if (_CdCheckSCmd(CD_SCMD_READ_CONSOLE_ID) == 0)
835 if (sceSifCallRpc(&clientSCmd, CD_SCMD_READ_CONSOLE_ID, 0, NULL, 0, sCmdRecvBuff, 16, NULL, NULL) >= 0) {
836 memcpy(buffer, UNCACHED_SEG(&sCmdRecvBuff[8]), 8);
837 *result = *(u32 *)UNCACHED_SEG(&sCmdRecvBuff[4]);
838 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
843 SignalSema(sCmdSemaId);
848 #ifdef F_sceCdWriteConsoleID
853 if (_CdCheckSCmd(CD_SCMD_WRITE_CONSOLE_ID) == 0)
856 memcpy(sCmdSendBuff.id, buffer, 8);
857 if (sceSifCallRpc(&clientSCmd, CD_SCMD_WRITE_CONSOLE_ID, 0, &sCmdSendBuff, 8, sCmdRecvBuff, 8, NULL, NULL) >= 0) {
858 *result = *(u32 *)UNCACHED_SEG(&sCmdRecvBuff[4]);
859 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
864 SignalSema(sCmdSemaId);
870 int sceCdMV(
unsigned char *buffer, u32 *result)
874 if (_CdCheckSCmd(CD_SCMD_READ_MECHACON_VERSION) == 0)
877 if (sceSifCallRpc(&clientSCmd, CD_SCMD_READ_MECHACON_VERSION, 0, NULL, 0, sCmdRecvBuff, 16, NULL, NULL) >= 0) {
879 memcpy(buffer, UNCACHED_SEG(&sCmdRecvBuff[8]), (initVersionCdvdman >= 0x200) ? 4 : 3);
880 *result = *(u32 *)UNCACHED_SEG(&sCmdRecvBuff[4]);
881 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
886 SignalSema(sCmdSemaId);
891 #ifdef F_sceCdCtrlADout
896 if (_CdCheckSCmd(CD_SCMD_CTRL_AD_OUT) == 0)
899 sCmdSendBuff.s32arg = arg1;
900 if (sceSifCallRpc(&clientSCmd, CD_SCMD_CTRL_AD_OUT, 0, &sCmdSendBuff, 4, sCmdRecvBuff, 8, NULL, NULL) >= 0) {
901 *result = *(u32 *)UNCACHED_SEG(&sCmdRecvBuff[4]);
902 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
907 SignalSema(sCmdSemaId);
913 int sceCdRM(
char *buffer, u32 *result)
917 if (_CdCheckSCmd(CD_SCMD_READ_MODEL_NAME) == 0)
920 if (sceSifCallRpc(&clientSCmd, CD_SCMD_READ_MODEL_NAME, 0, NULL, 0, sCmdRecvBuff, 0x18, NULL, NULL) >= 0) {
921 memcpy(buffer, UNCACHED_SEG(&sCmdRecvBuff[8]), 16);
922 *result = *(u32 *)UNCACHED_SEG(&sCmdRecvBuff[4]);
923 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
928 SignalSema(sCmdSemaId);
934 int sceCdWM(
const char *buffer, u32 *result)
938 if (_CdCheckSCmd(CD_SCMD_WRITE_MODEL_NAME) == 0)
941 memcpy(sCmdSendBuff.mname, buffer, 16);
942 if (sceSifCallRpc(&clientSCmd, CD_SCMD_WRITE_MODEL_NAME, 0, &sCmdSendBuff, 0x10, sCmdRecvBuff, 8, NULL, NULL) >= 0) {
943 *result = *(u32 *)UNCACHED_SEG(&sCmdRecvBuff[4]);
944 status = *(
int *)UNCACHED_SEG(sCmdRecvBuff);
949 SignalSema(sCmdSemaId);
954 #ifdef F_sceCdNoticeGameStart
968 *result = (u8)out[0];
976 int _CdSyncS(
int mode)
980 printf(
"S cmd wait\n");
981 while (sceSifCheckStatRpc(&clientSCmd))
986 return sceSifCheckStatRpc(&clientSCmd);