33 #define CD_SERVER_NCMD 0x80000595
37 CDVD_ST_CMD_START = 1,
70 int _CdCheckNCmd(
int cmd);
79 #ifdef F__ncmd_internals
102 u32 cdda_st_buf[64 /
sizeof(u32)] ALIGNED(64);
105 extern int initVersionCdvdfsv;
107 extern int nCmdSemaId;
109 extern u32 readStreamData[5];
110 extern u32 readData[6];
112 extern u32 getTocSendBuff[3];
113 extern u32 _rd_intr_data[64];
114 extern u32 curReadPos;
115 extern u8 tocBuff[2064];
116 extern u8 nCmdRecvBuff[48];
118 extern int streamStatus;
120 extern u32 seekSector;
121 extern u32 cdda_st_buf[64 /
sizeof(u32)];
146 extern void _CdAlignReadBuffer(
void *data);
150 #ifdef F__CdAlignReadBuffer
151 void _CdAlignReadBuffer(
void *data)
153 if (initVersionCdvdfsv > 0x104)
157 if (uncached->size1 && uncached->dest1) {
158 memcpy(uncached->dest1, &uncached->src1, uncached->size1);
161 if (uncached->size2 && uncached->dest2) {
162 memcpy(uncached->dest2, &uncached->src2, uncached->size2);
169 if (uncached->size1 && uncached->dest1) {
170 memcpy(uncached->dest1, &uncached->src1, uncached->size1);
173 if (uncached->size2 && uncached->dest2) {
174 memcpy(uncached->dest2, &uncached->src2, uncached->size2);
178 _CdGenericCallbackFunction((
void *)&CdCallbackNum);
190 if (_CdCheckNCmd(CD_NCMD_READ) == 0)
194 readData[1] = sectors;
195 readData[2] = (u32)buf;
196 readData[3] = (mode->trycount) | (mode->spindlctrl << 8) | (mode->datapattern << 16);
197 readData[4] = (u32)_rd_intr_data;
198 readData[5] = (u32)&curReadPos;
201 if (mode->datapattern == SCECdSecS2328)
202 bufSize = sectors * 2328;
203 else if (mode->datapattern == SCECdSecS2340)
204 bufSize = sectors * 2340;
206 bufSize = sectors * 2048;
209 sceSifWriteBackDCache(buf, bufSize);
210 sceSifWriteBackDCache(&curReadPos,
sizeof(curReadPos));
213 printf(
"call sceCdread cmd\n");
215 CdCallbackNum = CD_NCMD_READ;
218 if (sceSifCallRpc(&clientNCmd, CD_NCMD_READ,
SIF_RPC_M_NOWAIT, readData, 24, NULL, 0, &_CdAlignReadBuffer, _rd_intr_data) < 0) {
221 SignalSema(nCmdSemaId);
226 printf(
"sceCdread end\n");
234 #ifdef F_sceCdReadDVDV
235 int sceCdReadDVDV(u32 lbn, u32 nsectors,
void *buf,
sceCdRMode *rm)
239 if (_CdCheckNCmd(CD_NCMD_DVDREAD) == 0)
243 readData[1] = nsectors;
244 readData[2] = (u32)buf;
246 readData[4] = (u32)_rd_intr_data;
248 sceSifWriteBackDCache(buf, nsectors * 2064);
250 CdCallbackNum = CD_NCMD_DVDREAD;
253 if (sceSifCallRpc(&clientNCmd, CD_NCMD_DVDREAD,
SIF_RPC_M_NOWAIT, readData, 24, NULL, 0, &_CdAlignReadBuffer, _rd_intr_data) < 0) {
256 SignalSema(nCmdSemaId);
266 #ifdef F_sceCdReadCDDA
267 int sceCdReadCDDA(u32 lbn, u32 nsectors,
void *buf,
sceCdRMode *rm)
269 unsigned int sector_size;
273 if (_CdCheckNCmd(CD_NCMD_CDDAREAD) == 0)
277 readData[1] = nsectors;
278 readData[2] = (u32)buf;
280 readData[4] = (u32)_rd_intr_data;
294 sceSifWriteBackDCache(buf, nsectors * sector_size);
296 CdCallbackNum = CD_NCMD_CDDAREAD;
299 if (sceSifCallRpc(&clientNCmd, CD_NCMD_CDDAREAD,
SIF_RPC_M_NOWAIT, readData, 24, NULL, 0, &_CdAlignReadBuffer, _rd_intr_data) < 0) {
302 SignalSema(nCmdSemaId);
317 if (_CdCheckNCmd(CD_NCMD_GETTOC) == 0)
320 getTocSendBuff[0] = (u32)tocBuff;
321 sceSifWriteBackDCache(tocBuff, 2064);
323 if (sceSifCallRpc(&clientNCmd, CD_NCMD_GETTOC, 0, getTocSendBuff, 12, nCmdRecvBuff, 8, NULL, NULL) < 0) {
324 SignalSema(nCmdSemaId);
328 tocPtr = UNCACHED_SEG(tocBuff);
329 tocEnd = tocPtr + 1024;
330 if (*(u32 *)(nCmdRecvBuff + 4)) {
332 memcpy(
toc, tocPtr, 32);
335 }
while (tocPtr < tocEnd);
337 tocEnd = tocPtr + 2048;
340 memcpy(
toc, tocPtr, 32);
343 }
while (tocPtr < tocEnd);
345 memcpy(
toc, tocPtr, 16);
348 SignalSema(nCmdSemaId);
349 return *(
int *)UNCACHED_SEG(nCmdRecvBuff);
358 if (_CdCheckNCmd(CD_NCMD_SEEK) == 0)
363 CdCallbackNum = CD_NCMD_SEEK;
365 if (sceSifCallRpc(&clientNCmd, CD_NCMD_SEEK,
SIF_RPC_M_NOWAIT, &seekSector, 4, NULL, 0, &_CdGenericCallbackFunction, (
void *)&CdCallbackNum) < 0) {
368 SignalSema(nCmdSemaId);
378 #ifdef F_sceCdStandby
383 if (_CdCheckNCmd(CD_NCMD_STANDBY) == 0)
386 CdCallbackNum = CD_NCMD_STANDBY;
388 if (sceSifCallRpc(&clientNCmd, CD_NCMD_STANDBY,
SIF_RPC_M_NOWAIT, NULL, 0, NULL, 0, &_CdGenericCallbackFunction, (
void *)&CdCallbackNum) < 0) {
391 SignalSema(nCmdSemaId);
406 if (_CdCheckNCmd(CD_NCMD_STOP) == 0)
409 CdCallbackNum = CD_NCMD_STOP;
411 if (sceSifCallRpc(&clientNCmd, CD_NCMD_STOP,
SIF_RPC_M_NOWAIT, NULL, 0, NULL, 0, &_CdGenericCallbackFunction, (
void *)&CdCallbackNum) < 0) {
414 SignalSema(nCmdSemaId);
429 if (_CdCheckNCmd(CD_NCMD_PAUSE) == 0)
432 CdCallbackNum = CD_NCMD_PAUSE;
434 if (sceSifCallRpc(&clientNCmd, CD_NCMD_PAUSE,
SIF_RPC_M_NOWAIT, NULL, 0, NULL, 0, &_CdGenericCallbackFunction, (
void *)&CdCallbackNum) < 0) {
437 SignalSema(nCmdSemaId);
447 #ifdef F_sceCdApplyNCmd
452 if (_CdCheckNCmd(CD_NCMD_NCMD) == 0)
455 nCmdSendBuff.ncmd.cmdNum = cmdNum;
456 nCmdSendBuff.ncmd.inBuffSize = inBuffSize;
457 memset(nCmdSendBuff.ncmd.inBuff, 0, 16);
459 memcpy(nCmdSendBuff.ncmd.inBuff, inBuff, inBuffSize);
461 if (sceSifCallRpc(&clientNCmd, CD_NCMD_NCMD, 0, &nCmdSendBuff, 20, nCmdRecvBuff, 16, NULL, NULL) < 0) {
462 SignalSema(nCmdSemaId);
466 SignalSema(nCmdSemaId);
467 return *(
int *)UNCACHED_SEG(nCmdRecvBuff);
471 #ifdef F_sceCdReadIOPMem
476 if (_CdCheckNCmd(CD_NCMD_READIOPMEM) == 0)
480 readData[1] = sectors;
481 readData[2] = (u32)buf;
482 readData[3] = (mode->trycount) | (mode->spindlctrl << 8) | (mode->datapattern << 16);
483 readData[4] = (u32)_rd_intr_data;
484 readData[5] = (u32)&curReadPos;
486 CdCallbackNum = CD_NCMD_READIOPMEM;
488 if (sceSifCallRpc(&clientNCmd, CD_NCMD_READIOPMEM,
SIF_RPC_M_NOWAIT, readData, 24, NULL, 0, &_CdGenericCallbackFunction, (
void *)&CdCallbackNum) < 0) {
491 SignalSema(nCmdSemaId);
496 printf(
"sceCdread end\n");
504 #ifdef F_sceCdNCmdDiskReady
507 if (_CdCheckNCmd(CD_NCMD_DISKREADY) == 0)
510 if (sceSifCallRpc(&clientNCmd, CD_NCMD_DISKREADY, 0, NULL, 0, &nCmdRecvBuff, 4, NULL, NULL) < 0) {
511 SignalSema(nCmdSemaId);
515 SignalSema(nCmdSemaId);
516 return *(
int *)UNCACHED_SEG(nCmdRecvBuff);
520 #ifdef F_sceCdReadChain
523 int chainNum, i, sectorType;
531 printf(
"call sceCdReadChain cmd 0\n");
533 for (chainNum = 0; chainNum < 64; chainNum++) {
534 if (readChain[chainNum].lbn == 0xFFFFFFFF ||
535 readChain[chainNum].sectors == 0xFFFFFFFF || readChain[chainNum].buffer == 0xFFFFFFFF)
537 readChainData[chainNum].
lbn = readChain[chainNum].
lbn;
539 readChainData[chainNum].
buffer = readChain[chainNum].
buffer;
542 readChainData[chainNum].
lbn = 0xFFFFFFFF;
543 readChainData[chainNum].
sectors = 0xFFFFFFFF;
544 readChainData[chainNum].
buffer = 0xFFFFFFFF;
547 readChainData[65].
lbn = (mode->trycount) | (mode->spindlctrl << 8) | (mode->datapattern << 16);
548 readChainData[65].
sectors = (u32)&curReadPos;
550 if (mode->datapattern == SCECdSecS2328)
552 else if (mode->datapattern == SCECdSecS2340)
559 printf(
"call sceCdReadChain cmd 1\n");
561 for (i = 0; i < chainNum; i++) {
563 if ((readChainData[i].buffer & 1) == 0) {
565 printf(
"sceSifWriteBackDCache addr= 0x%08x size= %d, sector= %d\n",
566 readChainData[i].buffer, readChainData[i].sectors * sectorType,
567 readChainData[i].lbn);
568 sceSifWriteBackDCache((
void *)(readChainData[i].buffer),
569 readChainData[i].sectors * sectorType);
573 sceSifWriteBackDCache(&curReadPos, 4);
576 printf(
"call sceCdReadChain cmd 2\n");
582 SignalSema(nCmdSemaId);
587 printf(
"sceCdread end\n");
595 #ifdef F_sceCdGetReadPos
598 if (CdCallbackNum == CD_NCMD_READ) {
599 return *(u32 *)UNCACHED_SEG(curReadPos);
607 #ifdef F_sceCdStStart
611 return sceCdStream(lbn, 0, NULL, CDVD_ST_CMD_START, mode);
616 int sceCdStRead(u32 sectorType, u32 *buffer, u32 mode, u32 *error)
622 printf(
"sceCdStRead call read size=%d mode=%d\n", sectorType, mode);
623 if (streamStatus == 0)
625 sceSifWriteBackDCache(buffer, sectorType * 2048);
629 ret = sceCdStream(0, sectorType, buffer, CDVD_ST_CMD_READ, &dummyMode);
634 for (i = 0; (u32)i < sectorType;) {
635 int err, sectorReadSize;
637 ret = sceCdStream(0, sectorType - i, (buffer + (i * 2048)), CDVD_ST_CMD_READ, &dummyMode);
638 sectorReadSize = ret & 0xFFFF;
645 printf(
"sceCdStRead BLK Read cur_size= %d read_size= %d req_size= %d err 0x%x\n", i,
646 sectorReadSize, sectorType, err);
648 if (sectorReadSize == 0)
654 printf(
"sceCdStRead BLK Read Ended\n");
663 return sceCdStream(0, 0, NULL, CDVD_ST_CMD_STOP, &dummyMode);
670 return sceCdStream(lbn, 0, NULL, CDVD_ST_CMD_SEEK, &dummyMode);
675 int sceCdStInit(u32 buffSize, u32 numBuffers,
void *buf)
678 return sceCdStream(buffSize, numBuffers, buf, CDVD_ST_CMD_INIT, &dummyMode);
686 return sceCdStream(0, 0, NULL, CDVD_ST_CMD_STAT, &dummyMode);
690 #ifdef F_sceCdStPause
694 return sceCdStream(0, 0, NULL, CDVD_ST_CMD_PAUSE, &dummyMode);
698 #ifdef F_sceCdStResume
702 return sceCdStream(0, 0, NULL, CDVD_ST_CMD_RESUME, &dummyMode);
710 if (_CdCheckNCmd(15) == 0)
714 printf(
"call sceCdreadstm call\n");
716 readStreamData[0] = lbn;
717 readStreamData[1] = nsectors;
718 readStreamData[2] = (u32)buf;
719 readStreamData[3] = cmd;
724 printf(
"call sceCdreadstm cmd\n");
726 if (sceSifCallRpc(&clientNCmd, CD_NCMD_STREAM, 0, readStreamData, 20, nCmdRecvBuff, 4, NULL, NULL) < 0) {
727 SignalSema(nCmdSemaId);
732 printf(
"sceCdread end\n");
733 SignalSema(nCmdSemaId);
734 return *(
int *)UNCACHED_SEG(nCmdRecvBuff);
738 #ifdef F_sceCdCddaStream
741 unsigned int sector_size;
743 if (_CdCheckNCmd(17) == 0)
744 return cmd < CDVD_ST_CMD_INIT ? -1 : 0;
751 readStreamData[0] = lbn;
752 readStreamData[1] = nsectors * sector_size;
753 readStreamData[2] = (u32)buf;
754 readStreamData[3] = cmd;
757 if (cmd == CDVD_ST_CMD_INIT)
758 readStreamData[2] = (u32)cdda_st_buf;
762 if (sceSifCallRpc(&clientNCmd, CD_NCMD_CDDASTREAM, 0, readStreamData, 20, nCmdRecvBuff, 4, NULL, NULL) < 0) {
763 SignalSema(nCmdSemaId);
764 return cmd < CDVD_ST_CMD_INIT ? -1 : 0;
767 SignalSema(nCmdSemaId);
768 return *(
int *)UNCACHED_SEG(nCmdRecvBuff);
778 printf(
"N cmd wait\n");
781 while (cbSema || sceSifCheckStatRpc(&clientNCmd))
786 if (cbSema || sceSifCheckStatRpc(&clientNCmd))
798 #ifdef F__CdCheckNCmd
799 int _CdCheckNCmd(
int cmd)
802 if (PollSema(nCmdSemaId) != nCmdSemaId) {
804 printf(
"Ncmd fail sema cmd:%d keep_cmd:%d\n", cmd, nCmdNum);
810 SignalSema(nCmdSemaId);
816 memset(&clientNCmd, 0,
sizeof(clientNCmd));
818 if (clientNCmd.server)
824 printf(
"Libcdvd bind err N CMD\n");
826 if (clientNCmd.server != 0)
831 if (!initVersionCdvdfsv)
838 uncached = UNCACHED_SEG(_rd_intr_data);
842 readData[2] = (u32)NULL;
844 readData[4] = (u32)_rd_intr_data;
846 if (sceSifCallRpc(&clientNCmd, CD_NCMD_CDDAREAD, 0, readData,
sizeof(readData), NULL, 0, 0, 0) < 0)
850 if (uncached->size1 || uncached->dest1 || uncached->size2 || uncached->dest2)
853 for (i = 0; i <
sizeof(*uncached); i += 1)
854 ((u8 *)uncached)[i] ^= 0xFF;
856 if (sceSifCallRpc(&clientNCmd, CD_NCMD_CDDAREAD, 0, readData,
sizeof(readData), NULL, 0, 0, 0) < 0)
859 if (uncached->size1 || uncached->dest1 || uncached->size2 || uncached->dest2)
863 for (i = 0; i <
sizeof(*uncached); i += 1)
864 eq_count += (((u8 *)uncached)[i] == ((u8 *)&tmpbuf)[i]) ? 1 : 0;
871 #ifdef F_sceCdReadKey
872 int
sceCdReadKey(unsigned char arg1, unsigned char arg2, unsigned int command, unsigned char *key)
876 if (_CdCheckNCmd(CD_NCMD_READ_KEY) == 0)
879 nCmdSendBuff.readKey.arg1 = arg1;
880 nCmdSendBuff.readKey.arg2 = arg2;
881 nCmdSendBuff.readKey.command = command;
883 if (sceSifCallRpc(&clientNCmd, CD_NCMD_READ_KEY, 0, &nCmdSendBuff, 0xC, nCmdRecvBuff, 0x18, NULL, NULL) >= 0) {
884 memcpy(key, UNCACHED_SEG(&nCmdRecvBuff[4]), 16);
887 SignalSema(nCmdSemaId);