33#define CD_SERVER_NCMD 0x80000595
37 CDVD_ST_CMD_START = 1,
101u32 cdda_st_buf[64 /
sizeof(u32)] ALIGNED(64);
103extern int initVersionCdvdfsv;
104extern SifRpcClientData_t clientNCmd;
107extern u32 readStreamData[5];
108extern u32 readData[6];
111extern u32 _rd_intr_data[64];
112extern u32 curReadPos;
114extern u8 nCmdRecvBuff[48];
116extern int streamStatus;
118extern u32 seekSector;
119extern u32 cdda_st_buf[64 /
sizeof(u32)];
150 if (initVersionCdvdfsv > 0x104)
154 if (uncached->size1 && uncached->dest1) {
155 memcpy(uncached->dest1, &uncached->src1, uncached->size1);
158 if (uncached->size2 && uncached->dest2) {
159 memcpy(uncached->dest2, &uncached->src2, uncached->size2);
166 if (uncached->size1 && uncached->dest1) {
167 memcpy(uncached->dest1, &uncached->src1, uncached->size1);
170 if (uncached->size2 && uncached->dest2) {
171 memcpy(uncached->dest2, &uncached->src2, uncached->size2);
189 readData[1] = sectors;
190 readData[2] = (u32)buf;
191 readData[3] = (mode->trycount) | (mode->spindlctrl << 8) | (mode->datapattern << 16);
192 readData[4] = (u32)_rd_intr_data;
193 readData[5] = (u32)&curReadPos;
196 if (mode->datapattern == SCECdSecS2328)
197 bufSize = sectors * 2328;
198 else if (mode->datapattern == SCECdSecS2340)
199 bufSize = sectors * 2340;
201 bufSize = sectors * 2048;
204 sceSifWriteBackDCache(buf, bufSize);
205 sceSifWriteBackDCache(&curReadPos,
sizeof(curReadPos));
208 printf(
"call sceCdread cmd\n");
210 CdCallbackNum = CD_NCMD_READ;
221 printf(
"sceCdread end\n");
228int sceCdReadDVDV(u32 lbn, u32 nsectors,
void *buf,
sceCdRMode *rm)
236 readData[1] = nsectors;
237 readData[2] = (u32)buf;
239 readData[4] = (u32)_rd_intr_data;
241 sceSifWriteBackDCache(buf, nsectors * 2064);
243 CdCallbackNum = CD_NCMD_DVDREAD;
258int sceCdReadCDDA(u32 lbn, u32 nsectors,
void *buf,
sceCdRMode *rm)
260 unsigned int sector_size;
268 readData[1] = nsectors;
269 readData[2] = (u32)buf;
271 readData[4] = (u32)_rd_intr_data;
285 sceSifWriteBackDCache(buf, nsectors * sector_size);
287 CdCallbackNum = CD_NCMD_CDDAREAD;
310 sceSifWriteBackDCache(
tocBuff, 2064);
312 if (sceSifCallRpc(&clientNCmd, CD_NCMD_GETTOC, 0,
getTocSendBuff, 12, nCmdRecvBuff, 8, NULL, NULL) < 0) {
317 tocPtr = UNCACHED_SEG(
tocBuff);
318 tocEnd = tocPtr + 1024;
319 if (*(u32 *)(nCmdRecvBuff + 4)) {
321 memcpy(toc, tocPtr, 32);
324 }
while (tocPtr < tocEnd);
326 tocEnd = tocPtr + 2048;
329 memcpy(toc, tocPtr, 32);
332 }
while (tocPtr < tocEnd);
334 memcpy(toc, tocPtr, 16);
338 return *(
int *)UNCACHED_SEG(nCmdRecvBuff);
350 CdCallbackNum = CD_NCMD_SEEK;
371 CdCallbackNum = CD_NCMD_STANDBY;
392 CdCallbackNum = CD_NCMD_STOP;
413 CdCallbackNum = CD_NCMD_PAUSE;
434 nCmdSendBuff.ncmd.cmdNum = cmdNum;
435 nCmdSendBuff.ncmd.inBuffSize = inBuffSize;
436 memset(nCmdSendBuff.ncmd.inBuff, 0, 16);
438 memcpy(nCmdSendBuff.ncmd.inBuff, inBuff, inBuffSize);
440 if (sceSifCallRpc(&clientNCmd, CD_NCMD_NCMD, 0, &nCmdSendBuff, 20, nCmdRecvBuff, 16, NULL, NULL) < 0) {
446 return *(
int *)UNCACHED_SEG(nCmdRecvBuff);
457 readData[1] = sectors;
458 readData[2] = (u32)buf;
459 readData[3] = (mode->trycount) | (mode->spindlctrl << 8) | (mode->datapattern << 16);
460 readData[4] = (u32)_rd_intr_data;
461 readData[5] = (u32)&curReadPos;
463 CdCallbackNum = CD_NCMD_READIOPMEM;
473 printf(
"sceCdread end\n");
485 if (sceSifCallRpc(&clientNCmd, CD_NCMD_DISKREADY, 0, NULL, 0, &nCmdRecvBuff, 4, NULL, NULL) < 0) {
491 return *(
int *)UNCACHED_SEG(nCmdRecvBuff);
496 int chainNum, i, sectorType;
504 printf(
"call sceCdReadChain cmd 0\n");
506 for (chainNum = 0; chainNum < 64; chainNum++) {
507 if (readChain[chainNum].lbn == 0xFFFFFFFF ||
508 readChain[chainNum].sectors == 0xFFFFFFFF || readChain[chainNum].buffer == 0xFFFFFFFF)
510 readChainData[chainNum].lbn = readChain[chainNum].
lbn;
511 readChainData[chainNum].sectors = readChain[chainNum].
sectors;
512 readChainData[chainNum].buffer = readChain[chainNum].
buffer;
515 readChainData[chainNum].lbn = 0xFFFFFFFF;
516 readChainData[chainNum].sectors = 0xFFFFFFFF;
517 readChainData[chainNum].buffer = 0xFFFFFFFF;
520 readChainData[65].lbn = (mode->trycount) | (mode->spindlctrl << 8) | (mode->datapattern << 16);
521 readChainData[65].sectors = (u32)&curReadPos;
523 if (mode->datapattern == SCECdSecS2328)
525 else if (mode->datapattern == SCECdSecS2340)
532 printf(
"call sceCdReadChain cmd 1\n");
534 for (i = 0; i < chainNum; i++) {
536 if ((readChainData[i].buffer & 1) == 0) {
538 printf(
"sceSifWriteBackDCache addr= 0x%08x size= %d, sector= %d\n",
539 readChainData[i].buffer, readChainData[i].sectors * sectorType,
540 readChainData[i].lbn);
541 sceSifWriteBackDCache((
void *)(readChainData[i].buffer),
542 readChainData[i].sectors * sectorType);
546 sceSifWriteBackDCache(&curReadPos, 4);
549 printf(
"call sceCdReadChain cmd 2\n");
560 printf(
"sceCdread end\n");
569 if (CdCallbackNum == CD_NCMD_READ) {
570 return *(u32 *)UNCACHED_SEG(curReadPos);
580 return sceCdStream(lbn, 0, NULL, CDVD_ST_CMD_START, mode);
589 printf(
"sceCdStRead call read size=%d mode=%d\n", sectorType, mode);
590 if (streamStatus == 0)
592 sceSifWriteBackDCache(buffer, sectorType * 2048);
596 ret =
sceCdStream(0, sectorType, buffer, CDVD_ST_CMD_READ, &dummyMode);
601 for (i = 0; (u32)i < sectorType;) {
602 int err, sectorReadSize;
604 ret =
sceCdStream(0, sectorType - i, (buffer + (i * 2048)), CDVD_ST_CMD_READ, &dummyMode);
605 sectorReadSize = ret & 0xFFFF;
612 printf(
"sceCdStRead BLK Read cur_size= %d read_size= %d req_size= %d err 0x%x\n", i,
613 sectorReadSize, sectorType, err);
615 if (sectorReadSize == 0)
621 printf(
"sceCdStRead BLK Read Ended\n");
628 return sceCdStream(0, 0, NULL, CDVD_ST_CMD_STOP, &dummyMode);
633 return sceCdStream(lbn, 0, NULL, CDVD_ST_CMD_SEEK, &dummyMode);
639 return sceCdStream(buffSize, numBuffers, buf, CDVD_ST_CMD_INIT, &dummyMode);
645 return sceCdStream(0, 0, NULL, CDVD_ST_CMD_STAT, &dummyMode);
651 return sceCdStream(0, 0, NULL, CDVD_ST_CMD_PAUSE, &dummyMode);
657 return sceCdStream(0, 0, NULL, CDVD_ST_CMD_RESUME, &dummyMode);
667 printf(
"call sceCdreadstm call\n");
669 readStreamData[0] = lbn;
670 readStreamData[1] = nsectors;
671 readStreamData[2] = (u32)buf;
672 readStreamData[3] = cmd;
677 printf(
"call sceCdreadstm cmd\n");
679 if (sceSifCallRpc(&clientNCmd, CD_NCMD_STREAM, 0, readStreamData, 20, nCmdRecvBuff, 4, NULL, NULL) < 0) {
685 printf(
"sceCdread end\n");
687 return *(
int *)UNCACHED_SEG(nCmdRecvBuff);
692 unsigned int sector_size;
695 return cmd < CDVD_ST_CMD_INIT ? -1 : 0;
702 readStreamData[0] = lbn;
703 readStreamData[1] = nsectors * sector_size;
704 readStreamData[2] = (u32)buf;
705 readStreamData[3] = cmd;
708 if (cmd == CDVD_ST_CMD_INIT)
709 readStreamData[2] = (u32)cdda_st_buf;
713 if (sceSifCallRpc(&clientNCmd, CD_NCMD_CDDASTREAM, 0, readStreamData, 20, nCmdRecvBuff, 4, NULL, NULL) < 0) {
715 return cmd < CDVD_ST_CMD_INIT ? -1 : 0;
719 return *(
int *)UNCACHED_SEG(nCmdRecvBuff);
727 printf(
"N cmd wait\n");
730 while (
cbSema || sceSifCheckStatRpc(&clientNCmd))
735 if (
cbSema || sceSifCheckStatRpc(&clientNCmd))
751 printf(
"Ncmd fail sema cmd:%d keep_cmd:%d\n", cmd, nCmdNum);
762 if (HasIopRebootedSinceLastCall())
763 memset(&clientNCmd, 0,
sizeof(clientNCmd));
765 if (clientNCmd.server)
771 printf(
"Libcdvd bind err N CMD\n");
773 if (clientNCmd.server != 0)
778 if (!initVersionCdvdfsv)
785 uncached = UNCACHED_SEG(_rd_intr_data);
789 readData[2] = (u32)NULL;
791 readData[4] = (u32)_rd_intr_data;
793 if (sceSifCallRpc(&clientNCmd, CD_NCMD_CDDAREAD, 0, readData,
sizeof(readData), NULL, 0, 0, 0) < 0)
797 if (uncached->size1 || uncached->dest1 || uncached->size2 || uncached->dest2)
800 for (i = 0; i <
sizeof(*uncached); i += 1)
801 ((u8 *)uncached)[i] ^= 0xFF;
803 if (sceSifCallRpc(&clientNCmd, CD_NCMD_CDDAREAD, 0, readData,
sizeof(readData), NULL, 0, 0, 0) < 0)
806 if (uncached->size1 || uncached->dest1 || uncached->size2 || uncached->dest2)
810 for (i = 0; i <
sizeof(*uncached); i += 1)
811 eq_count += (((u8 *)uncached)[i] == ((u8 *)&tmpbuf)[i]) ? 1 : 0;
817int
sceCdReadKey(unsigned char arg1, unsigned char arg2, unsigned int command, unsigned char *key)
824 nCmdSendBuff.readKey.arg1 = arg1;
825 nCmdSendBuff.readKey.arg2 = arg2;
826 nCmdSendBuff.readKey.command = command;
828 if (sceSifCallRpc(&clientNCmd, CD_NCMD_READ_KEY, 0, &nCmdSendBuff, 0xC, nCmdRecvBuff, 0x18, NULL, NULL) >= 0) {
829 memcpy(key, UNCACHED_SEG(&nCmdRecvBuff[4]), 16);
void _CdGenericCallbackFunction(void *funcNum)
int sceCdReadIOPMem(u32 lbn, u32 sectors, void *buf, sceCdRMode *mode)
int sceCdNCmdDiskReady(void)
int sceCdStRead(u32 sectorType, u32 *buffer, u32 mode, u32 *error)
int sceCdReadKey(unsigned char arg1, unsigned char arg2, unsigned int command, unsigned char *key)
int sceCdRead(u32 lbn, u32 sectors, void *buf, sceCdRMode *mode)
int sceCdReadChain(sceCdRChain *readChain, sceCdRMode *mode)
int _CdCheckNCmd(int cmd)
u32 sceCdGetReadPos(void)
int sceCdStStart(u32 lbn, sceCdRMode *mode)
void _CdAlignReadBuffer(void *data)
int sceCdStInit(u32 buffSize, u32 numBuffers, void *buf)
int sceCdApplyNCmd(u8 cmdNum, const void *inBuff, u16 inBuffSize)
int sceCdStream(u32 lbn, u32 nsectors, void *buf, CdvdStCmd_t cmd, sceCdRMode *rm)