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;
108 extern int nCmdSemaId;
110 extern u32 readStreamData[5];
111 extern u32 readData[6];
113 extern u32 getTocSendBuff[3];
114 extern u32 _rd_intr_data[64];
115 extern u32 curReadPos;
116 extern u8 tocBuff[2064];
117 extern u8 nCmdRecvBuff[48];
119 extern int streamStatus;
121 extern u32 seekSector;
122 extern u32 cdda_st_buf[64 /
sizeof(u32)];
147 extern void _CdAlignReadBuffer(
void *data);
151 #ifdef F__CdAlignReadBuffer
152 void _CdAlignReadBuffer(
void *data)
154 if (initVersionCdvdfsv > 0x104)
158 if (uncached->size1 && uncached->dest1) {
159 memcpy(uncached->dest1, &uncached->src1, uncached->size1);
162 if (uncached->size2 && uncached->dest2) {
163 memcpy(uncached->dest2, &uncached->src2, uncached->size2);
170 if (uncached->size1 && uncached->dest1) {
171 memcpy(uncached->dest1, &uncached->src1, uncached->size1);
174 if (uncached->size2 && uncached->dest2) {
175 memcpy(uncached->dest2, &uncached->src2, uncached->size2);
179 _CdGenericCallbackFunction((
void *)&CdCallbackNum);
191 if (_CdCheckNCmd(CD_NCMD_READ) == 0)
195 readData[1] = sectors;
196 readData[2] = (u32)buf;
197 readData[3] = (mode->trycount) | (mode->spindlctrl << 8) | (mode->datapattern << 16);
198 readData[4] = (u32)_rd_intr_data;
199 readData[5] = (u32)&curReadPos;
202 if (mode->datapattern == SCECdSecS2328)
203 bufSize = sectors * 2328;
204 else if (mode->datapattern == SCECdSecS2340)
205 bufSize = sectors * 2340;
207 bufSize = sectors * 2048;
210 sceSifWriteBackDCache(buf, bufSize);
211 sceSifWriteBackDCache(&curReadPos,
sizeof(curReadPos));
214 printf(
"call sceCdread cmd\n");
216 CdCallbackNum = CD_NCMD_READ;
219 if (sceSifCallRpc(&clientNCmd, CD_NCMD_READ,
SIF_RPC_M_NOWAIT, readData, 24, NULL, 0, &_CdAlignReadBuffer, _rd_intr_data) < 0) {
222 SignalSema(nCmdSemaId);
227 printf(
"sceCdread end\n");
235 #ifdef F_sceCdReadDVDV
236 int sceCdReadDVDV(u32 lbn, u32 nsectors,
void *buf,
sceCdRMode *rm)
240 if (_CdCheckNCmd(CD_NCMD_DVDREAD) == 0)
244 readData[1] = nsectors;
245 readData[2] = (u32)buf;
247 readData[4] = (u32)_rd_intr_data;
249 sceSifWriteBackDCache(buf, nsectors * 2064);
251 CdCallbackNum = CD_NCMD_DVDREAD;
254 if (sceSifCallRpc(&clientNCmd, CD_NCMD_DVDREAD,
SIF_RPC_M_NOWAIT, readData, 24, NULL, 0, &_CdAlignReadBuffer, _rd_intr_data) < 0) {
257 SignalSema(nCmdSemaId);
267 #ifdef F_sceCdReadCDDA
268 int sceCdReadCDDA(u32 lbn, u32 nsectors,
void *buf,
sceCdRMode *rm)
270 unsigned int sector_size;
274 if (_CdCheckNCmd(CD_NCMD_CDDAREAD) == 0)
278 readData[1] = nsectors;
279 readData[2] = (u32)buf;
281 readData[4] = (u32)_rd_intr_data;
295 sceSifWriteBackDCache(buf, nsectors * sector_size);
297 CdCallbackNum = CD_NCMD_CDDAREAD;
300 if (sceSifCallRpc(&clientNCmd, CD_NCMD_CDDAREAD,
SIF_RPC_M_NOWAIT, readData, 24, NULL, 0, &_CdAlignReadBuffer, _rd_intr_data) < 0) {
303 SignalSema(nCmdSemaId);
318 if (_CdCheckNCmd(CD_NCMD_GETTOC) == 0)
321 getTocSendBuff[0] = (u32)tocBuff;
322 sceSifWriteBackDCache(tocBuff, 2064);
324 if (sceSifCallRpc(&clientNCmd, CD_NCMD_GETTOC, 0, getTocSendBuff, 12, nCmdRecvBuff, 8, NULL, NULL) < 0) {
325 SignalSema(nCmdSemaId);
329 tocPtr = UNCACHED_SEG(tocBuff);
330 tocEnd = tocPtr + 1024;
331 if (*(u32 *)(nCmdRecvBuff + 4)) {
333 memcpy(
toc, tocPtr, 32);
336 }
while (tocPtr < tocEnd);
338 tocEnd = tocPtr + 2048;
341 memcpy(
toc, tocPtr, 32);
344 }
while (tocPtr < tocEnd);
346 memcpy(
toc, tocPtr, 16);
349 SignalSema(nCmdSemaId);
350 return *(
int *)UNCACHED_SEG(nCmdRecvBuff);
359 if (_CdCheckNCmd(CD_NCMD_SEEK) == 0)
364 CdCallbackNum = CD_NCMD_SEEK;
366 if (sceSifCallRpc(&clientNCmd, CD_NCMD_SEEK,
SIF_RPC_M_NOWAIT, &seekSector, 4, NULL, 0, &_CdGenericCallbackFunction, (
void *)&CdCallbackNum) < 0) {
369 SignalSema(nCmdSemaId);
379 #ifdef F_sceCdStandby
384 if (_CdCheckNCmd(CD_NCMD_STANDBY) == 0)
387 CdCallbackNum = CD_NCMD_STANDBY;
389 if (sceSifCallRpc(&clientNCmd, CD_NCMD_STANDBY,
SIF_RPC_M_NOWAIT, NULL, 0, NULL, 0, &_CdGenericCallbackFunction, (
void *)&CdCallbackNum) < 0) {
392 SignalSema(nCmdSemaId);
407 if (_CdCheckNCmd(CD_NCMD_STOP) == 0)
410 CdCallbackNum = CD_NCMD_STOP;
412 if (sceSifCallRpc(&clientNCmd, CD_NCMD_STOP,
SIF_RPC_M_NOWAIT, NULL, 0, NULL, 0, &_CdGenericCallbackFunction, (
void *)&CdCallbackNum) < 0) {
415 SignalSema(nCmdSemaId);
430 if (_CdCheckNCmd(CD_NCMD_PAUSE) == 0)
433 CdCallbackNum = CD_NCMD_PAUSE;
435 if (sceSifCallRpc(&clientNCmd, CD_NCMD_PAUSE,
SIF_RPC_M_NOWAIT, NULL, 0, NULL, 0, &_CdGenericCallbackFunction, (
void *)&CdCallbackNum) < 0) {
438 SignalSema(nCmdSemaId);
448 #ifdef F_sceCdApplyNCmd
453 if (_CdCheckNCmd(CD_NCMD_NCMD) == 0)
456 nCmdSendBuff.ncmd.cmdNum = cmdNum;
457 nCmdSendBuff.ncmd.inBuffSize = inBuffSize;
458 memset(nCmdSendBuff.ncmd.inBuff, 0, 16);
460 memcpy(nCmdSendBuff.ncmd.inBuff, inBuff, inBuffSize);
462 if (sceSifCallRpc(&clientNCmd, CD_NCMD_NCMD, 0, &nCmdSendBuff, 20, nCmdRecvBuff, 16, NULL, NULL) < 0) {
463 SignalSema(nCmdSemaId);
467 SignalSema(nCmdSemaId);
468 return *(
int *)UNCACHED_SEG(nCmdRecvBuff);
472 #ifdef F_sceCdReadIOPMem
477 if (_CdCheckNCmd(CD_NCMD_READIOPMEM) == 0)
481 readData[1] = sectors;
482 readData[2] = (u32)buf;
483 readData[3] = (mode->trycount) | (mode->spindlctrl << 8) | (mode->datapattern << 16);
484 readData[4] = (u32)_rd_intr_data;
485 readData[5] = (u32)&curReadPos;
487 CdCallbackNum = CD_NCMD_READIOPMEM;
489 if (sceSifCallRpc(&clientNCmd, CD_NCMD_READIOPMEM,
SIF_RPC_M_NOWAIT, readData, 24, NULL, 0, &_CdGenericCallbackFunction, (
void *)&CdCallbackNum) < 0) {
492 SignalSema(nCmdSemaId);
497 printf(
"sceCdread end\n");
505 #ifdef F_sceCdNCmdDiskReady
508 if (_CdCheckNCmd(CD_NCMD_DISKREADY) == 0)
511 if (sceSifCallRpc(&clientNCmd, CD_NCMD_DISKREADY, 0, NULL, 0, &nCmdRecvBuff, 4, NULL, NULL) < 0) {
512 SignalSema(nCmdSemaId);
516 SignalSema(nCmdSemaId);
517 return *(
int *)UNCACHED_SEG(nCmdRecvBuff);
521 #ifdef F_sceCdReadChain
524 int chainNum, i, sectorType;
532 printf(
"call sceCdReadChain cmd 0\n");
534 for (chainNum = 0; chainNum < 64; chainNum++) {
535 if (readChain[chainNum].lbn == 0xFFFFFFFF ||
536 readChain[chainNum].sectors == 0xFFFFFFFF || readChain[chainNum].buffer == 0xFFFFFFFF)
538 readChainData[chainNum].
lbn = readChain[chainNum].
lbn;
540 readChainData[chainNum].
buffer = readChain[chainNum].
buffer;
543 readChainData[chainNum].
lbn = 0xFFFFFFFF;
544 readChainData[chainNum].
sectors = 0xFFFFFFFF;
545 readChainData[chainNum].
buffer = 0xFFFFFFFF;
548 readChainData[65].
lbn = (mode->trycount) | (mode->spindlctrl << 8) | (mode->datapattern << 16);
549 readChainData[65].
sectors = (u32)&curReadPos;
551 if (mode->datapattern == SCECdSecS2328)
553 else if (mode->datapattern == SCECdSecS2340)
560 printf(
"call sceCdReadChain cmd 1\n");
562 for (i = 0; i < chainNum; i++) {
564 if ((readChainData[i].buffer & 1) == 0) {
566 printf(
"sceSifWriteBackDCache addr= 0x%08x size= %d, sector= %d\n",
567 readChainData[i].buffer, readChainData[i].sectors * sectorType,
568 readChainData[i].lbn);
569 sceSifWriteBackDCache((
void *)(readChainData[i].buffer),
570 readChainData[i].sectors * sectorType);
574 sceSifWriteBackDCache(&curReadPos, 4);
577 printf(
"call sceCdReadChain cmd 2\n");
583 SignalSema(nCmdSemaId);
588 printf(
"sceCdread end\n");
596 #ifdef F_sceCdGetReadPos
599 if (CdCallbackNum == CD_NCMD_READ) {
600 return *(u32 *)UNCACHED_SEG(curReadPos);
608 #ifdef F_sceCdStStart
612 return sceCdStream(lbn, 0, NULL, CDVD_ST_CMD_START, mode);
617 int sceCdStRead(u32 sectorType, u32 *buffer, u32 mode, u32 *error)
623 printf(
"sceCdStRead call read size=%d mode=%d\n", sectorType, mode);
624 if (streamStatus == 0)
626 sceSifWriteBackDCache(buffer, sectorType * 2048);
630 ret = sceCdStream(0, sectorType, buffer, CDVD_ST_CMD_READ, &dummyMode);
635 for (i = 0; (u32)i < sectorType;) {
636 int err, sectorReadSize;
638 ret = sceCdStream(0, sectorType - i, (buffer + (i * 2048)), CDVD_ST_CMD_READ, &dummyMode);
639 sectorReadSize = ret & 0xFFFF;
646 printf(
"sceCdStRead BLK Read cur_size= %d read_size= %d req_size= %d err 0x%x\n", i,
647 sectorReadSize, sectorType, err);
649 if (sectorReadSize == 0)
655 printf(
"sceCdStRead BLK Read Ended\n");
664 return sceCdStream(0, 0, NULL, CDVD_ST_CMD_STOP, &dummyMode);
671 return sceCdStream(lbn, 0, NULL, CDVD_ST_CMD_SEEK, &dummyMode);
676 int sceCdStInit(u32 buffSize, u32 numBuffers,
void *buf)
679 return sceCdStream(buffSize, numBuffers, buf, CDVD_ST_CMD_INIT, &dummyMode);
687 return sceCdStream(0, 0, NULL, CDVD_ST_CMD_STAT, &dummyMode);
691 #ifdef F_sceCdStPause
695 return sceCdStream(0, 0, NULL, CDVD_ST_CMD_PAUSE, &dummyMode);
699 #ifdef F_sceCdStResume
703 return sceCdStream(0, 0, NULL, CDVD_ST_CMD_RESUME, &dummyMode);
711 if (_CdCheckNCmd(15) == 0)
715 printf(
"call sceCdreadstm call\n");
717 readStreamData[0] = lbn;
718 readStreamData[1] = nsectors;
719 readStreamData[2] = (u32)buf;
720 readStreamData[3] = cmd;
725 printf(
"call sceCdreadstm cmd\n");
727 if (sceSifCallRpc(&clientNCmd, CD_NCMD_STREAM, 0, readStreamData, 20, nCmdRecvBuff, 4, NULL, NULL) < 0) {
728 SignalSema(nCmdSemaId);
733 printf(
"sceCdread end\n");
734 SignalSema(nCmdSemaId);
735 return *(
int *)UNCACHED_SEG(nCmdRecvBuff);
739 #ifdef F_sceCdCddaStream
742 unsigned int sector_size;
744 if (_CdCheckNCmd(17) == 0)
745 return cmd < CDVD_ST_CMD_INIT ? -1 : 0;
752 readStreamData[0] = lbn;
753 readStreamData[1] = nsectors * sector_size;
754 readStreamData[2] = (u32)buf;
755 readStreamData[3] = cmd;
758 if (cmd == CDVD_ST_CMD_INIT)
759 readStreamData[2] = (u32)cdda_st_buf;
763 if (sceSifCallRpc(&clientNCmd, CD_NCMD_CDDASTREAM, 0, readStreamData, 20, nCmdRecvBuff, 4, NULL, NULL) < 0) {
764 SignalSema(nCmdSemaId);
765 return cmd < CDVD_ST_CMD_INIT ? -1 : 0;
768 SignalSema(nCmdSemaId);
769 return *(
int *)UNCACHED_SEG(nCmdRecvBuff);
779 printf(
"N cmd wait\n");
782 while (cbSema || sceSifCheckStatRpc(&clientNCmd))
787 if (cbSema || sceSifCheckStatRpc(&clientNCmd))
799 #ifdef F__CdCheckNCmd
800 int _CdCheckNCmd(
int cmd)
803 if (PollSema(nCmdSemaId) != nCmdSemaId) {
805 printf(
"Ncmd fail sema cmd:%d keep_cmd:%d\n", cmd, nCmdNum);
810 ReferThreadStatus(CdThreadId, &CdThreadParam);
812 SignalSema(nCmdSemaId);
818 memset(&clientNCmd, 0,
sizeof(clientNCmd));
820 if (clientNCmd.server)
826 printf(
"Libcdvd bind err N CMD\n");
828 if (clientNCmd.server != 0)
833 if (!initVersionCdvdfsv)
840 uncached = UNCACHED_SEG(_rd_intr_data);
844 readData[2] = (u32)NULL;
846 readData[4] = (u32)_rd_intr_data;
848 if (sceSifCallRpc(&clientNCmd, CD_NCMD_CDDAREAD, 0, readData,
sizeof(readData), NULL, 0, 0, 0) < 0)
852 if (uncached->size1 || uncached->dest1 || uncached->size2 || uncached->dest2)
855 for (i = 0; i <
sizeof(*uncached); i += 1)
856 ((u8 *)uncached)[i] ^= 0xFF;
858 if (sceSifCallRpc(&clientNCmd, CD_NCMD_CDDAREAD, 0, readData,
sizeof(readData), NULL, 0, 0, 0) < 0)
861 if (uncached->size1 || uncached->dest1 || uncached->size2 || uncached->dest2)
865 for (i = 0; i <
sizeof(*uncached); i += 1)
866 eq_count += (((u8 *)uncached)[i] == ((u8 *)&tmpbuf)[i]) ? 1 : 0;
873 #ifdef F_sceCdReadKey
874 int
sceCdReadKey(unsigned char arg1, unsigned char arg2, unsigned int command, unsigned char *key)
878 if (_CdCheckNCmd(CD_NCMD_READ_KEY) == 0)
881 nCmdSendBuff.readKey.arg1 = arg1;
882 nCmdSendBuff.readKey.arg2 = arg2;
883 nCmdSendBuff.readKey.command = command;
885 if (sceSifCallRpc(&clientNCmd, CD_NCMD_READ_KEY, 0, &nCmdSendBuff, 0xC, nCmdRecvBuff, 0x18, NULL, NULL) >= 0) {
886 memcpy(key, UNCACHED_SEG(&nCmdRecvBuff[4]), 16);
889 SignalSema(nCmdSemaId);