11#include "accdvde_internal.h"
13static int cde_op_ready(
void *arg);
14static int cde_op_type(
void *arg);
15static int cde_op_error(
void *arg);
16static int cde_op_getpos(
void *arg);
17static int cde_op_init(
void *arg);
18static int cde_op_pause(
void *arg);
19static int cde_op_read(
void *arg);
20static int cde_op_readtoc(
void *arg);
21static int cde_op_readi(
void *arg);
22static int cde_op_sync(
void *arg);
23static int cde_op_lookup(
void *arg);
24static int cde_op_seek(
void *arg);
25static int cde_op_standby(
void *arg);
26static int cde_op_stat(
void *arg);
27static int cde_op_stop(
void *arg);
28static int cde_op_tray(
void *arg);
29static int cde_op_inits(
void *arg);
30static int cde_op_reads(
void *arg);
31static int cde_op_seeks(
void *arg);
32static int cde_op_starts(
void *arg);
33static int cde_op_stats(
void *arg);
34static int cde_op_stops(
void *arg);
35static int cde_op_pauses(
void *arg);
36static int cde_op_resumes(
void *arg);
37static int cde_op_readrtc(
void *arg);
39static cde_ops_t Cde_ops[27] = {
69static int cde_op_ready(
void *arg)
76 argr->result = cdc_ready(argt->mode);
80static int cde_op_type(
void *arg)
85 argr->result = cdc_medium();
89static int cde_op_error(
void *arg)
94 argr->result = cdc_error();
98static int cde_op_getpos(
void *arg)
103 argr->result = cdc_getpos();
107static int cde_op_init(
void *arg)
125 if ( cdc_module_status() > 0 )
127 ret_v2 = cdc_module_start(0, 0);
139 printf(
"cde:init: START error %d\n", ret_v2);
145 ret = mode == 5 && cdc_module_stop() >= 0;
151static int cde_op_pause(
void *arg)
157 result = cdc_pause(0);
158 argr->result = result;
162static int cde_read_xfer(
void *dst,
void *src,
int len,
enum cdc_xfer_dir dir)
164 if ( dir == CDC_XFER_SYNC )
166 if ( acMemWait(&Cdec.rd_mem, 100, 120) < 0 )
168 acMemSetup(&Cdec.rd_mem, src, len);
169 return acMemSend(&Cdec.rd_mem, (acMemEEaddr)dst, len, 10);
172static int cde_op_read(
void *arg)
180 acMemSetup(&Cdec.rd_mem, 0, 0);
181 result = cdc_read(argt->lsn, argt->buf, argt->sectors, &argt->rmode, (cdc_xfer_t)cde_read_xfer, 0);
182 argr->result = result;
186static int cde_op_readtoc(
void *arg)
194 acMemSetup(&Cdec.rd_mem, 0, 0);
195 result = cdc_readtoc(argt->toc, (cdc_xfer_t)cde_read_xfer);
196 argr->result = result;
200static void cde_read_acram_cb(
acRamT ram,
void *arg,
int result)
213static int cde_read_acram(
void *dst,
void *src,
int len,
enum cdc_xfer_dir dir)
221 thid = GetThreadId();
222 v7 = acRamSetup(&ram_data, cde_read_acram_cb, &thid, 0);
223 ret = acRamWrite(v7, (acRamAddr)dst, src, len);
235static int cde_op_readi(
void *arg)
246 v2 = (
unsigned int)argt->buf;
247 if ( (v2 & 0xF0000001) == 0x40000000 )
252 result = cdc_read(argt->lsn, (
void *)v2, argt->sectors, &argt->rmode, flg ? cde_read_acram : 0, 0);
253 argr->result = result;
257static int cde_op_sync(
void *arg)
267 argr->fno = cdc_getfno();
270 if ( mode < 0 && v3 )
271 argr->rpos = cdc_getpos();
277static int cde_lookup_xfer(
void *dst,
void *src,
int len,
enum cdc_xfer_dir dir)
287 acMemSetup(&mem_data, dst, len);
288 return acMemReceive(&mem_data, (acMemEEaddr)src, v5);
291static int cde_op_lookup(
void *arg)
299 result = cdc_lookup(&argr->file, (
char *)argt->name, argt->namlen, (cdc_xfer_t)cde_lookup_xfer);
300 argr->result = result;
304static int cde_op_seek(
void *arg)
312 result = cdc_seek(argt->lsn, 0);
313 argr->result = result;
317static int cde_op_standby(
void *arg)
323 result = cdc_standby(0);
324 argr->result = result;
328static int cde_op_stat(
void *arg)
333 argr->result = cdc_stat();
337static int cde_op_stop(
void *arg)
343 result = cdc_stop(0);
344 argr->result = result;
348static int cde_op_tray(
void *arg)
356 result = cdc_tray(argt->mode, &argr->status);
357 argr->result = result;
361static int cde_op_inits(
void *arg)
369 result = cdc_inits(argt->buf, argt->size, argt->bsize);
370 argr->result = result;
374static int cde_reads_xfer(
void *dst,
void *src,
int len,
enum cdc_xfer_dir dir)
384 index_v3 = Cdec.st_index - 1;
385 if ( Cdec.st_index - 1 < 0 )
387 if ( acMemWait(&Cdec.st_mem[index_v3], 100, 120) < 0 )
391 index = Cdec.st_index;
392 mem = &Cdec.st_mem[Cdec.st_index];
393 if ( acMemWait(mem, 100, 120) < 0 )
395 acMemSetup(mem, src, len);
396 index_v2 = index + 1;
397 if ( acMemSend(mem, (acMemEEaddr)dst, len, 10) < 0 )
401 if ( (
unsigned int)index_v2 >= 2 )
403 Cdec.st_index = index_v2;
407static int cde_op_reads(
void *arg)
415 result = cdc_reads(argt->buf, argt->sectors, argt->mode, (
int *)&argr->error, (cdc_xfer_t)cde_reads_xfer);
416 argr->result = result;
420static int cde_op_seeks(
void *arg)
428 result = cdc_seeks(argt->lsn);
429 argr->result = result;
433static int cde_op_starts(
void *arg)
441 result = cdc_starts(argt->lsn, &argt->rmode);
442 argr->result = result;
446static int cde_op_stats(
void *arg)
452 result = cdc_stats();
453 argr->result = result;
457static int cde_op_stops(
void *arg)
463 result = cdc_stops();
464 argr->result = result;
468static int cde_op_pauses(
void *arg)
474 result = cdc_pauses();
475 argr->result = result;
479static int cde_op_resumes(
void *arg)
485 result = cdc_resumes();
486 argr->result = result;
490static int cde_op_readrtc(
void *arg)
497 argr->result = result;
501static void *cde_request(
unsigned int fno,
struct cde_softc *data,
int size)
516 if ( fno >= (
sizeof(Cde_ops) /
sizeof(Cde_ops[0])) || (func = Cde_ops[fno]) == 0 )
539 rpl->error = *(acUint32 *)data->cal;
540 rpl->result = *(acUint32 *)&data->cal[4];
541 rpl->padding[0] = *(acUint32 *)&data->cal[8];
542 rpl->padding[1] = *(acUint32 *)&data->cal[12];
549 rpl->error = cdc_error();
551 data->fno = AC_CDVDSIF_ID_NOP;
555static void cde_thread(
void *arg)
563 thid = GetThreadId();
564 sceSifSetRpcQueue(&queue_data, thid);
565 sceSifRegisterRpc(&serv_data, 0x76500002, (SifRpcFunc_t)cde_request, argt, 0, 0, &queue_data);
571 s = sceSifGetNextRequest(&queue_data);
574 sceSifExecRequest(s);
579 if ( thid != argt->thid )
585static void cde_term_thread(
struct cde_softc *cdec)
598 for ( retry = 9; retry >= 0; --retry )
600 ret = DeleteThread(thid);
603 DelayThread(1000000);
606 printf(
"accdvde:term_thread: TIMEDOUT %d\n", ret);
610static int cde_init_thread(
struct cde_softc *cdec,
int prio)
615 param.attr = 0x2000000;
616 param.thread = cde_thread;
617 param.priority = prio;
618 param.stacksize = 4096;
620 th = CreateThread(¶m);
622 StartThread(th, cdec);
626int acCdvdeModuleStatus()
635 ret = Cdec.thid != 0;
640int acCdvdeModuleStart(
int argc,
char **argv)
652 if ( acCdvdeModuleStatus() != 0 )
659 while ( index < argc )
668 value = strtol(opt_v7, &next, 0);
669 if ( next != opt_v7 )
676 memset(&Cdec, 0,
sizeof(Cdec));
677 inited = cde_init_thread(&Cdec, prio);
683int acCdvdeModuleStop()
685 if ( acCdvdeModuleStatus() != 0 )
687 cde_term_thread(&Cdec);
692int acCdvdeModuleRestart(
int argc,
char **argv)
int CpuResumeIntr(int state)
int CpuSuspendIntr(int *state)
int sceCdReadClock(sceCdCLOCK *clock)