32 #define CD_SERVER_NCMD 0x80000595
36 CDVD_ST_CMD_START = 1,
69 int _CdCheckNCmd(
int cmd);
78 #ifdef F__ncmd_internals
100 int streamStatus = 0;
103 u32 cdda_st_buf[64 /
sizeof(u32)] ALIGNED(64);
106 extern int initVersionCdvdfsv;
109 extern int nCmdSemaId;
111 extern u32 readStreamData[5];
112 extern u32 readData[6];
114 extern u32 getTocSendBuff[3];
115 extern u32 _rd_intr_data[64];
116 extern u32 curReadPos;
117 extern u8 tocBuff[2064];
118 extern u8 nCmdRecvBuff[48];
120 extern int streamStatus;
122 extern u32 seekSector;
123 extern u32 cdda_st_buf[64 /
sizeof(u32)];
148 extern void _CdAlignReadBuffer(
void *data);
152 #ifdef F__CdAlignReadBuffer
153 void _CdAlignReadBuffer(
void *data)
155 if (initVersionCdvdfsv > 0x104)
159 if (uncached->size1 && uncached->dest1) {
160 memcpy(uncached->dest1, &uncached->src1, uncached->size1);
163 if (uncached->size2 && uncached->dest2) {
164 memcpy(uncached->dest2, &uncached->src2, uncached->size2);
171 if (uncached->size1 && uncached->dest1) {
172 memcpy(uncached->dest1, &uncached->src1, uncached->size1);
175 if (uncached->size2 && uncached->dest2) {
176 memcpy(uncached->dest2, &uncached->src2, uncached->size2);
180 _CdGenericCallbackFunction((
void *)&CdCallbackNum);
192 if (_CdCheckNCmd(CD_NCMD_READ) == 0)
196 readData[1] = sectors;
197 readData[2] = (u32)buf;
198 readData[3] = (mode->trycount) | (mode->spindlctrl << 8) | (mode->datapattern << 16);
199 readData[4] = (u32)_rd_intr_data;
200 readData[5] = (u32)&curReadPos;
203 if (mode->datapattern == SCECdSecS2328)
204 bufSize = sectors * 2328;
205 else if (mode->datapattern == SCECdSecS2340)
206 bufSize = sectors * 2340;
208 bufSize = sectors * 2048;
211 sceSifWriteBackDCache(buf, bufSize);
212 sceSifWriteBackDCache(&curReadPos,
sizeof(curReadPos));
215 printf(
"call sceCdread cmd\n");
217 CdCallbackNum = CD_NCMD_READ;
220 if (sceSifCallRpc(&clientNCmd, CD_NCMD_READ,
SIF_RPC_M_NOWAIT, readData, 24, NULL, 0, &_CdAlignReadBuffer, _rd_intr_data) < 0) {
223 SignalSema(nCmdSemaId);
228 printf(
"sceCdread end\n");
236 #ifdef F_sceCdReadDVDV
237 int sceCdReadDVDV(u32 lbn, u32 nsectors,
void *buf,
sceCdRMode *rm)
241 if (_CdCheckNCmd(CD_NCMD_DVDREAD) == 0)
245 readData[1] = nsectors;
246 readData[2] = (u32)buf;
248 readData[4] = (u32)_rd_intr_data;
250 sceSifWriteBackDCache(buf, nsectors * 2064);
252 CdCallbackNum = CD_NCMD_DVDREAD;
255 if (sceSifCallRpc(&clientNCmd, CD_NCMD_DVDREAD,
SIF_RPC_M_NOWAIT, readData, 24, NULL, 0, &_CdAlignReadBuffer, _rd_intr_data) < 0) {
258 SignalSema(nCmdSemaId);
268 #ifdef F_sceCdReadCDDA
269 int sceCdReadCDDA(u32 lbn, u32 nsectors,
void *buf,
sceCdRMode *rm)
271 unsigned int sector_size;
275 if (_CdCheckNCmd(CD_NCMD_CDDAREAD) == 0)
279 readData[1] = nsectors;
280 readData[2] = (u32)buf;
282 readData[4] = (u32)_rd_intr_data;
296 sceSifWriteBackDCache(buf, nsectors * sector_size);
298 CdCallbackNum = CD_NCMD_CDDAREAD;
301 if (sceSifCallRpc(&clientNCmd, CD_NCMD_CDDAREAD,
SIF_RPC_M_NOWAIT, readData, 24, NULL, 0, &_CdAlignReadBuffer, _rd_intr_data) < 0) {
304 SignalSema(nCmdSemaId);
319 if (_CdCheckNCmd(CD_NCMD_GETTOC) == 0)
322 getTocSendBuff[0] = (u32)tocBuff;
323 sceSifWriteBackDCache(tocBuff, 2064);
325 if (sceSifCallRpc(&clientNCmd, CD_NCMD_GETTOC, 0, getTocSendBuff, 12, nCmdRecvBuff, 8, NULL, NULL) < 0) {
326 SignalSema(nCmdSemaId);
330 tocPtr = UNCACHED_SEG(tocBuff);
331 tocEnd = tocPtr + 1024;
332 if (*(u32 *)(nCmdRecvBuff + 4)) {
334 memcpy(
toc, tocPtr, 32);
337 }
while (tocPtr < tocEnd);
339 tocEnd = tocPtr + 2048;
342 memcpy(
toc, tocPtr, 32);
345 }
while (tocPtr < tocEnd);
347 memcpy(
toc, tocPtr, 16);
350 SignalSema(nCmdSemaId);
351 return *(
int *)UNCACHED_SEG(nCmdRecvBuff);
360 if (_CdCheckNCmd(CD_NCMD_SEEK) == 0)
365 CdCallbackNum = CD_NCMD_SEEK;
367 if (sceSifCallRpc(&clientNCmd, CD_NCMD_SEEK,
SIF_RPC_M_NOWAIT, &seekSector, 4, NULL, 0, &_CdGenericCallbackFunction, (
void *)&CdCallbackNum) < 0) {
370 SignalSema(nCmdSemaId);
380 #ifdef F_sceCdStandby
385 if (_CdCheckNCmd(CD_NCMD_STANDBY) == 0)
388 CdCallbackNum = CD_NCMD_STANDBY;
390 if (sceSifCallRpc(&clientNCmd, CD_NCMD_STANDBY,
SIF_RPC_M_NOWAIT, NULL, 0, NULL, 0, &_CdGenericCallbackFunction, (
void *)&CdCallbackNum) < 0) {
393 SignalSema(nCmdSemaId);
408 if (_CdCheckNCmd(CD_NCMD_STOP) == 0)
411 CdCallbackNum = CD_NCMD_STOP;
413 if (sceSifCallRpc(&clientNCmd, CD_NCMD_STOP,
SIF_RPC_M_NOWAIT, NULL, 0, NULL, 0, &_CdGenericCallbackFunction, (
void *)&CdCallbackNum) < 0) {
416 SignalSema(nCmdSemaId);
431 if (_CdCheckNCmd(CD_NCMD_PAUSE) == 0)
434 CdCallbackNum = CD_NCMD_PAUSE;
436 if (sceSifCallRpc(&clientNCmd, CD_NCMD_PAUSE,
SIF_RPC_M_NOWAIT, NULL, 0, NULL, 0, &_CdGenericCallbackFunction, (
void *)&CdCallbackNum) < 0) {
439 SignalSema(nCmdSemaId);
449 #ifdef F_sceCdApplyNCmd
454 if (_CdCheckNCmd(CD_NCMD_NCMD) == 0)
457 nCmdSendBuff.ncmd.cmdNum = cmdNum;
458 nCmdSendBuff.ncmd.inBuffSize = inBuffSize;
459 memset(nCmdSendBuff.ncmd.inBuff, 0, 16);
461 memcpy(nCmdSendBuff.ncmd.inBuff, inBuff, inBuffSize);
463 if (sceSifCallRpc(&clientNCmd, CD_NCMD_NCMD, 0, &nCmdSendBuff, 20, nCmdRecvBuff, 16, NULL, NULL) < 0) {
464 SignalSema(nCmdSemaId);
468 SignalSema(nCmdSemaId);
469 return *(
int *)UNCACHED_SEG(nCmdRecvBuff);
473 #ifdef F_sceCdReadIOPMem
478 if (_CdCheckNCmd(CD_NCMD_READIOPMEM) == 0)
482 readData[1] = sectors;
483 readData[2] = (u32)buf;
484 readData[3] = (mode->trycount) | (mode->spindlctrl << 8) | (mode->datapattern << 16);
485 readData[4] = (u32)_rd_intr_data;
486 readData[5] = (u32)&curReadPos;
488 CdCallbackNum = CD_NCMD_READIOPMEM;
490 if (sceSifCallRpc(&clientNCmd, CD_NCMD_READIOPMEM,
SIF_RPC_M_NOWAIT, readData, 24, NULL, 0, &_CdGenericCallbackFunction, (
void *)&CdCallbackNum) < 0) {
493 SignalSema(nCmdSemaId);
498 printf(
"sceCdread end\n");
506 #ifdef F_sceCdNCmdDiskReady
509 if (_CdCheckNCmd(CD_NCMD_DISKREADY) == 0)
512 if (sceSifCallRpc(&clientNCmd, CD_NCMD_DISKREADY, 0, NULL, 0, &nCmdRecvBuff, 4, NULL, NULL) < 0) {
513 SignalSema(nCmdSemaId);
517 SignalSema(nCmdSemaId);
518 return *(
int *)UNCACHED_SEG(nCmdRecvBuff);
522 #ifdef F_sceCdReadChain
525 int chainNum, i, sectorType;
533 printf(
"call sceCdReadChain cmd 0\n");
535 for (chainNum = 0; chainNum < 64; chainNum++) {
536 if (readChain[chainNum].lbn == 0xFFFFFFFF ||
537 readChain[chainNum].sectors == 0xFFFFFFFF || readChain[chainNum].buffer == 0xFFFFFFFF)
539 readChainData[chainNum].
lbn = readChain[chainNum].
lbn;
541 readChainData[chainNum].
buffer = readChain[chainNum].
buffer;
544 readChainData[chainNum].
lbn = 0xFFFFFFFF;
545 readChainData[chainNum].
sectors = 0xFFFFFFFF;
546 readChainData[chainNum].
buffer = 0xFFFFFFFF;
549 readChainData[65].
lbn = (mode->trycount) | (mode->spindlctrl << 8) | (mode->datapattern << 16);
550 readChainData[65].
sectors = (u32)&curReadPos;
552 if (mode->datapattern == SCECdSecS2328)
554 else if (mode->datapattern == SCECdSecS2340)
561 printf(
"call sceCdReadChain cmd 1\n");
563 for (i = 0; i < chainNum; i++) {
565 if ((readChainData[i].buffer & 1) == 0) {
567 printf(
"sceSifWriteBackDCache addr= 0x%08x size= %d, sector= %d\n",
568 readChainData[i].buffer, readChainData[i].sectors * sectorType,
569 readChainData[i].lbn);
570 sceSifWriteBackDCache((
void *)(readChainData[i].buffer),
571 readChainData[i].sectors * sectorType);
575 sceSifWriteBackDCache(&curReadPos, 4);
578 printf(
"call sceCdReadChain cmd 2\n");
584 SignalSema(nCmdSemaId);
589 printf(
"sceCdread end\n");
597 #ifdef F_sceCdGetReadPos
600 if (CdCallbackNum == CD_NCMD_READ) {
601 return *(u32 *)UNCACHED_SEG(curReadPos);
609 #ifdef F_sceCdStStart
613 return sceCdStream(lbn, 0, NULL, CDVD_ST_CMD_START, mode);
618 int sceCdStRead(u32 sectorType, u32 *buffer, u32 mode, u32 *error)
624 printf(
"sceCdStRead call read size=%d mode=%d\n", sectorType, mode);
625 if (streamStatus == 0)
627 sceSifWriteBackDCache(buffer, sectorType * 2048);
631 ret = sceCdStream(0, sectorType, buffer, CDVD_ST_CMD_READ, &dummyMode);
636 for (i = 0; (u32)i < sectorType;) {
637 int err, sectorReadSize;
639 ret = sceCdStream(0, sectorType - i, (buffer + (i * 2048)), CDVD_ST_CMD_READ, &dummyMode);
640 sectorReadSize = ret & 0xFFFF;
647 printf(
"sceCdStRead BLK Read cur_size= %d read_size= %d req_size= %d err 0x%x\n", i,
648 sectorReadSize, sectorType, err);
650 if (sectorReadSize == 0)
656 printf(
"sceCdStRead BLK Read Ended\n");
665 return sceCdStream(0, 0, NULL, CDVD_ST_CMD_STOP, &dummyMode);
672 return sceCdStream(lbn, 0, NULL, CDVD_ST_CMD_SEEK, &dummyMode);
677 int sceCdStInit(u32 buffSize, u32 numBuffers,
void *buf)
680 return sceCdStream(buffSize, numBuffers, buf, CDVD_ST_CMD_INIT, &dummyMode);
688 return sceCdStream(0, 0, NULL, CDVD_ST_CMD_STAT, &dummyMode);
692 #ifdef F_sceCdStPause
696 return sceCdStream(0, 0, NULL, CDVD_ST_CMD_PAUSE, &dummyMode);
700 #ifdef F_sceCdStResume
704 return sceCdStream(0, 0, NULL, CDVD_ST_CMD_RESUME, &dummyMode);
712 if (_CdCheckNCmd(15) == 0)
716 printf(
"call sceCdreadstm call\n");
718 readStreamData[0] = lbn;
719 readStreamData[1] = nsectors;
720 readStreamData[2] = (u32)buf;
721 readStreamData[3] = cmd;
726 printf(
"call sceCdreadstm cmd\n");
728 if (sceSifCallRpc(&clientNCmd, CD_NCMD_STREAM, 0, readStreamData, 20, nCmdRecvBuff, 4, NULL, NULL) < 0) {
729 SignalSema(nCmdSemaId);
734 printf(
"sceCdread end\n");
735 SignalSema(nCmdSemaId);
736 return *(
int *)UNCACHED_SEG(nCmdRecvBuff);
740 #ifdef F_sceCdCddaStream
743 unsigned int sector_size;
745 if (_CdCheckNCmd(17) == 0)
746 return cmd < CDVD_ST_CMD_INIT ? -1 : 0;
753 readStreamData[0] = lbn;
754 readStreamData[1] = nsectors * sector_size;
755 readStreamData[2] = (u32)buf;
756 readStreamData[3] = cmd;
759 if (cmd == CDVD_ST_CMD_INIT)
760 readStreamData[2] = (u32)cdda_st_buf;
764 if (sceSifCallRpc(&clientNCmd, CD_NCMD_CDDASTREAM, 0, readStreamData, 20, nCmdRecvBuff, 4, NULL, NULL) < 0) {
765 SignalSema(nCmdSemaId);
766 return cmd < CDVD_ST_CMD_INIT ? -1 : 0;
769 SignalSema(nCmdSemaId);
770 return *(
int *)UNCACHED_SEG(nCmdRecvBuff);
780 printf(
"N cmd wait\n");
783 while (cbSema || sceSifCheckStatRpc(&clientNCmd))
788 if (cbSema || sceSifCheckStatRpc(&clientNCmd))
800 #ifdef F__CdCheckNCmd
801 int _CdCheckNCmd(
int cmd)
804 if (PollSema(nCmdSemaId) != nCmdSemaId) {
806 printf(
"Ncmd fail sema cmd:%d keep_cmd:%d\n", cmd, nCmdNum);
811 ReferThreadStatus(CdThreadId, &CdThreadParam);
813 SignalSema(nCmdSemaId);
825 printf(
"Libcdvd bind err N CMD\n");
827 if (clientNCmd.server != 0)
832 if (!initVersionCdvdfsv)
839 uncached = UNCACHED_SEG(_rd_intr_data);
843 readData[2] = (u32)NULL;
845 readData[4] = (u32)_rd_intr_data;
847 if (sceSifCallRpc(&clientNCmd, CD_NCMD_CDDAREAD, 0, readData,
sizeof(readData), NULL, 0, 0, 0) < 0)
851 if (uncached->size1 || uncached->dest1 || uncached->size2 || uncached->dest2)
854 for (i = 0; i <
sizeof(*uncached); i += 1)
855 ((u8 *)uncached)[i] ^= 0xFF;
857 if (sceSifCallRpc(&clientNCmd, CD_NCMD_CDDAREAD, 0, readData,
sizeof(readData), NULL, 0, 0, 0) < 0)
860 if (uncached->size1 || uncached->dest1 || uncached->size2 || uncached->dest2)
864 for (i = 0; i <
sizeof(*uncached); i += 1)
865 eq_count += (((u8 *)uncached)[i] == ((u8 *)&tmpbuf)[i]) ? 1 : 0;
874 #ifdef F_sceCdReadKey
875 int
sceCdReadKey(unsigned char arg1, unsigned char arg2, unsigned int command, unsigned char *key)
879 if (_CdCheckNCmd(CD_NCMD_READ_KEY) == 0)
882 nCmdSendBuff.readKey.arg1 = arg1;
883 nCmdSendBuff.readKey.arg2 = arg2;
884 nCmdSendBuff.readKey.command = command;
886 if (sceSifCallRpc(&clientNCmd, CD_NCMD_READ_KEY, 0, &nCmdSendBuff, 0xC, nCmdRecvBuff, 0x18, NULL, NULL) >= 0) {
887 memcpy(key, UNCACHED_SEG(&nCmdRecvBuff[4]), 16);
890 SignalSema(nCmdSemaId);