11#include "irx_imports.h"
22IRX_ID(
"cdvd_driver", 2, 38);
47 int m_sector_count_total;
57 unsigned int m_cache_hit_count;
69 unsigned char m_type[1];
70 unsigned char m_id[5];
72 unsigned char m_version[1];
74 unsigned char m_unused1[1];
76 unsigned char m_system_id[32];
78 unsigned char m_volume_id[32];
80 unsigned char m_unused2[8];
82 unsigned char m_volume_space_size[8];
84 unsigned char m_unused3[32];
86 unsigned char m_volume_set_size[4];
88 unsigned char m_volume_sequence_number[4];
90 unsigned char m_logical_block_size[4];
92 unsigned char m_path_table_size[8];
93 unsigned char m_type_l_path_table[4];
95 unsigned char m_opt_type_l_path_table[4];
97 unsigned char m_type_m_path_table[4];
99 unsigned char m_opt_type_m_path_table[4];
101 unsigned char m_root_directory_record[34];
103 unsigned char m_volume_set_id[128];
105 unsigned char m_publisher_id[128];
107 unsigned char m_preparer_id[128];
109 unsigned char m_application_id[128];
111 unsigned char m_copyright_file_id[37];
113 unsigned char m_abstract_file_id[37];
115 unsigned char m_bibliographic_file_id[37];
117 unsigned char m_creation_date[17];
119 unsigned char m_modification_date[17];
121 unsigned char m_expiration_date[17];
123 unsigned char m_effective_date[17];
125 unsigned char m_file_structure_version[1];
127 unsigned char m_unused4[1];
129 unsigned char m_application_data[512];
131 unsigned char m_unused5[653];
136 unsigned char m_name_len[2];
137 unsigned char m_extent[4];
138 unsigned char m_parent[2];
139 unsigned char m_name[];
144 unsigned char m_length[1];
145 unsigned char m_ext_attr_length[1];
146 unsigned char m_extent[8];
147 unsigned char m_size[8];
148 unsigned char m_date[7];
149 unsigned char m_flags[1];
150 unsigned char m_file_unit_size[1];
151 unsigned char m_interleave[1];
152 unsigned char m_volume_sequence_number[4];
153 unsigned char m_name_len[1];
154 unsigned char m_name[];
158void cdvdman_termcall(
int with_stop);
160static int cdrom_dopen(
iop_file_t *f,
const char *dirname);
163static int cdrom_open(
iop_file_t *f,
const char *name,
int mode,
int arg4);
165static int cdrom_read(
iop_file_t *f,
void *buf,
int nbytes);
166static int cdrom_ioctl(
iop_file_t *f,
int arg,
void *param);
167static int cdrom_ioctl2(
iop_file_t *f,
int request,
void *argp,
size_t arglen,
void *bufp,
size_t buflen);
169cdrom_devctl(
iop_file_t *f,
const char *,
int cmd,
void *argp,
unsigned int arglen,
void *bufp,
unsigned int buflen);
170static int cdrom_lseek(
iop_file_t *f,
int offset,
int pos);
172static int sceCdSearchDir(
char *dirname,
int layer);
173static int sceCdReadDir(
sceCdlFILE *fp,
int dsec,
int index,
int layer);
174static int cdvdman_cmpname(
const char *p,
const char *q);
175static int CD_newmedia(
int arg);
176static int cdvdman_finddir(
int target_parent,
const char *target_name);
177static int CD_cachefile(
int dsec,
int layer);
178static int disc_read(
int size,
int loc,
void *buffer,
int layer);
179static int path_tbl_init(u32 blocks,
char *fname,
int action);
180unsigned int optimized_memcpy(
char *dst,
const char *src,
unsigned int n);
181static int vSetAlarm(
iop_sys_clock_t *sys_clock,
unsigned int (*alarm_cb)(
void *),
void *arg);
182static int vCancelAlarm(
unsigned int (*alarm_cb)(
void *),
void *arg);
183static int vSetEventFlag(
int ef, u32 bits);
184static int vDelayThread(
int usec);
185static int DvdDual_infochk();
186static void cdvdman_init();
189static int cdvdman_mediactl(
int code);
190static int cdvdman_ncmd_sender_06();
191static int cdvdman_gettoc(u8 *
toc);
192static int cdvdman_isdvd();
193static int sceCdRead0_Rty(u32 lsn, u32 nsec,
void *buf,
const sceCdRMode *mode,
int ncmd,
int dintrsec,
void *func);
194static int cdvdman_syncdec(
int decflag,
int decxor,
int shift, u32 data);
195static void Read2intrCDVD(
int read2_flag);
196static int sceCdGetMVersion(u8 *buffer, u32 *status);
197static int cdvdman_scmd_sender_03_48(u8 *buf, u32 *status);
198static int cdvdman_scmd_sender_3B(
int arg1);
199#ifdef CDVD_VARIANT_DNAS
200static int cdvdman_ncmd_sender_0C(
int arg1, u32 arg2, u32 arg3);
203static char g_cdvdman_cache_name[256] =
"host0:";
204static int g_cdvdman_cache_sector_size_count = 1;
205static int g_cdvdman_srchspd = 0;
206static int g_cdvdman_spinctl = -1;
207static int g_cdvdman_spinnom = -1;
208static int g_cdvdman_trycnt = -1;
209static int g_cdvdman_iocache = 0;
210static unsigned int g_cdvdman_lcn_offset = 0;
211static unsigned int g_cdvdman_numbytes_offset = 0;
212static int g_cdvdman_strmerr = 0;
214IOMANX_RETURN_VALUE_IMPL(
EIO);
219 IOMANX_RETURN_VALUE(
EIO),
223 IOMANX_RETURN_VALUE(
EIO),
226 IOMANX_RETURN_VALUE(
EIO),
227 IOMANX_RETURN_VALUE(
EIO),
228 IOMANX_RETURN_VALUE(
EIO),
233 IOMANX_RETURN_VALUE(
EIO),
234 IOMANX_RETURN_VALUE(
EIO),
235 IOMANX_RETURN_VALUE(
EIO),
236 IOMANX_RETURN_VALUE(
EIO),
237 IOMANX_RETURN_VALUE(
EIO),
238 IOMANX_RETURN_VALUE(
EIO),
239 IOMANX_RETURN_VALUE_S64(
EIO),
241 IOMANX_RETURN_VALUE(
EIO),
242 IOMANX_RETURN_VALUE(
EIO),
246static int g_cdvdman_sync_timeout = 15000;
247static int g_cdvdman_stream_timeout = 5000;
248#ifdef CDVD_VARIANT_DNAS
251static int g_verbose_level = 0;
253static unsigned int g_cache_count = 0;
254static unsigned int g_cache_table = 0;
255static unsigned int g_cdvdman_pathtblsize = 0;
256static int g_cache_path_size = 0;
257static int g_cache_path_fd = -1;
258static int g_cdvdman_fs_cdsec = 0;
259static int g_cdvdman_fs_layer = -1;
260static int g_cdvdman_fs_cache = 0;
261static int g_cdvdman_fs_base2 = 0;
262static int g_cdvdman_clk_flg = 0;
263static int g_cdvdman_cd36key = 0;
264static int g_cdvdman_ee_rpc_fno = 0;
265static int g_cdvdman_mmode = 0;
266static int g_cdvdman_last_cmdfunc = 0;
267static int g_cdvdman_minver_10700 = 0;
268static int g_cdvdman_minver_20200 = 0;
269static int g_cdvdman_minver_20400 = 0;
270static int g_cdvdman_minver_20800 = 0;
271static int g_cdvdman_emudvd9 = 0;
272static int g_cdvdman_minver_50000 = 0;
273static int g_cdvdman_minver_50200 = 0;
274static int g_cdvdman_minver_50400 = 0;
275static int g_cdvdman_minver_50600 = 0;
276static int g_cdvdman_minver_60000 = 0;
277static int g_cdvdman_minver_60200 = 0;
278static int g_cdvdman_minver_x_model_15 = 0;
279static char *g_masterdisc_header =
"PlayStation Master Disc";
280static char g_cdvdman_ncmd = 6;
281static int g_cdvdman_chmedia = 0;
282static int g_cdvdman_chflags[4] = {1, 1, 1, 1};
283static int g_cdvdman_rtindex = 0;
284static int g_cdvdman_retries = 0;
285static u8 *g_cdvdman_ptoc;
286static int g_scmd_evid;
287static void *g_cdvdman_temp_buffer_ptr;
288static int g_sfile_evid;
289static int g_ncmd_evid;
290static int g_fio_fsv_evid;
291static int g_cdvdman_intr_efid;
293static void *g_cdvdman_poffarg;
294static void (*g_cdvdman_cdstm0cb)(int);
296static void (*g_cdvdman_poff_cb)(
void *userdata);
297static void (*g_cdvdman_cdstm1cb)(int);
298static int g_cdvdman_cmdfunc;
300static char g_cdvdman_sfname[1024];
303static int g_cdvdman_pathtblflag;
304static char g_cdvdman_fs_rbuf[2048];
305static int g_cdvdman_readptr;
308static void *g_cdvdman_readbuf;
310static char g_cdvdman_fsvrbuf[42128];
313int _start(
int ac,
char **av)
318 if ( RegisterLibraryEntries(&_exp_cdvdman) )
320 return MODULE_NO_RESIDENT_END;
322 DelDrv(g_cdvdman_cddev.name);
323 if ( AddDrv(&g_cdvdman_cddev) )
325 cdrom_deinit(&g_cdvdman_cddev);
326 return MODULE_NO_RESIDENT_END;
328 g_cdvdman_ptoc = (u8 *)&g_cdvdman_fsvrbuf[0x924];
329 g_cdvdman_temp_buffer_ptr = g_cdvdman_fsvrbuf;
332 SetRebootTimeLibraryHandlingMode(&_exp_cdvdman, 2);
335 _exp_cdvdman.mode &= ~6;
336 _exp_cdvdman.mode |= 2;
338 return MODULE_RESIDENT_END;
341void *sceGetFsvRbuf(
void)
343 return g_cdvdman_fsvrbuf;
354 PRINTF(
"cdvdman Init\n");
355 g_cdvdman_istruct.m_wait_flag = 1;
356 g_cdvdman_istruct.m_scmd_flag = 1;
357 g_cdvdman_istruct.m_read2_flag = 0;
358 g_cdvdman_istruct.m_stream_flag = 0;
359 g_cdvdman_istruct.m_last_error = 0;
360 g_cdvdman_istruct.m_layer_1_lsn = 0;
361 g_cdvdman_istruct.m_use_toc = 0;
362 g_cdvdman_istruct.m_last_read_timeout = 0;
363 g_cdvdman_istruct.m_power_flag = 0;
364 g_cdvdman_istruct.m_current_dvd = 0;
365 g_cdvdman_istruct.m_dual_layer_emulation = 0;
366 g_cdvdman_istruct.m_dec_state = 0;
367 g_cdvdman_istruct.m_check_version = 0;
368 g_cdvdman_istruct.m_dec_shift = 0;
369 g_cdvdman_istruct.m_opo_or_para = -1;
370 g_cdvdman_istruct.m_no_dec_flag = 0;
371 g_cdvdman_istruct.m_cd_inited = 0;
372 g_cdvdman_istruct.m_tray_is_open = 0;
373 g_cdvdman_ee_rpc_fno = 0;
374 g_cdvdman_spinctl = -1;
378 g_cdvdman_intr_efid = CreateEventFlag(&
event);
379 g_scmd_evid = CreateEventFlag(&
event);
380 g_ncmd_evid = CreateEventFlag(&
event);
381 g_sfile_evid = CreateEventFlag(&
event);
382 g_fio_fsv_evid = CreateEventFlag(&
event);
383 ClearEventFlag(g_cdvdman_intr_efid, ~0x4);
384 ClearEventFlag(g_cdvdman_intr_efid, ~0x10);
385 SetEventFlag(g_cdvdman_intr_efid, 0x29);
386 SetEventFlag(g_ncmd_evid, 1);
387 SetEventFlag(g_scmd_evid, 1);
388 SetEventFlag(g_sfile_evid, 1);
389 SetEventFlag(g_fio_fsv_evid, 1);
390 g_cdvdman_spinnom = -1;
391 g_cdvdman_trycnt = -1;
392 sceCdSC(0xFFFFFFF3, &scres_unused);
393 for ( i = 0; i < (
sizeof(g_cdvdman_fhinfo) /
sizeof(g_cdvdman_fhinfo[0])); i += 1 )
395 g_cdvdman_fhinfo[i].m_fd_flags = 0;
400void cdvdman_termcall(
int with_stop)
404 USE_DEV5_MMIO_HWPORT();
406 VERBOSE_KPRINTF(1,
"CDVD:library Terminate Call %d\n", with_stop);
413 if ( g_cdvdman_istruct.m_cd_inited )
415 cdvdman_ncmd_sender_06();
417 for ( i = 0; i < 50000; i += 1 )
419 if ( !(dev5_mmio_hwport->m_dev5_reg_017 & 0x80) )
426 if ( (dmac_ch_get_chcr(3) & 0x1000000) )
428 dev5_mmio_hwport->m_dev5_reg_007 = 1;
430 dmac_ch_set_chcr(3, 0);
443 for ( i = 0; i < (
sizeof(g_cdvdman_fhinfo) /
sizeof(g_cdvdman_fhinfo[0])); i += 1 )
445 g_cdvdman_fhinfo[i].m_fd_flags = 0;
447 DeleteEventFlag(g_fio_fsv_evid);
448 DeleteEventFlag(g_cdvdman_intr_efid);
449 DeleteEventFlag(g_ncmd_evid);
450 DeleteEventFlag(g_scmd_evid);
451 DeleteEventFlag(g_sfile_evid);
455static int cdvdman_devready()
458 USE_DEV5_MMIO_HWPORT();
460 for ( i = 0; i < 100; i += 1 )
462 if ( (dev5_mmio_hwport->m_dev5_reg_00A & 1) )
464 g_cdvdman_iocache = 0;
467 if ( (dev5_mmio_hwport->m_dev5_reg_005 & 0xC0) == 0x40 && !g_cdvdman_istruct.m_read2_flag && !g_cdvdman_ee_rpc_fno )
476static int cdvdman_l0check(
int layer)
479 && (g_cdvdman_istruct.m_dual_layer_emulation || g_cdvdman_istruct.m_opo_or_para == 1 || g_cdvdman_istruct.m_opo_or_para == 2);
482static void cdvdman_iormode(
sceCdRMode *rmode,
int fmode,
int layer)
485 rmode->
trycount = (g_cdvdman_trycnt == -1) ? 16 : g_cdvdman_trycnt;
486 if ( cdvdman_l0check(layer) )
488 if ( g_cdvdman_spinnom == -1 )
499 else if ( g_cdvdman_spinnom == -1 )
533static int cdrom_dopen(
iop_file_t *f,
const char *dirname)
537 size_t path_name_ind;
542 VERBOSE_PRINTF(1,
"fileIO DOPEN name= %s layer %d\n", dirname, f->
unit);
543 WaitEventFlag(g_fio_fsv_evid, 1, WEF_AND | WEF_CLEAR, &efbits);
544 for ( i = 0; (i < (
sizeof(g_cdvdman_fhinfo) /
sizeof(g_cdvdman_fhinfo[0]))) && g_cdvdman_fhinfo[i].m_fd_flags;
548 if ( i == (
sizeof(g_cdvdman_fhinfo) /
sizeof(g_cdvdman_fhinfo[0])) )
550 SetEventFlag(g_fio_fsv_evid, 1);
554 is_devready = cdvdman_devready();
555 if ( is_devready < 0 )
557 SetEventFlag(g_fio_fsv_evid, 1);
560 strncpy(path_name, dirname,
sizeof(path_name));
561 if ( !strcmp(path_name,
".") )
563 strcpy(path_name,
"\\.");
565 path_name_ind = strlen(path_name);
566 path_name_ind -= (path_name_ind >= 2) ? 2 : 0;
567 if ( strcmp(&path_name[path_name_ind],
"\\.") )
569 strcat(path_name,
"\\.");
571 if ( (
unsigned int)(f->
unit) >= 2 )
573 PRINTF(
"open fail name %s\n", path_name);
574 SetEventFlag(g_fio_fsv_evid, 1);
577 g_cdvdman_fhinfo[i].m_file_lsn = 0;
578 g_cdvdman_srchspd = 0;
579 file_lsn_tmp = sceCdSearchDir(path_name, f->
unit);
580 if ( file_lsn_tmp < 0 )
582 PRINTF(
"open fail directory %s\n", path_name);
583 SetEventFlag(g_fio_fsv_evid, 1);
586 g_cdvdman_fhinfo[i].m_file_lsn = file_lsn_tmp;
587 g_cdvdman_fhinfo[i].m_read_pos = 0;
588 g_cdvdman_fhinfo[i].m_filemode = 0;
589 g_cdvdman_fhinfo[i].m_fd_flags = 1;
590 g_cdvdman_fhinfo[i].m_fd_layer = f->
unit;
591 SetEventFlag(g_fio_fsv_evid, 1);
609 for ( i = 0; i < (
sizeof(buf->mtime) /
sizeof(buf->mtime[0])); i += 1 )
611 buf->mtime[i] = fp->m_file_struct.date[i];
612 buf->atime[i] = fp->m_file_struct.date[i];
613 buf->ctime[i] = fp->m_file_struct.date[i];
615 buf->size = fp->m_file_struct.size;
620static int cdvdman_cdfname(
char *filename)
624 filename_len = strlen(filename);
625 if ( filename_len >= 3 && !(filename[filename_len - 2] !=
';' && filename[filename_len - 1] !=
'1') )
629 strcat(filename,
";1");
640 VERBOSE_PRINTF(1,
"fileIO GETSTAT name= %s layer= %d\n", name, f->
unit);
641 WaitEventFlag(g_fio_fsv_evid, 1, WEF_AND | WEF_CLEAR, &efbits);
642 devready_tmp = cdvdman_devready();
643 if ( devready_tmp < 0 )
645 SetEventFlag(g_fio_fsv_evid, 1);
648 strncpy(filename, name,
sizeof(filename));
649 if ( !strcmp(filename,
".") )
651 strcpy(filename,
"\\.");
653 if ( !strcmp(filename,
"\\") )
655 strcpy(filename,
"\\.");
657 if ( !strlen(filename) )
659 strcpy(filename,
"\\.");
661 g_cdvdman_srchspd = 0;
663 memset(&fp, 0,
sizeof(fp));
668 PRINTF(
"open fail name %s\n", name);
669 SetEventFlag(g_fio_fsv_evid, 1);
672 cdvdman_fillstat(filename, buf, &fp);
673 SetEventFlag(g_fio_fsv_evid, 1);
684 memset(&fp, 0,
sizeof(fp));
685 VERBOSE_PRINTF(1,
"fileIO DREAD\n");
686 WaitEventFlag(g_fio_fsv_evid, 1, WEF_AND | WEF_CLEAR, &efbits);
687 devready_tmp = cdvdman_devready();
688 if ( devready_tmp < 0 )
690 SetEventFlag(g_fio_fsv_evid, 1);
693 fh = &g_cdvdman_fhinfo[(int)f->
privdata];
694 g_cdvdman_srchspd = 0;
695 devready_tmp = sceCdReadDir(&fp.m_file_struct, fh->m_file_lsn, fh->m_read_pos, fh->m_fd_layer);
696 if ( devready_tmp < 0 )
698 SetEventFlag(g_fio_fsv_evid, 1);
704 devready_tmp = strlen(fp.m_file_struct.name);
706 strncpy(buf->name, fp.m_file_struct.name,
sizeof(buf->name));
707 cdvdman_fillstat(fp.m_file_struct.name, &buf->stat, &fp);
708 SetEventFlag(g_fio_fsv_evid, 1);
714 int cache_remove_result;
716 int cache_file_fd_new;
718 unsigned int file_size_bsr_17;
719 char cache_filename[512];
721 unsigned int ioctl_arg;
723 g_cdvdman_iocache = 0;
726 "%sCache_%d_%d_%d_%d",
727 g_cdvdman_cache_name,
730 (
int)fh->m_file_size,
732 cache_remove_result = 0;
733 VERBOSE_KPRINTF(1,
"Cachefile:%s Open_or_Close:%d\n", cache_filename, open_or_close);
740 fh->m_fd_rbsize = g_cdvdman_cache_sector_size_count ? (g_cdvdman_cache_sector_size_count << 11) : 0x800;
741 fh->m_fd_rcvbuf = (u8 *)AllocSysMemory(ALLOC_LAST, fh->m_fd_rbsize, 0);
742 if ( !fh->m_fd_rcvbuf )
744 VERBOSE_KPRINTF(1,
"Rcvbuf MemAlloc Fail\n");
749 fh->m_cache_file_fd = -1;
750 cache_result = open(cache_filename, O_TRUNC | O_CREAT | O_RDWR, 0x1ff );
751 cache_file_fd_new = cache_result;
752 if ( cache_result >= 0 )
754 u32 file_size_sectors;
755 unsigned int file_size_bsr_6;
757 file_size_sectors = (fh->m_file_size >> 11) + ((!!((fh->m_file_size & 0x7FF))));
758 file_size_bsr_3 = (file_size_sectors >> 3) + (!!(file_size_sectors & 7));
759 file_size_bsr_6 = (file_size_bsr_3 >> 3) + (!!((file_size_bsr_3 & 7)));
760 file_size_bsr_17 = (file_size_bsr_6 >> 11) + (!!((file_size_bsr_6 & 0x7FF)));
761 ioctl_arg = (file_size_bsr_17 + file_size_sectors + 8) << 11;
762 for ( i = 0; i < fh->m_fd_rbsize; i += 1 )
764 fh->m_fd_rcvbuf[i] = 0;
766 if ( !strncmp(cache_filename,
"pfs", 3) )
768 cache_result = ioctl2(cache_file_fd_new, PIOCALLOC, &ioctl_arg, 4, 0, 0);
771 if ( cache_result >= 0 )
773 cache_result = lseek(cache_file_fd_new, 0, 0);
775 if ( cache_result >= 0 )
777 for ( i = 0; i <= 0x7FFF; i += 1 )
779 ((
char *)g_cdvdman_temp_buffer_ptr)[i] = 0;
781 for ( i = 0; (int)i < (int)(ioctl_arg >> 15); i += 1 )
783 cache_result = write(cache_file_fd_new, g_cdvdman_temp_buffer_ptr, 0x8000);
784 if ( cache_result != 0x8000 )
786 if ( cache_result >= 0 )
794 if ( cache_result >= 0 )
796 for ( i = 0; (int)i < (int)((ioctl_arg >> 11) - 0x10 * (ioctl_arg >> 15)); i += 1 )
798 cache_result = write(cache_file_fd_new, fh->m_fd_rcvbuf, 0x800);
799 if ( cache_result != 0x800 )
801 if ( cache_result >= 0 )
810 if ( !open_or_close || cache_result < 0 )
812 if ( fh->m_cache_file_fd != -1 )
814 cache_remove_result = close(fh->m_cache_file_fd);
815 VERBOSE_KPRINTF(1,
"Cache File Close: %d\n", cache_remove_result);
816 if ( cache_remove_result >= 0 )
818 if ( !strncmp(cache_filename,
"pfs", 3) )
820 cache_remove_result = remove(cache_filename);
822 else if ( !strncmp(cache_filename,
"host", 4) )
824 cache_remove_result = 0;
825 remove(cache_filename);
827 VERBOSE_KPRINTF(1,
"Cache File %s remove: %d\n", cache_filename, cache_remove_result);
830 fh->m_cache_file_fd = -1;
831 fh->m_max_cluster = 0;
832 fh->m_cluster_cur = -1;
833 fh->m_sector_count_total = 0;
835 FreeSysMemory(fh->m_fd_rcvbuf);
838 if ( cache_result < 0 )
840 VERBOSE_KPRINTF(1,
"cdvd_odcinit Open Error %d\n", cache_result);
842 if ( cache_remove_result < 0 )
844 VERBOSE_KPRINTF(1,
"cdvd_odcinit Close Error %d\n", cache_remove_result);
846 return (!open_or_close) ? cache_remove_result : cache_result;
848 fh->m_sector_count_total = file_size_bsr_17 << 11;
849 fh->m_cache_file_fd = cache_file_fd_new;
850 fh->m_max_cluster = (
void *)file_size_bsr_3;
851 fh->m_cluster_cur = -1;
852 VERBOSE_KPRINTF(1,
"Cache File Maked\n");
861 if ( fh->m_cluster_cur == -1 )
865 fh->m_cluster_cur = -1;
866 for ( i = 0; i < fh->m_fd_rbsize; i += 1 )
868 fh->m_fd_rcvbuf[i] = 0;
870 fileio_res = lseek(fh->m_cache_file_fd, 0, 0);
871 if ( fileio_res >= 0 )
873 for ( i = 0; i < ((
unsigned int)fh->m_sector_count_total >> 11); i += 1 )
875 fileio_res = write(fh->m_cache_file_fd, fh->m_fd_rcvbuf, 0x800);
876 if ( fileio_res < 0 )
882 if ( fileio_res >= 0 )
886 fh->m_fd_flags &= ~4;
887 cdvd_odcinit(fh, 0, index);
891static int cdvdman_invcaches()
895 for ( i = 0; i < (
sizeof(g_cdvdman_fhinfo) /
sizeof(g_cdvdman_fhinfo[0])); i += 1 )
897 if ( (g_cdvdman_fhinfo[i].m_fd_flags & 4) )
899 cdvdman_cache_invalidate(&g_cdvdman_fhinfo[i], i);
905static int cdrom_internal_cache_read(
const iop_file_t *f,
int nbytes)
908 s16 readpos_plus_nbytes;
909 unsigned int readpos_plus_nbytes_bsr_14;
914 fh = &g_cdvdman_fhinfo[(int)f->
privdata];
915 if ( cdvdman_devready() < 0 )
917 g_cdvdman_iocache = 0;
920 if ( fh->m_cluster_cur == -1 )
922 if ( (
void *)(8 * fh->m_fd_rbsize) < fh->m_max_cluster )
924 fh->m_cluster_cur = (fh->m_read_pos >> 14) & ~0x7;
926 lseek(fh->m_cache_file_fd, fh->m_cluster_cur >> 3, 0) < 0
927 || read(fh->m_cache_file_fd, fh->m_fd_rcvbuf, fh->m_fd_rbsize) < 0 )
929 fh->m_cluster_cur = -1;
935 fh->m_cluster_cur = -2;
938 readpos_plus_nbytes = fh->m_read_pos + nbytes;
939 readpos_plus_nbytes_bsr_14 = (readpos_plus_nbytes >> 14) - (!(readpos_plus_nbytes & 0x3FFF));
940 readpos_bsr_14 = fh->m_read_pos >> 14;
942 1,
"max_claster %d meta_size_clst %d claster_cur %d\n", fh->m_max_cluster, 8 * fh->m_fd_rbsize, fh->m_cluster_cur);
943 cluster_cur = fh->m_cluster_cur;
944 if ( cluster_cur < 0 )
949 (
unsigned int)readpos_bsr_14 < (
unsigned int)cluster_cur
950 || readpos_plus_nbytes_bsr_14 >= cluster_cur + 8 * fh->m_fd_rbsize )
952 int cluster_write_tmp2;
953 unsigned int readpos_band;
955 if ( lseek(fh->m_cache_file_fd, cluster_cur >> 3, 0) < 0 )
957 fh->m_cluster_cur = -1;
960 cluster_write_tmp2 = (
unsigned int)fh->m_max_cluster >= fh->m_cluster_cur + 8 * fh->m_fd_rbsize ?
962 ((unsigned int)fh->m_max_cluster - fh->m_cluster_cur + 7) >> 3;
963 if ( write(fh->m_cache_file_fd, fh->m_fd_rcvbuf, cluster_write_tmp2) != cluster_write_tmp2 )
965 fh->m_cluster_cur = -1;
968 readpos_band = readpos_bsr_14 & ~0x7;
969 fh->m_cluster_cur = readpos_band;
970 readpos_band += (readpos_bsr_14 < 0) ? 7 : 0;
971 if ( (lseek(fh->m_cache_file_fd, readpos_band >> 3, 0) < 0) || (read(fh->m_cache_file_fd, fh->m_fd_rcvbuf, ( (
unsigned int)fh->m_max_cluster < fh->m_cluster_cur + 8 * fh->m_fd_rbsize ) ? (((
unsigned int)fh->m_max_cluster - fh->m_cluster_cur + 7) >> 3) : (fh->m_fd_rbsize)) < 0) )
973 fh->m_cluster_cur = -1;
976 cluster_cur = fh->m_cluster_cur;
978 for ( i = readpos_bsr_14; i <= readpos_plus_nbytes_bsr_14; i += 1 )
980 if ( !(((
int)fh->m_fd_rcvbuf[(i - cluster_cur) >> 3] >> ((i - cluster_cur) & 7)) & 1) )
985 return i <= readpos_plus_nbytes_bsr_14;
988static int cdrom_internal_write_cache(
const iop_file_t *f,
unsigned int nbytes)
1001 g_cdvdman_iocache = 0;
1002 if ( cdvdman_devready() < 0 )
1006 fh = &g_cdvdman_fhinfo[(int)f->
privdata];
1007 if ( nbytes > fh->m_file_size - fh->m_read_pos )
1009 nbytes = fh->m_file_size - fh->m_read_pos;
1015 VERBOSE_KPRINTF(1,
"_cdvdfile_cache_read %d<->%d\n", fh->m_read_pos, fh->m_read_pos + nbytes);
1016 cur = ((fh->m_read_pos + nbytes) >> 14) - (!((fh->m_read_pos + nbytes) & 0x3FFF));
1017 rst = fh->m_read_pos >> 14;
1018 cluster_cur = (fh->m_cluster_cur >= 0) ? fh->m_cluster_cur : 0;
1019 cdvdman_iormode(&rmode, fh->m_filemode, f->
unit);
1021 VERBOSE_KPRINTF(1,
"cache_fill rst:%d<->%d cur:%d cnt:%d\n", rst, cur, fh->m_read_pos, nbytes);
1022 for ( i = rst; i <= cur; i += 1 )
1026 "FIO Usr addr LSN:%d SEC:%d ADDR:%08x cpos= %d\n",
1027 fh->m_file_lsn + 8 * i,
1029 g_cdvdman_temp_buffer_ptr,
1030 (i * 0x4000) + fh->m_sector_count_total);
1031 if ( !(((
int)fh->m_fd_rcvbuf[(i - cluster_cur) >> 3] >> ((i - cluster_cur) & 7)) & 1) )
1034 while ( !
sceCdRE(fh->m_file_lsn + 8 * i, 8u, g_cdvdman_temp_buffer_ptr, &rmode) )
1038 g_cdvdman_iocache = 0;
1046 if ( Error || tray_open )
1048 VERBOSE_KPRINTF(0,
"Read Error= 0x%02x\n", Error);
1051 lseek_result = lseek(fh->m_cache_file_fd, (i * 0x4000) + fh->m_sector_count_total, 0);
1052 if ( lseek_result < 0 )
1054 return lseek_result;
1056 write_ret = write(fh->m_cache_file_fd, g_cdvdman_temp_buffer_ptr, 0x4000);
1057 if ( write_ret != 0x4000 )
1059 VERBOSE_KPRINTF(1,
"write: ret:%d\n", write_ret);
1060 if ( write_ret >= 0 )
1066 fh->m_fd_rcvbuf[(i - cluster_cur) >> 3] |= 1 << ((i - cluster_cur) & 7);
1072static int cdvdfile_cache_read(
const iop_file_t *f,
void *buf,
int nbyte)
1082 fh = &g_cdvdman_fhinfo[(int)f->
privdata];
1084 ((
unsigned int)nbyte > fh->m_file_size - fh->m_read_pos) ? fh->m_file_size - fh->m_read_pos : (unsigned int)nbyte;
1085 VERBOSE_KPRINTF(1,
"_cdvdfile_cache_read %d<->%d\n", fh->m_read_pos, fh->m_read_pos + nbyte_tmp);
1087 if ( nbyte_tmp > 0 )
1089 fd_result = lseek(fh->m_cache_file_fd, fh->m_read_pos + fh->m_sector_count_total, 0);
1090 if ( fd_result >= 0 )
1092 fd_result = read(fh->m_cache_file_fd, buf, nbyte_tmp);
1093 fh->m_read_pos += (fd_result >= 0) ? fd_result : 0;
1099static int cdvdfile_cache_fill_read(
const iop_file_t *f,
void *buf,
int nbytes)
1103 op_result = cdvdman_devready();
1104 if ( op_result >= 0 )
1106 op_result = cdrom_internal_write_cache(f, nbytes);
1110 g_cdvdman_iocache = 0;
1112 if ( op_result >= 0 )
1114 op_result = cdvdfile_cache_read(f, buf, nbytes);
1119static int cdrom_open(
iop_file_t *f,
const char *name,
int mode,
int arg4)
1134 VERBOSE_PRINTF(1,
"fileIO OPEN name= %s mode= 0x%08x layer %d\n", name, mode, f->
unit);
1135 WaitEventFlag(g_fio_fsv_evid, 1, WEF_AND | WEF_CLEAR, &efbits);
1138 for ( i = 0; i < (
sizeof(g_cdvdman_fhinfo) /
sizeof(g_cdvdman_fhinfo[0])); i += 1 )
1140 if ( !g_cdvdman_fhinfo[i].m_fd_flags && !emptyfdfound )
1145 if ( (g_cdvdman_fhinfo[i].m_fd_flags & 8) )
1150 if ( !emptyfdfound || streamfdfound )
1152 PRINTF(
"open fail name %s\n", name);
1153 SetEventFlag(g_fio_fsv_evid, 1);
1157 fh = &g_cdvdman_fhinfo[fds1];
1158 strncpy(filename, name,
sizeof(filename));
1159 cdvdman_cdfname(filename);
1160 g_cdvdman_srchspd = (!(mode & 0x40000000) && !cdvdman_l0check(f->
unit)) ?
1161 ((g_cdvdman_spinnom == -1) ? (u16)mode : g_cdvdman_spinnom !=
SCECdSpinStm) :
1163 if ( (
unsigned int)(f->
unit) >= 2u )
1169 if ( !strncmp(name,
"sce_cdvd_lsn", 12) )
1171 strncpy(filename, name,
sizeof(filename));
1173 for ( i = 12; i < (
sizeof(filename) - 5) && filename[i] && filename[i] !=
'_'; i += 1 )
1175 if ( !filename[i] || i >= (
sizeof(filename) - 5) )
1181 fp.size = strtol(&filename[i + 5], 0, 10);
1183 fp.lsn = strtol(&filename[12], 0, 10);
1186 if ( cdvdman_devready() < 0 || !DvdDual_infochk() )
1192 fp.lsn += g_cdvdman_istruct.m_layer_1_lsn;
1199 devready_tmp = cdvdman_devready();
1200 if ( devready_tmp < 0 )
1202 SetEventFlag(g_fio_fsv_evid, 1);
1203 return devready_tmp;
1211 if ( devready_tmp < 0 )
1213 PRINTF(
"open fail name %s\n", filename);
1214 SetEventFlag(g_fio_fsv_evid, 1);
1215 return devready_tmp;
1218 g_cdvdman_srchspd = 0;
1219 if ( (mode & 0x40000000) )
1222 memset(&rmode, 0,
sizeof(rmode));
1225 rmode.
trycount = (g_cdvdman_trycnt != -1) ? g_cdvdman_trycnt : 0;
1230 SetEventFlag(g_fio_fsv_evid, 1);
1233 g_cdvdman_strmerr = 0;
1234 fh->m_fd_flags |= 8;
1236 fh->m_file_lsn = fp.lsn;
1238 fh->m_filemode = mode & ~0x40000000;
1239 fh->m_file_size = fp.size;
1240 fh->m_fd_layer = f->
unit;
1241 if ( (mode & 0x50000000) == 0x10000000 )
1244 if ( g_cache_path_fd != -1 )
1246 devready_tmp = cdvd_odcinit(fh, 1, (
int)f->
privdata);
1247 if ( devready_tmp >= 0 )
1249 fh->m_fd_flags |= 4;
1253 if ( devready_tmp < 0 )
1259 fh->m_file_size = 0;
1261 SetEventFlag(g_fio_fsv_evid, 1);
1262 return devready_tmp;
1265 SetEventFlag(g_fio_fsv_evid, 1);
1274 VERBOSE_PRINTF(1,
"fileIO CLOSE\n");
1275 WaitEventFlag(g_fio_fsv_evid, 1, WEF_AND | WEF_CLEAR, &efbits);
1276 fh = &g_cdvdman_fhinfo[(int)f->
privdata];
1277 if ( (fh->m_fd_flags & 8) )
1279 g_cdvdman_strmerr = 0;
1283 SetEventFlag(g_fio_fsv_evid, 1);
1287 if ( ((fh->m_fd_flags & 0xC) == 4 && cdvd_odcinit(fh, 0, (
int)f->
privdata) < 0) )
1289 SetEventFlag(g_fio_fsv_evid, 1);
1293 fh->m_file_size = 0;
1299 SetEventFlag(g_fio_fsv_evid, 1);
1303static int cdrom_internal_read(
const iop_file_t *f,
char *addr,
int nbytes)
1305 unsigned int sectors;
1308 int nbytes_div_2048;
1311 unsigned int sectors_count;
1315 unsigned int filesize_bsr_11;
1320 VERBOSE_PRINTF(1,
"cdvd fileIO read start\n");
1321 op_result = cdvdman_devready();
1322 if ( op_result < 0 )
1324 g_cdvdman_iocache = 0;
1327 fh = &g_cdvdman_fhinfo[(uiptr)f->
privdata];
1328 cdvdman_iormode(&rmode, fh->m_filemode, f->
unit);
1333 if ( (
unsigned int)nbytes > fh->m_file_size - fh->m_read_pos )
1335 nbytes = fh->m_file_size - fh->m_read_pos;
1337 filesize_bsr_11 = (fh->m_file_size >> 11) + (!!((fh->m_file_size & 0x7FF))) + fh->m_file_lsn;
1339 1,
"fds= %d read file_lbn= %d offset= %d\n", (
int)(uiptr)f->
privdata, (
int)fh->m_file_lsn, (
int)fh->m_read_pos);
1341 for ( i = 0; i < nbytes; i += nbytes_segment )
1349 nbytes_cur = nbytes - i;
1350 if ( g_cdvdman_spinctl != -1 )
1353 switch ( g_cdvdman_spinctl )
1379 lbn = fh->m_file_lsn + ((fh->m_read_pos + i) >> 11);
1381 pos_extra = (fh->m_read_pos + i) & 0x7FF;
1382 if ( nbytes_cur <= 0x4000 )
1384 nbytes_segment = nbytes_cur;
1385 nbytes_div_2048 = (nbytes_cur / 0x800) + (!!((nbytes_cur & 0x7FF)));
1386 sectors = nbytes_div_2048 + (!!pos_extra);
1390 nbytes_segment = 0x4000;
1391 if ( buf && ((fh->m_read_pos + i) & 0x7FF) && g_cdvdman_iocache )
1394 pos_sub_2048 = 0x800 - pos_extra;
1396 &addr[i], &((
const char *)g_cdvdman_temp_buffer_ptr)[0x800 * (sectors - 1) + pos_extra], 0x800 - pos_extra);
1397 g_cdvdman_iocache = 0;
1402 sectors = 8 + (!!(((fh->m_read_pos + i) & 0x7FF)));
1405 buf = g_cdvdman_temp_buffer_ptr;
1406 if ( (
unsigned int)(sectors) > filesize_bsr_11 - lbn )
1408 sectors = filesize_bsr_11 - lbn;
1410 VERBOSE_PRINTF(1,
"sce_Read LBN= %d sectors= %d\n", (
int)lbn, (
int)sectors);
1412 g_cdvdman_iocache && (lbn >= g_cdvdman_lcn_offset)
1413 && (g_cdvdman_lcn_offset + g_cdvdman_numbytes_offset >= lbn + sectors) )
1415 optimized_memcpy(&addr[i], &((
char *)buf)[0x800 * (lbn - g_cdvdman_lcn_offset) + pos_extra], nbytes_segment);
1417 else if ( ((uiptr)(addr + i) & 3) || pos_extra || (nbytes_segment != 0x4000) )
1419 sec = (sectors >= 8) ? sectors : 8;
1420 if ( sec > filesize_bsr_11 - lbn )
1422 sec = filesize_bsr_11 - lbn;
1424 VERBOSE_PRINTF(1,
"FIO Cache LSN:%d SEC:%d ADDR:%08x\n", (
int)lbn, (
int)sec, (
unsigned int)(uiptr)buf);
1425 sectors_count = (sec >= 9) ? (sec - 8) : 0;
1426 if ( sectors_count )
1428 while ( !
sceCdRE(lbn, sectors_count, buf, &rmode) )
1430 VERBOSE_PRINTF(1,
"sce_Read ON Delay\n");
1433 g_cdvdman_iocache = 0;
1434 g_cdvdman_spinctl = -1;
1443 PRINTF(
"Read Error= 0x%02x\n", Error);
1444 g_cdvdman_iocache = 0;
1448 while ( !
sceCdRE(lbn + sectors_count, sec - sectors_count, (
char *)buf + 0x800 * sectors_count, &rmode) )
1450 VERBOSE_PRINTF(1,
"sce_Read ON Delay\n");
1453 g_cdvdman_iocache = 0;
1454 g_cdvdman_spinctl = -1;
1463 PRINTF(
"Read Error= 0x%02x\n", Error);
1464 g_cdvdman_iocache = 0;
1467 g_cdvdman_lcn_offset = lbn_tmp;
1468 g_cdvdman_numbytes_offset = sec;
1469 g_cdvdman_iocache = 1;
1471 &addr[pos_sub_2048 + i],
1472 &((
const char *)g_cdvdman_temp_buffer_ptr)[!pos_sub_2048 ? pos_extra : 0],
1473 nbytes_segment - pos_sub_2048);
1478 1,
"FIO Usr addr LSN:%d SEC:%d ADDR:%08x\n", (
int)lbn, (
int)sectors, (
unsigned int)(uiptr)(addr + i));
1479 while ( !
sceCdRE(lbn, sectors, addr + i, &rmode) )
1481 VERBOSE_PRINTF(1,
"sce_Read ON Delay\n");
1484 g_cdvdman_iocache = 0;
1485 g_cdvdman_spinctl = -1;
1492 g_cdvdman_iocache = 0;
1495 PRINTF(
"Read Error= 0x%02x\n", read_error);
1499 if ( nbytes_segment <= 0 )
1501 g_cdvdman_spinctl = -1;
1502 return nbytes_segment;
1505 fh->m_read_pos += i;
1506 VERBOSE_PRINTF(1,
"fileIO read ended\n");
1507 g_cdvdman_spinctl = -1;
1511static int cdrom_stream_read(
const iop_file_t *f,
char *bbuf,
int nbytes)
1517 fh = &g_cdvdman_fhinfo[(int)f->
privdata];
1518 g_cdvdman_strmerr = 0;
1519 cdvdman_iormode(&rmode, fh->m_filemode, f->
unit);
1524 fh->m_read_pos += buf << 11;
1528static int cdrom_read(
iop_file_t *f,
void *buf,
int nbytes)
1538 WaitEventFlag(g_fio_fsv_evid, 1, WEF_AND | WEF_CLEAR, &efbits);
1539 fh = &g_cdvdman_fhinfo[(int)f->
privdata];
1540 if ( cdvdman_mediactl(2) )
1542 g_cdvdman_iocache = 0;
1543 cdvdman_invcaches();
1545 if ( (fh->m_fd_flags & 8) )
1547 rc = cdrom_stream_read(f, (
char *)buf, nbytes);
1551 if ( !(fh->m_fd_flags & 4) )
1553 rc = cdrom_internal_read(f, (
char *)buf, nbytes);
1557 rc = cdrom_internal_cache_read(f, nbytes);
1564 fh->m_fd_flags &= ~4;
1566 cdvd_odcinit(fh, 0, (
int)f->
privdata);
1570 rc = cdvdfile_cache_fill_read(f, buf, nbytes);
1571 VERBOSE_KPRINTF(1,
"called _cdvdfile_cache_fill_read %d\n", rc);
1577 rc = cdvdfile_cache_read(f, buf, nbytes);
1578 VERBOSE_KPRINTF(1,
"called _cdvdfile_cache_read %d\n", rc);
1582 cdvdman_cache_invalidate(fh, (
int)f->
privdata);
1583 KPRINTF(
"_cdvdfile_cache Read_err OR Drive_not_ready\n", rc);
1587 rc = cdrom_internal_read(f, (
char *)buf, nbytes);
1591 SetEventFlag(g_fio_fsv_evid, 1);
1595static int cdrom_ioctl(
iop_file_t *f,
int arg,
void *param)
1602 g_cdvdman_spinnom = -1;
1610static int cdrom_ioctl2(
iop_file_t *f,
int request,
void *argp,
size_t arglen,
void *bufp,
size_t buflen)
1621 WaitEventFlag(g_fio_fsv_evid, 1, WEF_AND | WEF_CLEAR, &efbits);
1622 fh = &g_cdvdman_fhinfo[(int)f->
privdata];
1624 if ( (fh->m_fd_flags & 8) )
1628 case CIOCSTREAMPAUSE:
1635 case CIOCSTREAMRESUME:
1642 case CIOCSTREAMSTAT:
1651 SetEventFlag(g_fio_fsv_evid, 1);
1656cdrom_devctl(
iop_file_t *f,
const char *name,
int cmd,
void *argp,
unsigned int arglen,
void *bufp,
unsigned int buflen)
1661 unsigned int sc_tmp_3;
1671 if ( cmd != CDIOC_BREAK )
1673 WaitEventFlag(g_fio_fsv_evid, 1, WEF_AND | WEF_CLEAR, &efbits);
1677 case CDIOC_READCLOCK:
1678 for ( i = 0; i < 3 && !retval2; i += 1 )
1680 WaitEventFlag(g_scmd_evid, 1, WEF_AND, &efbits);
1683 retval2 = (retval2 != 1) ? -
EIO : 0;
1685#ifdef CDVD_VARIANT_DNAS
1687 for ( i = 0; i < 3 && !retval2; i += 1 )
1689 WaitEventFlag(g_scmd_evid, 1, WEF_AND, &efbits);
1692 retval2 = (retval2 != 1) ? -
EIO : 0;
1698 case CDIOC_GETDISKTYP:
1701 case CDIOC_GETERROR:
1702 *(u32 *)bufp = g_cdvdman_strmerr ? g_cdvdman_strmerr :
sceCdGetError();
1710 case CDIOC_POWEROFF:
1711 for ( i = 0; i < 3 && !retval2; i += 1 )
1713 WaitEventFlag(g_scmd_evid, 1, WEF_AND, &efbits);
1716 retval2 = (retval2 != 1) ? -
EIO : 0;
1724#ifdef CDVD_VARIANT_DNAS
1726 for ( i = 0; i < 3 && !retval2; i += 1 )
1728 WaitEventFlag(g_scmd_evid, 1, WEF_AND, &efbits);
1731 retval2 = (retval2 != 1) ? -
EIO : 0;
1734 case CDIOC_STREAMINIT:
1736 retval2 = (!
sceCdStInit(*(u32 *)argp, *((u32 *)argp + 1), (
void *)*((u32 *)argp + 2))) ? -
EIO : 0;
1749 g_cdvdman_trycnt = *(u8 *)argp;
1780 case CDIOC_SETTIMEOUT:
1783 case CDIOC_READDVDDUALINFO:
1806 *(u32 *)bufp = sceCdSC(0xFFFFFFF5, &scres_unused);
1809 retval2 = (
sceCdApplySCmd(*(u8 *)argp, (
char *)argp + 4, arglen - 4, bufp) != 1) ? -
EIO : 0;
1811 case CDIOC_FSCACHEINIT:
1813 if ( g_cache_path_fd != -1 )
1818 sc_tmp_2 = (
char *)argp;
1819 for ( i = 0; i < arglen && sc_tmp_2[i] && sc_tmp_2[i] !=
','; i += 1 )
1821 g_cdvdman_cache_name[i] = sc_tmp_2[i];
1827 for ( ; (i < arglen) && sc_tmp_2[i] && sc_tmp_2[i] !=
','; i += 1 )
1834 g_cdvdman_cache_sector_size_count = strtol((
const char *)argp + sc_tmp_3, 0, 10);
1835 retval2 = path_tbl_init(strtol(&sc_tmp_2[i + 1], 0, 10), g_cdvdman_cache_name, 1);
1838 case CDIOC_FSCACHEDELETE:
1839 for ( i = 0; i < (
sizeof(g_cdvdman_fhinfo) /
sizeof(g_cdvdman_fhinfo[0])); i += 1 )
1841 if ( (g_cdvdman_fhinfo[i].m_fd_flags & 4) )
1846 retval2 = (i == (
sizeof(g_cdvdman_fhinfo) /
sizeof(g_cdvdman_fhinfo[0]))) ? path_tbl_init(0, 0, 0) : -
EBUSY;
1852 if ( cmd != CDIOC_BREAK )
1854 SetEventFlag(g_fio_fsv_evid, 1);
1859static int cdrom_lseek(
iop_file_t *f,
int offset,
int pos)
1866 VERBOSE_PRINTF(1,
"fileIO SEEK\n");
1867 WaitEventFlag(g_fio_fsv_evid, 1, WEF_AND | WEF_CLEAR, &efbits);
1868 fh = &g_cdvdman_fhinfo[(int)f->
privdata];
1875 retval = fh->m_read_pos + offset;
1878 retval = fh->m_file_size - offset;
1883 if ( retval > (
int)(fh->m_file_size) )
1885 retval = fh->m_file_size;
1887 fh->m_read_pos = retval;
1888 if ( (fh->m_fd_flags & 8) )
1896 SetEventFlag(g_fio_fsv_evid, 1);
1902 KPRINTF(
"Cdvd Time Out %d(msec)\n", sys_clock->lo / 0x9000);
1908 if ( !sceCdCheckCmd() || g_cdvdman_istruct.m_read2_flag )
1915 g_cdvdman_sync_timeout = timeout;
1918 g_cdvdman_stream_timeout = timeout;
1931 VERBOSE_KPRINTF(1,
"sceCdSync: Call mode %d Com %x\n", mode, (u8)g_cdvdman_istruct.m_cdvdman_command);
1935 while ( !sceCdCheckCmd() || g_cdvdman_istruct.m_read2_flag )
1937 WaitEventFlag(g_cdvdman_intr_efid, 1, WEF_AND, &efbits);
1941 return !!(!sceCdCheckCmd() || (g_cdvdman_istruct.m_read2_flag));
1944 sysclk.lo = 0x9000 * g_cdvdman_sync_timeout;
1945 vSetAlarm(&sysclk, (
unsigned int (*)(
void *))sync_timeout_alarm_cb, &sysclk);
1946 while ( !sceCdCheckCmd() || g_cdvdman_istruct.m_read2_flag )
1948 WaitEventFlag(g_cdvdman_intr_efid, 1, WEF_AND, &efbits);
1950 vCancelAlarm((
unsigned int (*)(
void *))sync_timeout_alarm_cb, &sysclk);
1954 sysclk.lo = 0x41EB0000;
1955 vSetAlarm(&sysclk, (
unsigned int (*)(
void *))sync_timeout_alarm_cb, &sysclk);
1956 while ( !sceCdCheckCmd() || g_cdvdman_istruct.m_read2_flag )
1958 WaitEventFlag(g_cdvdman_intr_efid, 1, WEF_AND, &efbits);
1960 vCancelAlarm((
unsigned int (*)(
void *))sync_timeout_alarm_cb, &sysclk);
1963 while ( !sceCdCheckCmd() )
1965 WaitEventFlag(g_cdvdman_intr_efid, 1, WEF_AND, &efbits);
1970 sysclk.lo = 0x9000 * g_cdvdman_sync_timeout;
1971 vSetAlarm(&sysclk, (
unsigned int (*)(
void *))sync_timeout_alarm_cb, &sysclk);
1972 while ( !sceCdCheckCmd() || g_cdvdman_istruct.m_read2_flag )
1974 WaitEventFlag(g_cdvdman_intr_efid, 1, WEF_AND, &efbits);
1976 vCancelAlarm((
unsigned int (*)(
void *))sync_timeout_alarm_cb, &sysclk);
1979 while ( !sceCdCheckCmd() || g_cdvdman_istruct.m_read2_flag || g_cdvdman_ee_rpc_fno
1980 || g_cdvdman_istruct.m_stream_flag )
1982 WaitEventFlag(g_cdvdman_intr_efid, 1, WEF_AND, &efbits);
1983 if ( g_cdvdman_ee_rpc_fno )
1991 !sceCdCheckCmd() || g_cdvdman_istruct.m_read2_flag || g_cdvdman_ee_rpc_fno
1992 || (g_cdvdman_istruct.m_stream_flag));
1994 WaitEventFlag(g_cdvdman_intr_efid, 0x21, WEF_OR, &efbits);
1995 ReferEventFlagStatus(g_cdvdman_intr_efid, &efinfo);
1998 if ( g_cdvdman_istruct.m_last_error )
2000 SetEventFlag(g_cdvdman_intr_efid, 0x20);
2004 WaitEventFlag(g_cdvdman_intr_efid, 0x20, WEF_AND, &efbits);
2009 while ( !sceCdCheckCmd() || g_cdvdman_istruct.m_read2_flag )
2011 WaitEventFlag(g_cdvdman_intr_efid, 1, WEF_AND, &efbits);
2017 "sceCdSync: Command= %d Error= %d\n",
2018 (u8)g_cdvdman_istruct.m_cdvdman_command,
2019 (u8)g_cdvdman_istruct.m_last_error);
2025 VERBOSE_KPRINTF(1,
"sceCdSpinCtrlIOP speed= %d\n", speed);
2026 g_cdvdman_spinctl = speed;
2036 if ( PollEventFlag(g_sfile_evid, 1, WEF_AND | WEF_CLEAR, &efbits) == KE_EVF_COND )
2040 for ( i = 0; i < ((
sizeof(g_cdvdman_sfname) /
sizeof(g_cdvdman_sfname[0])) - 1) && path[i]; i += 1 )
2042 g_cdvdman_sfname[i] = path[i];
2044 g_cdvdman_sfname[i] = 0;
2045 g_cdvdman_srchspd = 1;
2047 vSetEventFlag(g_sfile_evid, 1);
2058 return cdvdman_gettoc(
toc);
2064 USE_DEV5_MMIO_HWPORT();
2067 VERBOSE_KPRINTF(1,
"DISK READY call from iop\n");
2071 VERBOSE_KPRINTF(1,
"Wait Drive Ready %x\n", dev5_mmio_hwport->m_dev5_reg_005);
2074 if ( !g_cdvdman_istruct.m_read2_flag )
2083 case SCECdDETCTDVDS:
2084 case SCECdDETCTDVDD:
2089 while ( (dev5_mmio_hwport->m_dev5_reg_005 & 0xC0) != 0x40 )
2092 WaitEventFlag(g_cdvdman_intr_efid, 1, WEF_AND, &efbits);
2097 return (u8)dev5_mmio_hwport->m_dev5_reg_005;
2100 if ( (dev5_mmio_hwport->m_dev5_reg_005 & 0xC0) == 0x40 && !g_cdvdman_istruct.m_read2_flag )
2104 VERBOSE_KPRINTF(1,
"Drive Not Ready\n");
2111 USE_DEV5_MMIO_HWPORT();
2113 return (u8)dev5_mmio_hwport->m_dev5_reg_00F;
2120 USE_DEV5_MMIO_HWPORT();
2122 reg_00A_tmp = dev5_mmio_hwport->m_dev5_reg_00A;
2128 if ( !g_cdvdman_istruct.m_tray_is_open && cdvdman_scmd_sender_03_48(&rdata_tmp, &status_tmp) == 1 && !status_tmp )
2130 reg_00A_tmp &= ~SCECdStatShellOpen;
2131 if ( (rdata_tmp & 8) )
2136 if ( (reg_00A_tmp & 0x1E) )
2141 if ( g_cdvdman_istruct.m_use_toc )
2143 reg_00A_tmp &= ~SCECdStatShellOpen;
2145 if ( g_cdvdman_istruct.m_power_flag )
2154 p->sector = 16 * ((i + 150) % 75 / 10) + (i + 150) % 75 % 10;
2155 p->second = 16 * ((i + 150) / 75 % 60 / 10) + (i + 150) / 75 % 60 % 10;
2156 p->minute = 16 * ((i + 150) / 75 / 60 / 10) + (i + 150) / 75 / 60 % 10;
2162 return 75 * (60 * (10 * (p->minute >> 4) + (p->minute & 0xF)) + 10 * (p->second >> 4) + (p->second & 0xF))
2163 + 10 * (p->sector >> 4) + (p->sector & 0xF) - 150;
2166#ifdef CDVD_VARIANT_DNAS
2167static int read_id_from_rom(
int mode,
int *buf)
2177 for ( i = 0; i < (
sizeof(idinfo) /
sizeof(idinfo[0])); i += 1 )
2179 for ( j = 0; j <
sizeof(chksumstk); j += 1 )
2181 ((
char *)&idinfo)[(i * 4) + j] = ((
char *)0xBFBF0000)[(i * 4) + j];
2182 ((
char *)&chksumstk)[j] = ((
char *)0xBFBF0000)[(i * 4) + j];
2184 chksumint += chksumstk;
2186 for ( ; i < 0x4000; i += 1 )
2188 for ( j = 0; j <
sizeof(chksumstk); j += 1 )
2190 ((
char *)&chksumstk)[j] = ((
char *)0xBFBF0000)[(i * 4) + j];
2192 chksumint += chksumstk;
2196 KPRINTF(
"# checksum error %d\n", chksumint);
2211static int query_boot_mode_6_nonzero()
2215 BootMode = QueryBootMode(6);
2216 return !(!BootMode || (*(u16 *)BootMode & 0xFFFC) != 0x60);
2219static int query_boot_mode_6_zero()
2221 return !QueryBootMode(6);
2224static int cdvdman_readID(
int mode,
int *buf)
2231 if ( query_boot_mode_6_nonzero() )
2233 if ( read_id_from_rom(mode, buf) && mode == 1 )
2245 if ( query_boot_mode_6_zero() )
2247 if ( !
sceCdRI(id_val, &id_result) || id_result )
2254 if ( !g_readid_systemtime.lo && !g_readid_systemtime.hi )
2256 GetSystemTime(&sysclk);
2257 g_readid_systemtime = sysclk;
2263 *buf = *(u32 *)id_val >> 8;
2267 *buf = id_val[0] | 0x8004600;
2268 buf[1] = *(u32 *)&id_val[4];
2276 return cdvdman_readID(0, (
int *)guid);
2281 return cdvdman_readID(1, (
int *)
id);
2285int sceCdStInit(u32 bufmax, u32 bankmax,
void *buffer)
2290 memset(&devctl_req, 0,
sizeof(devctl_req));
2291 devctl_req.m_cmdid = 5;
2292 devctl_req.m_posszarg1 = bufmax;
2293 devctl_req.m_posszarg2 = bankmax;
2294 devctl_req.m_buffer = buffer;
2295 return (devctl(
"cdrom_stm0:", 0x4393, &devctl_req,
sizeof(devctl_req), &buf, 4) >= 0) ? buf : 0;
2303 memset(&devctl_req, 0,
sizeof(devctl_req));
2304 devctl_req.m_rmode.
datapattern = mode->datapattern;
2305 devctl_req.m_rmode.
spindlctrl = mode->spindlctrl;
2306 devctl_req.m_cmdid = 1;
2307 devctl_req.m_posszarg1 = lbn;
2308 devctl_req.m_rmode.
trycount = mode->trycount;
2309 return (devctl(
"cdrom_stm0:", 0x4393, &devctl_req,
sizeof(devctl_req), &buf, 4) >= 0) ? buf : 0;
2317 memset(&devctl_req, 0,
sizeof(devctl_req));
2318 devctl_req.m_cmdid = 9;
2319 devctl_req.m_posszarg1 = lsn;
2320 return (devctl(
"cdrom_stm0:", 0x4393, &devctl_req,
sizeof(devctl_req), &buf, 4) >= 0) ? buf : 0;
2328 memset(&devctl_req, 0,
sizeof(devctl_req));
2329 devctl_req.m_posszarg1 = lbn;
2330 devctl_req.m_cmdid = 4;
2331 return (devctl(
"cdrom_stm0:", 0x4393, &devctl_req,
sizeof(devctl_req), &buf, 4) >= 0) ? buf : 0;
2339 memset(&devctl_req, 0,
sizeof(devctl_req));
2340 devctl_req.m_cmdid = 3;
2341 return (devctl(
"cdrom_stm0:", 0x4393, &devctl_req,
sizeof(devctl_req), &buf, 4) >= 0) ? buf : 0;
2344int sceCdStRead(u32 sectors, u32 *buffer, u32 mode, u32 *error)
2351 memset(&devctl_req, 0,
sizeof(devctl_req));
2352 devctl_req.m_cmdid = 1;
2353 devctl_req.m_posszarg2 = sectors;
2354 devctl_req.m_buffer = buffer;
2355 if ( devctl(
"cdrom_stm0:", 0x4394, &devctl_req,
sizeof(devctl_req), &buf, 4) < 0 )
2359 *error = devctl_req.m_error;
2368 memset(&devctl_req, 0,
sizeof(devctl_req));
2369 devctl_req.m_cmdid = 7;
2370 return (devctl(
"cdrom_stm0:", 0x4393, &devctl_req,
sizeof(devctl_req), &buf, 4) >= 0) ? buf : 0;
2378 memset(&devctl_req, 0,
sizeof(devctl_req));
2379 devctl_req.m_cmdid = 8;
2380 return (devctl(
"cdrom_stm0:", 0x4393, &devctl_req,
sizeof(devctl_req), &buf, 4) >= 0) ? buf : 0;
2388 memset(&devctl_req, 0,
sizeof(devctl_req));
2389 devctl_req.m_cmdid = 6;
2390 return (devctl(
"cdrom_stm0:", 0x4393, &devctl_req,
sizeof(devctl_req), &buf, 4) >= 0) ? buf : 0;
2400 VERBOSE_PRINTF(1,
"CdSearchFile: start name= %s layer= %d\n", name, layer);
2401 if ( g_cdvdman_fs_layer != layer )
2403 g_cdvdman_fs_cache = 0;
2405 if ( !cdvdman_mediactl(0) && g_cdvdman_fs_cache )
2407 VERBOSE_KPRINTF(1,
"CdSearchFile: cache dir data used\n");
2411 VERBOSE_PRINTF(1,
"CdSearchFile Topen= %s\n", name);
2412 if ( !CD_newmedia(layer) )
2414 g_cdvdman_fs_cache = 0;
2417 g_cdvdman_fs_cache = 1;
2419 if ( *name !=
'\\' )
2426 for ( i = 0; i < 8 && name[i]; i += 1 )
2428 for ( j = 0; name[i + j] !=
'\\'; j += 1 )
2430 name_buf[j] = name[i + j];
2433 parent_level = cdvdman_finddir(parent_level, name_buf);
2434 if ( parent_level == -1 )
2442 VERBOSE_PRINTF(1,
"%s: path level (%d) error\n", name, i);
2447 VERBOSE_PRINTF(1,
"%s: dir was not found\n", name);
2451 if ( !CD_cachefile(parent_level, layer) )
2453 VERBOSE_PRINTF(1,
"CdSearchFile: disc error\n");
2456 VERBOSE_PRINTF(2,
"CdSearchFile: searching %s...\n", name_buf);
2458 j < (
sizeof(g_cdvdman_filetbl) /
sizeof(g_cdvdman_filetbl[0])) && g_cdvdman_filetbl[j].m_file_struct.
name[0];
2461 VERBOSE_PRINTF(1,
"%d %s %s\n", (
int)j, g_cdvdman_filetbl[j].m_file_struct.name, name_buf);
2462 if ( cdvdman_cmpname(g_cdvdman_filetbl[j].m_file_struct.name, name_buf) )
2464 VERBOSE_PRINTF(2,
"%s:\t found\n", name_buf);
2467 fp->m_file_struct.lsn += layer ? g_cdvdman_fs_base2 : 0;
2471 VERBOSE_PRINTF(1,
"%s: not found\n", name_buf);
2475static int sceCdSearchDir(
char *dirname,
int layer)
2479 VERBOSE_PRINTF(1,
"_sceCdSearchDir: dir name %s layer %d\n", dirname, layer);
2483static int sceCdReadDir(
sceCdlFILE *fp,
int dsec,
int index,
int layer)
2485 VERBOSE_PRINTF(1,
"_sceCdReadDir: current= %d dsec= %d layer= %d\n", g_cdvdman_fs_cdsec, dsec, layer);
2486 if ( g_cdvdman_fs_cdsec != dsec || g_cdvdman_fs_layer != layer )
2488 if ( g_cdvdman_fs_layer != layer )
2490 if ( !CD_newmedia(layer) )
2494 g_cdvdman_fs_cache = 1;
2496 if ( !CD_cachefile(dsec, layer) )
2501 if ( g_cdvdman_filetbl[index].m_file_struct.name[0] )
2503 VERBOSE_PRINTF(1,
"%s:\t found dir_point %d\n", g_cdvdman_filetbl[index].m_file_struct.name, index);
2511static int cdvdman_cmpname(
const char *p,
const char *q)
2513 return !strncmp(p, q, 12);
2516static int CD_newmedia(
int arg)
2518 unsigned int DiskType;
2538 VERBOSE_PRINTF(1,
"CD_newmedia: Illegal disc media type =%d\n", (
int)DiskType);
2541 g_cdvdman_fs_base2 = 0;
2544 if ( !DvdDual_infochk() )
2546 VERBOSE_PRINTF(1,
"CD_newmedia: Get DvdDual_infochk fail\n");
2549 g_cdvdman_fs_base2 = arg ? g_cdvdman_istruct.m_layer_1_lsn : 0;
2551 if ( disc_read(1, g_cdvdman_fs_base2 + 0x10, g_cdvdman_fs_rbuf, arg) != 1 )
2553 VERBOSE_PRINTF(1,
"CD_newmedia: Read error in disc_read(PVD)\n");
2557 for ( i = 0; i < g_cdvdman_pathtblsize; i += 1 )
2559 g_cdvdman_pathtbl[i].m_cache_hit_count = 0;
2560 g_cdvdman_pathtbl[i].m_layer = 0;
2561 g_cdvdman_pathtbl[i].m_nsec = 0;
2562 g_cdvdman_pathtbl[i].m_lsn = 0;
2563 g_cdvdman_pathtbl[i].m_cache_path_sz = 0;
2567 g_cache_path_size = 0;
2569 if ( strncmp((
char *)((
iso9660_desc_t *)g_cdvdman_fs_rbuf)->m_id,
"CD001", 5) )
2571 VERBOSE_PRINTF(1,
"CD_newmedia: Disc format error in cd_read(PVD)\n");
2580 VERBOSE_PRINTF(1,
"CD_newmedia: CD Read mode\n");
2581 ptsector = *(u32 *)(((
iso9660_desc_t *)g_cdvdman_fs_rbuf)->m_type_l_path_table);
2586 VERBOSE_PRINTF(1,
"CD_newmedia: DVD Read mode\n");
2590 if ( disc_read(1, g_cdvdman_fs_base2 + ptsector, g_cdvdman_fs_rbuf, arg) != 1 )
2592 VERBOSE_PRINTF(1,
"CD_newmedia: Read error (PT:%08x)\n", ptsector);
2595 VERBOSE_PRINTF(2,
"CD_newmedia: sarching dir..\n");
2597 i < (
sizeof(g_cdvdman_dirtbl) /
sizeof(g_cdvdman_dirtbl[0]))
2598 && path_cur < (
iso9660_path_t *)&g_cdvdman_fs_rbuf[
sizeof(g_cdvdman_fs_rbuf)] && path_cur->m_name_len[0];
2600 path_cur = (
iso9660_path_t *)(((
char *)path_cur) + path_cur->m_name_len[0] + (path_cur->m_name_len[0] & 1)
2603 memcpy(&g_cdvdman_dirtbl[i].m_extent, path_cur->m_extent,
sizeof(path_cur->m_extent));
2604 g_cdvdman_dirtbl[i].m_number = i;
2605 memcpy(&g_cdvdman_dirtbl[i].m_parent, path_cur->m_parent,
sizeof(path_cur->m_parent));
2606 memcpy(g_cdvdman_dirtbl[i].m_name, path_cur->m_name, path_cur->m_name_len[0]);
2607 g_cdvdman_dirtbl[i].m_name[path_cur->m_name_len[0]] = 0;
2610 "\t%08x,%04x,%04x,%s\n",
2611 g_cdvdman_dirtbl[i].m_extent,
2612 g_cdvdman_dirtbl[i].m_number,
2613 g_cdvdman_dirtbl[i].m_parent,
2614 g_cdvdman_dirtbl[i].m_name);
2616 if ( i < (
sizeof(g_cdvdman_dirtbl) /
sizeof(g_cdvdman_dirtbl[0])) )
2618 g_cdvdman_dirtbl[i].m_parent = 0;
2620 g_cdvdman_fs_cdsec = 0;
2621 g_cdvdman_fs_layer = arg;
2622 VERBOSE_PRINTF(2,
"CD_newmedia: %d dir entries found\n", (
int)i);
2626static int cdvdman_finddir(
int target_parent,
const char *target_name)
2630 for ( i = 0; i < (
sizeof(g_cdvdman_dirtbl) /
sizeof(g_cdvdman_dirtbl[0])) && g_cdvdman_dirtbl[i].m_parent; i += 1 )
2632 if ( g_cdvdman_dirtbl[i].m_parent == target_parent && !strcmp(target_name, g_cdvdman_dirtbl[i].m_name) )
2640static int CD_cachefile(
int dsec,
int layer)
2645 if ( dsec == g_cdvdman_fs_cdsec )
2650 disc_read(1, g_cdvdman_dirtbl[dsec - 1].m_extent + (layer ? g_cdvdman_fs_base2 : 0), g_cdvdman_fs_rbuf, layer)
2653 VERBOSE_PRINTF(1,
"CD_cachefile: dir not found\n");
2654 g_cdvdman_fs_cdsec = 0;
2657 VERBOSE_PRINTF(2,
"CD_cachefile: searching...\n");
2659 i < (
sizeof(g_cdvdman_filetbl) /
sizeof(g_cdvdman_filetbl[0]))
2660 && dirent_cur < (
iso9660_dirent_t *)&g_cdvdman_fs_rbuf[
sizeof(g_cdvdman_fs_rbuf)];
2661 i += 1, dirent_cur = (
iso9660_dirent_t *)((
char *)dirent_cur + dirent_cur->m_length[0]) )
2665 if ( !dirent_cur->m_length[0] )
2670 &g_cdvdman_filetbl[i].m_file_struct.lsn, dirent_cur->m_extent,
sizeof(g_cdvdman_filetbl[i].m_file_struct.lsn));
2672 &g_cdvdman_filetbl[i].m_file_struct.size, dirent_cur->m_size,
sizeof(g_cdvdman_filetbl[i].m_file_struct.size));
2673 file_year = dirent_cur->m_date[0] + 1900;
2674 g_cdvdman_filetbl[i].m_file_struct.
date[7] = file_year >> 8;
2675 g_cdvdman_filetbl[i].m_file_struct.
date[6] = file_year;
2676 g_cdvdman_filetbl[i].m_file_struct.
date[5] = dirent_cur->m_date[1];
2677 g_cdvdman_filetbl[i].m_file_struct.
date[4] = dirent_cur->m_date[2];
2678 g_cdvdman_filetbl[i].m_file_struct.
date[3] = dirent_cur->m_date[3];
2679 g_cdvdman_filetbl[i].m_file_struct.
date[2] = dirent_cur->m_date[4];
2680 g_cdvdman_filetbl[i].m_file_struct.
date[1] = dirent_cur->m_date[5];
2681 g_cdvdman_filetbl[i].m_flags = dirent_cur->m_flags[0];
2685 strcpy(g_cdvdman_filetbl[i].m_file_struct.name,
".");
2688 strcpy(g_cdvdman_filetbl[i].m_file_struct.name,
"..");
2691 memcpy(g_cdvdman_filetbl[i].m_file_struct.name, dirent_cur->m_name, dirent_cur->m_name_len[0]);
2692 g_cdvdman_filetbl[i].m_file_struct.
name[dirent_cur->m_name_len[0]] = 0;
2697 "\t lsn %d size %d name:%d:%s %d/%d/%d %d:%d:%d\n",
2698 (
int)(g_cdvdman_filetbl[i].m_file_struct.lsn),
2699 (
int)(g_cdvdman_filetbl[i].m_file_struct.size),
2700 dirent_cur->m_name_len[0],
2701 g_cdvdman_filetbl[i].m_file_struct.name,
2703 g_cdvdman_filetbl[i].m_file_struct.date[5],
2704 g_cdvdman_filetbl[i].m_file_struct.date[4],
2705 g_cdvdman_filetbl[i].m_file_struct.date[3],
2706 g_cdvdman_filetbl[i].m_file_struct.date[2],
2707 g_cdvdman_filetbl[i].m_file_struct.date[1]);
2709 g_cdvdman_fs_cdsec = dsec;
2710 if ( i < (
sizeof(g_cdvdman_filetbl) /
sizeof(g_cdvdman_filetbl[0])) )
2712 g_cdvdman_filetbl[i].m_file_struct.
name[0] = 0;
2714 VERBOSE_PRINTF(2,
"CD_cachefile: %d files found\n", (
int)i);
2718static int disc_read(
int size,
int loc,
void *buffer,
int layer)
2728 VERBOSE_PRINTF(1,
"cd_read:lsn= %d size= %d layer= %d\n", loc, size, layer);
2729 if ( cdvdman_l0check(layer) )
2731 g_cdvdman_srchspd = 0;
2733 switch ( g_cdvdman_srchspd )
2749 if ( !g_cdvdman_pathtblflag )
2757 pathcachecnt = (g_cache_count < g_cdvdman_pathtblsize) ? g_cache_count : g_cdvdman_pathtblsize;
2758 for ( i = 0; i < pathcachecnt; i += 1 )
2762 "Path table Cache Search lsn:%d:%d nsec:%d:%d layer%d:%d\n",
2763 g_cdvdman_pathtbl[i].m_lsn,
2765 g_cdvdman_pathtbl[i].m_nsec,
2767 g_cdvdman_pathtbl[i].m_layer,
2770 g_cdvdman_pathtbl[i].m_lsn == loc && g_cdvdman_pathtbl[i].m_nsec == (
unsigned int)size
2771 && g_cdvdman_pathtbl[i].m_layer == layer )
2776 if ( i != pathcachecnt )
2778 VERBOSE_KPRINTF(1,
"Path table Cache ON:%d\n", g_cdvdman_pathtbl[i].m_cache_path_sz);
2779 if ( lseek(g_cache_path_fd, g_cdvdman_pathtbl[i].m_cache_path_sz, 0) >= 0 )
2781 read(g_cache_path_fd, buffer, size << 11);
2783 g_cdvdman_pathtbl[i].m_cache_hit_count += 1;
2789 if ( !
sceCdRE(loc, size, buffer, &rmode) )
2800 if ( g_cache_count >= g_cdvdman_pathtblsize )
2803 unsigned int cacheblo2;
2806 if ( g_cache_table >= g_cdvdman_pathtblsize )
2810 cachetblo1 = g_cache_table;
2811 cacheblo2 = cachetblo1;
2812 for ( i = 0; (
unsigned int)i < g_cache_count; i += 1 )
2814 if ( cacheblo2 >= g_cdvdman_pathtblsize )
2819 g_cdvdman_pathtbl[cacheblo2].m_nsec >= (
unsigned int)size
2820 && g_cdvdman_pathtbl[cacheblo2].m_cache_hit_count
2821 < (
unsigned int)g_cdvdman_pathtbl[cachetblo1].m_cache_hit_count )
2823 cachetblo1 = cacheblo2;
2827 cache_path_sz = g_cdvdman_pathtbl[cachetblo1].m_cache_path_sz;
2828 g_cache_table = cachetblo1;
2832 cache_path_sz = g_cache_path_size;
2833 g_cache_table = g_cache_count;
2836 if ( lseek(g_cache_path_fd, cache_path_sz, 0) >= 0 )
2838 int ptbl_wcache_write_res;
2840 ptbl_wcache_write_res = write(g_cache_path_fd, buffer, size << 11);
2841 if ( ptbl_wcache_write_res == size << 11 )
2844 g_cdvdman_pathtbl[g_cache_table].m_cache_path_sz = cache_path_sz;
2845 g_cdvdman_pathtbl[g_cache_table].m_lsn = loc;
2846 g_cdvdman_pathtbl[g_cache_table].m_nsec = size;
2847 g_cdvdman_pathtbl[g_cache_table].m_layer = layer;
2848 g_cdvdman_pathtbl[g_cache_table].m_cache_hit_count = 0;
2849 g_cache_path_size += (g_cache_count < g_cdvdman_pathtblsize) ? ptbl_wcache_write_res : 0;
2853 VERBOSE_KPRINTF(1,
"Ptbl_WCache:write %d", ptbl_wcache_write_res);
2854 g_cdvdman_pathtbl[g_cache_table].m_cache_hit_count = 0;
2855 g_cdvdman_pathtbl[g_cache_table].m_layer = 0;
2856 g_cdvdman_pathtbl[g_cache_table].m_nsec = 0;
2857 g_cdvdman_pathtbl[g_cache_table].m_lsn = 0;
2868 if ( !
sceCdRE(loc, size, buffer, &rmode) )
2878 VERBOSE_KPRINTF(1,
"cd_read: error code %x\n",
sceCdGetError());
2882static int path_tbl_init(u32 blocks,
char *fname,
int action)
2896 if ( !g_cdvdman_pathtbl )
2899 g_cdvdman_pathtblflag = 0;
2903 sprintf(cachedir,
"%sCache_Path", fname);
2904 v = open(cachedir, O_TRUNC | O_CREAT | O_RDWR, 0x1ff );
2909 g_cache_path_fd = v;
2910 if ( !strncmp(cachedir,
"pfs", 3) )
2912 blocksbs = blocks << 11;
2913 ioctl2(g_cache_path_fd, PIOCALLOC, &blocksbs, 4, 0, 0);
2915 for ( i = 0; i < blocks; i += 1 )
2917 v = write(g_cache_path_fd, g_cdvdman_fs_rbuf,
sizeof(g_cdvdman_fs_rbuf));
2926 g_cdvdman_pathtblsize = blocks;
2927 for ( i = 0; i < blocks; i += 1 )
2929 g_cdvdman_pathtbl[i].m_cache_hit_count = 0;
2930 g_cdvdman_pathtbl[i].m_layer = 0;
2931 g_cdvdman_pathtbl[i].m_nsec = 0;
2932 g_cdvdman_pathtbl[i].m_lsn = 0;
2933 g_cdvdman_pathtbl[i].m_cache_path_sz = 0;
2935 g_cache_path_size = 0;
2938 g_cdvdman_pathtblflag = 1;
2944 if ( g_cache_path_fd != -1 )
2946 num = close(g_cache_path_fd);
2949 if ( !strncmp(cachedir,
"pfs", 3) )
2951 num = remove(cachedir);
2953 else if ( !strncmp(cachedir,
"host", 4) )
2961 g_cache_path_fd = -1;
2964 g_cache_path_size = 0;
2965 g_cdvdman_pathtblflag = 0;
2966 g_cdvdman_pathtblsize = 0;
2967 FreeSysMemory(g_cdvdman_pathtbl);
2968 g_cdvdman_pathtbl = 0;
2972 VERBOSE_KPRINTF(1,
"path_tbl_init Error %d\n", v);
2974 return (!action) ? num : v;
2981 "\t" ".set push" "\n"
2982 "\t" ".set noat" "\n"
2983 "\t" ".set noreorder" "\n"
2984 "\t" ".global optimized_memcpy" "\n"
2985 "\t" "optimized_memcpy:" "\n"
2986 "\t" " srl $a3, $a2, 2" "\n"
2987 "\t" " beqz $a3, .Loptimized_memcpy_12" "\n"
2988 "\t" " or $a3, $a0, $a1" "\n"
2989 "\t" " andi $a3, $a3, 0x3" "\n"
2990 "\t" " bnez $a3, .Loptimized_memcpy_3" "\n"
2992 "\t" " srl $a3, $a2, 2" "\n"
2993 "\t" " addiu $at, $zero, 0xC" "\n"
2994 "\t" " div $zero, $a3, $at" "\n"
2995 "\t" " mflo $a3" "\n"
2996 "\t" " mfhi $v1" "\n"
2997 "\t" " beqz $v1, .Loptimized_memcpy_2" "\n"
2999 "\t" ".Loptimized_memcpy_1:" "\n"
3000 "\t" " lw $v0, 0x0($a1)" "\n"
3001 "\t" " addiu $v1, $v1, -0x1" "\n"
3002 "\t" " sw $v0, 0x0($a0)" "\n"
3003 "\t" " addiu $a1, $a1, 0x4" "\n"
3004 "\t" " bnez $v1, .Loptimized_memcpy_1" "\n"
3005 "\t" " addiu $a0, $a0, 0x4" "\n"
3006 "\t" " beqz $a3, .Loptimized_memcpy_12" "\n"
3008 "\t" ".Loptimized_memcpy_2:" "\n"
3009 "\t" " lw $v0, 0x0($a1)" "\n"
3010 "\t" " lw $v1, 0x4($a1)" "\n"
3011 "\t" " lw $t0, 0x8($a1)" "\n"
3012 "\t" " lw $t1, 0xC($a1)" "\n"
3013 "\t" " lw $t2, 0x10($a1)" "\n"
3014 "\t" " lw $t3, 0x14($a1)" "\n"
3015 "\t" " lw $t4, 0x18($a1)" "\n"
3016 "\t" " lw $t5, 0x1C($a1)" "\n"
3017 "\t" " lw $t6, 0x20($a1)" "\n"
3018 "\t" " lw $t7, 0x24($a1)" "\n"
3019 "\t" " lw $t8, 0x28($a1)" "\n"
3020 "\t" " lw $t9, 0x2C($a1)" "\n"
3021 "\t" " addiu $a3, $a3, -0x1" "\n"
3022 "\t" " sw $v0, 0x0($a0)" "\n"
3023 "\t" " sw $v1, 0x4($a0)" "\n"
3024 "\t" " sw $t0, 0x8($a0)" "\n"
3025 "\t" " sw $t1, 0xC($a0)" "\n"
3026 "\t" " sw $t2, 0x10($a0)" "\n"
3027 "\t" " sw $t3, 0x14($a0)" "\n"
3028 "\t" " sw $t4, 0x18($a0)" "\n"
3029 "\t" " sw $t5, 0x1C($a0)" "\n"
3030 "\t" " sw $t6, 0x20($a0)" "\n"
3031 "\t" " sw $t7, 0x24($a0)" "\n"
3032 "\t" " sw $t8, 0x28($a0)" "\n"
3033 "\t" " sw $t9, 0x2C($a0)" "\n"
3034 "\t" " addiu $a1, $a1, 0x30" "\n"
3035 "\t" " bnez $a3, .Loptimized_memcpy_2" "\n"
3036 "\t" " addiu $a0, $a0, 0x30" "\n"
3037 "\t" " j .Loptimized_memcpy_12" "\n"
3039 "\t" ".Loptimized_memcpy_3:" "\n"
3040 "\t" " andi $a3, $a0, 0x3" "\n"
3041 "\t" " beqz $a3, .Loptimized_memcpy_6" "\n"
3042 "\t" " andi $a3, $a1, 0x3" "\n"
3043 "\t" " beqz $a3, .Loptimized_memcpy_6" "\n"
3045 "\t" " srl $a3, $a2, 2" "\n"
3046 "\t" " addiu $at, $zero, 0xC" "\n"
3047 "\t" " div $zero, $a3, $at" "\n"
3048 "\t" " mflo $a3" "\n"
3049 "\t" " mfhi $v1" "\n"
3050 "\t" " beqz $v1, .Loptimized_memcpy_5" "\n"
3052 "\t" ".Loptimized_memcpy_4:" "\n"
3053 "\t" " lwl $v0, 0x3($a1)" "\n"
3054 "\t" " lwr $v0, 0x0($a1)" "\n"
3055 "\t" " addiu $v1, $v1, -0x1" "\n"
3056 "\t" " swl $v0, 0x3($a0)" "\n"
3057 "\t" " swr $v0, 0x0($a0)" "\n"
3058 "\t" " addiu $a1, $a1, 0x4" "\n"
3059 "\t" " bnez $v1, .Loptimized_memcpy_4" "\n"
3060 "\t" " addiu $a0, $a0, 0x4" "\n"
3061 "\t" " beqz $a3, .Loptimized_memcpy_12" "\n"
3063 "\t" ".Loptimized_memcpy_5:" "\n"
3064 "\t" " lwl $v0, 0x3($a1)" "\n"
3065 "\t" " lwr $v0, 0x0($a1)" "\n"
3066 "\t" " lwl $v1, 0x7($a1)" "\n"
3067 "\t" " lwr $v1, 0x4($a1)" "\n"
3068 "\t" " lwl $t0, 0xB($a1)" "\n"
3069 "\t" " lwr $t0, 0x8($a1)" "\n"
3070 "\t" " lwl $t1, 0xF($a1)" "\n"
3071 "\t" " lwr $t1, 0xC($a1)" "\n"
3072 "\t" " lwl $t2, 0x13($a1)" "\n"
3073 "\t" " lwr $t2, 0x10($a1)" "\n"
3074 "\t" " lwl $t3, 0x17($a1)" "\n"
3075 "\t" " lwr $t3, 0x14($a1)" "\n"
3076 "\t" " lwl $t4, 0x1B($a1)" "\n"
3077 "\t" " lwr $t4, 0x18($a1)" "\n"
3078 "\t" " lwl $t5, 0x1F($a1)" "\n"
3079 "\t" " lwr $t5, 0x1C($a1)" "\n"
3080 "\t" " lwl $t6, 0x23($a1)" "\n"
3081 "\t" " lwr $t6, 0x20($a1)" "\n"
3082 "\t" " lwl $t7, 0x27($a1)" "\n"
3083 "\t" " lwr $t7, 0x24($a1)" "\n"
3084 "\t" " lwl $t8, 0x2B($a1)" "\n"
3085 "\t" " lwr $t8, 0x28($a1)" "\n"
3086 "\t" " lwl $t9, 0x2F($a1)" "\n"
3087 "\t" " lwr $t9, 0x2C($a1)" "\n"
3088 "\t" " addiu $a3, $a3, -0x1" "\n"
3089 "\t" " swl $v0, 0x3($a0)" "\n"
3090 "\t" " swr $v0, 0x0($a0)" "\n"
3091 "\t" " swl $v1, 0x7($a0)" "\n"
3092 "\t" " swr $v1, 0x4($a0)" "\n"
3093 "\t" " swl $t0, 0xB($a0)" "\n"
3094 "\t" " swr $t0, 0x8($a0)" "\n"
3095 "\t" " swl $t1, 0xF($a0)" "\n"
3096 "\t" " swr $t1, 0xC($a0)" "\n"
3097 "\t" " swl $t2, 0x13($a0)" "\n"
3098 "\t" " swr $t2, 0x10($a0)" "\n"
3099 "\t" " swl $t3, 0x17($a0)" "\n"
3100 "\t" " swr $t3, 0x14($a0)" "\n"
3101 "\t" " swl $t4, 0x1B($a0)" "\n"
3102 "\t" " swr $t4, 0x18($a0)" "\n"
3103 "\t" " swl $t5, 0x1F($a0)" "\n"
3104 "\t" " swr $t5, 0x1C($a0)" "\n"
3105 "\t" " swl $t6, 0x23($a0)" "\n"
3106 "\t" " swr $t6, 0x20($a0)" "\n"
3107 "\t" " swl $t7, 0x27($a0)" "\n"
3108 "\t" " swr $t7, 0x24($a0)" "\n"
3109 "\t" " swl $t8, 0x2B($a0)" "\n"
3110 "\t" " swr $t8, 0x28($a0)" "\n"
3111 "\t" " swl $t9, 0x2F($a0)" "\n"
3112 "\t" " swr $t9, 0x2C($a0)" "\n"
3113 "\t" " addiu $a1, $a1, 0x30" "\n"
3114 "\t" " bnez $a3, .Loptimized_memcpy_5" "\n"
3115 "\t" " addiu $a0, $a0, 0x30" "\n"
3116 "\t" " j .Loptimized_memcpy_12" "\n"
3118 "\t" ".Loptimized_memcpy_6:" "\n"
3119 "\t" " andi $a3, $a0, 0x3" "\n"
3120 "\t" " beqz $a3, .Loptimized_memcpy_9" "\n"
3122 "\t" " srl $a3, $a2, 2" "\n"
3123 "\t" " addiu $at, $zero, 0xC" "\n"
3124 "\t" " div $zero, $a3, $at" "\n"
3125 "\t" " mflo $a3" "\n"
3126 "\t" " mfhi $v1" "\n"
3127 "\t" " beqz $v1, .Loptimized_memcpy_8" "\n"
3129 "\t" ".Loptimized_memcpy_7:" "\n"
3130 "\t" " lw $v0, 0x0($a1)" "\n"
3131 "\t" " addiu $v1, $v1, -0x1" "\n"
3132 "\t" " swl $v0, 0x3($a0)" "\n"
3133 "\t" " swr $v0, 0x0($a0)" "\n"
3134 "\t" " addiu $a1, $a1, 0x4" "\n"
3135 "\t" " bnez $v1, .Loptimized_memcpy_7" "\n"
3136 "\t" " addiu $a0, $a0, 0x4" "\n"
3137 "\t" " beqz $a3, .Loptimized_memcpy_12" "\n"
3139 "\t" ".Loptimized_memcpy_8:" "\n"
3140 "\t" " lw $v0, 0x0($a1)" "\n"
3141 "\t" " lw $v1, 0x4($a1)" "\n"
3142 "\t" " lw $t0, 0x8($a1)" "\n"
3143 "\t" " lw $t1, 0xC($a1)" "\n"
3144 "\t" " lw $t2, 0x10($a1)" "\n"
3145 "\t" " lw $t3, 0x14($a1)" "\n"
3146 "\t" " lw $t4, 0x18($a1)" "\n"
3147 "\t" " lw $t5, 0x1C($a1)" "\n"
3148 "\t" " lw $t6, 0x20($a1)" "\n"
3149 "\t" " lw $t7, 0x24($a1)" "\n"
3150 "\t" " lw $t8, 0x28($a1)" "\n"
3151 "\t" " lw $t9, 0x2C($a1)" "\n"
3152 "\t" " addiu $a3, $a3, -0x1" "\n"
3153 "\t" " swl $v0, 0x3($a0)" "\n"
3154 "\t" " swr $v0, 0x0($a0)" "\n"
3155 "\t" " swl $v1, 0x7($a0)" "\n"
3156 "\t" " swr $v1, 0x4($a0)" "\n"
3157 "\t" " swl $t0, 0xB($a0)" "\n"
3158 "\t" " swr $t0, 0x8($a0)" "\n"
3159 "\t" " swl $t1, 0xF($a0)" "\n"
3160 "\t" " swr $t1, 0xC($a0)" "\n"
3161 "\t" " swl $t2, 0x13($a0)" "\n"
3162 "\t" " swr $t2, 0x10($a0)" "\n"
3163 "\t" " swl $t3, 0x17($a0)" "\n"
3164 "\t" " swr $t3, 0x14($a0)" "\n"
3165 "\t" " swl $t4, 0x1B($a0)" "\n"
3166 "\t" " swr $t4, 0x18($a0)" "\n"
3167 "\t" " swl $t5, 0x1F($a0)" "\n"
3168 "\t" " swr $t5, 0x1C($a0)" "\n"
3169 "\t" " swl $t6, 0x23($a0)" "\n"
3170 "\t" " swr $t6, 0x20($a0)" "\n"
3171 "\t" " swl $t7, 0x27($a0)" "\n"
3172 "\t" " swr $t7, 0x24($a0)" "\n"
3173 "\t" " swl $t8, 0x2B($a0)" "\n"
3174 "\t" " swr $t8, 0x28($a0)" "\n"
3175 "\t" " swl $t9, 0x2F($a0)" "\n"
3176 "\t" " swr $t9, 0x2C($a0)" "\n"
3177 "\t" " addiu $a1, $a1, 0x30" "\n"
3178 "\t" " bnez $a3, .Loptimized_memcpy_8" "\n"
3179 "\t" " addiu $a0, $a0, 0x30" "\n"
3180 "\t" " j .Loptimized_memcpy_12" "\n"
3182 "\t" ".Loptimized_memcpy_9:" "\n"
3183 "\t" " srl $a3, $a2, 2" "\n"
3184 "\t" " addiu $at, $zero, 0xC" "\n"
3185 "\t" " div $zero, $a3, $at" "\n"
3186 "\t" " mflo $a3" "\n"
3187 "\t" " mfhi $v1" "\n"
3188 "\t" " beqz $v1, .Loptimized_memcpy_11" "\n"
3190 "\t" ".Loptimized_memcpy_10:" "\n"
3191 "\t" " lwl $v0, 0x3($a1)" "\n"
3192 "\t" " lwr $v0, 0x0($a1)" "\n"
3193 "\t" " addiu $v1, $v1, -0x1" "\n"
3194 "\t" " sw $v0, 0x0($a0)" "\n"
3195 "\t" " addiu $a1, $a1, 0x4" "\n"
3196 "\t" " bnez $v1, .Loptimized_memcpy_10" "\n"
3197 "\t" " addiu $a0, $a0, 0x4" "\n"
3198 "\t" " beqz $a3, .Loptimized_memcpy_12" "\n"
3200 "\t" ".Loptimized_memcpy_11:" "\n"
3201 "\t" " lwl $v0, 0x3($a1)" "\n"
3202 "\t" " lwr $v0, 0x0($a1)" "\n"
3203 "\t" " lwl $v1, 0x7($a1)" "\n"
3204 "\t" " lwr $v1, 0x4($a1)" "\n"
3205 "\t" " lwl $t0, 0xB($a1)" "\n"
3206 "\t" " lwr $t0, 0x8($a1)" "\n"
3207 "\t" " lwl $t1, 0xF($a1)" "\n"
3208 "\t" " lwr $t1, 0xC($a1)" "\n"
3209 "\t" " lwl $t2, 0x13($a1)" "\n"
3210 "\t" " lwr $t2, 0x10($a1)" "\n"
3211 "\t" " lwl $t3, 0x17($a1)" "\n"
3212 "\t" " lwr $t3, 0x14($a1)" "\n"
3213 "\t" " lwl $t4, 0x1B($a1)" "\n"
3214 "\t" " lwr $t4, 0x18($a1)" "\n"
3215 "\t" " lwl $t5, 0x1F($a1)" "\n"
3216 "\t" " lwr $t5, 0x1C($a1)" "\n"
3217 "\t" " lwl $t6, 0x23($a1)" "\n"
3218 "\t" " lwr $t6, 0x20($a1)" "\n"
3219 "\t" " lwl $t7, 0x27($a1)" "\n"
3220 "\t" " lwr $t7, 0x24($a1)" "\n"
3221 "\t" " lwl $t8, 0x2B($a1)" "\n"
3222 "\t" " lwr $t8, 0x28($a1)" "\n"
3223 "\t" " lwl $t9, 0x2F($a1)" "\n"
3224 "\t" " lwr $t9, 0x2C($a1)" "\n"
3225 "\t" " addiu $a3, $a3, -0x1" "\n"
3226 "\t" " sw $v0, 0x0($a0)" "\n"
3227 "\t" " sw $v1, 0x4($a0)" "\n"
3228 "\t" " sw $t0, 0x8($a0)" "\n"
3229 "\t" " sw $t1, 0xC($a0)" "\n"
3230 "\t" " sw $t2, 0x10($a0)" "\n"
3231 "\t" " sw $t3, 0x14($a0)" "\n"
3232 "\t" " sw $t4, 0x18($a0)" "\n"
3233 "\t" " sw $t5, 0x1C($a0)" "\n"
3234 "\t" " sw $t6, 0x20($a0)" "\n"
3235 "\t" " sw $t7, 0x24($a0)" "\n"
3236 "\t" " sw $t8, 0x28($a0)" "\n"
3237 "\t" " sw $t9, 0x2C($a0)" "\n"
3238 "\t" " addiu $a1, $a1, 0x30" "\n"
3239 "\t" " bnez $a3, .Loptimized_memcpy_11" "\n"
3240 "\t" " addiu $a0, $a0, 0x30" "\n"
3241 "\t" ".Loptimized_memcpy_12:" "\n"
3242 "\t" " andi $v1, $a2, 0x3" "\n"
3243 "\t" " beqz $v1, .Loptimized_memcpy_14" "\n"
3245 "\t" ".Loptimized_memcpy_13:" "\n"
3246 "\t" " lb $v0, 0x0($a1)" "\n"
3247 "\t" " addiu $v1, $v1, -0x1" "\n"
3248 "\t" " sb $v0, 0x0($a0)" "\n"
3249 "\t" " addiu $a1, $a1, 0x1" "\n"
3250 "\t" " bnez $v1, .Loptimized_memcpy_13" "\n"
3251 "\t" " addiu $a0, $a0, 0x1" "\n"
3252 "\t" ".Loptimized_memcpy_14:" "\n"
3253 "\t" " addu $v0, $a2, $zero" "\n"
3256 "\t" ".set pop" "\n"
3261void hex_dump(u8 *addr_start,
int length)
3265 KPRINTF(
"Hex Dump addr %08x\n", addr_start);
3266 for ( i = 0; i < length; i += 1 )
3268 if ( !(i & 0xF) && i )
3272 KPRINTF(
" %02x", addr_start[i]);
3278static int cdvdman_initcfg()
3285 for ( i = 0; i <= 100; i += 1 )
3287 unsigned int mvored;
3289 if ( !sceCdGetMVersion(m_version, &eflag) && (eflag & 0x80) )
3292 VERBOSE_KPRINTF(1,
"_sceCdMV error\n");
3294 mvored = m_version[3] | (m_version[2] << 8) | (m_version[1] << 16);
3295 g_cdvdman_emudvd9 = m_version[2] & 1;
3296 VERBOSE_KPRINTF(1,
"MV %02x %02x %02x %02x\n", m_version[0], m_version[1], m_version[2], m_version[3]);
3297 g_cdvdman_minver_10700 = mvored >= 0x10700;
3298 g_cdvdman_minver_20200 = mvored >= 0x20200;
3299 g_cdvdman_minver_20400 = mvored >= 0x20400;
3300 g_cdvdman_minver_20800 = mvored >= 0x20800;
3301 g_cdvdman_minver_50000 = mvored >= 0x50000;
3302 g_cdvdman_minver_50200 = mvored >= 0x50200;
3303 g_cdvdman_minver_50400 = mvored >= 0x50400;
3304 g_cdvdman_minver_50600 = mvored >= 0x50600;
3305 g_cdvdman_minver_x_model_15 = (mvored & 0xF) == 1;
3306 g_cdvdman_minver_60000 = mvored >= 0x60000;
3307 g_cdvdman_minver_60200 = mvored >= 0x60200;
3313static int vSetAlarm(
iop_sys_clock_t *sys_clock,
unsigned int (*alarm_cb)(
void *),
void *arg)
3315 return (
QueryIntrContext() ? iSetAlarm : SetAlarm)(sys_clock, alarm_cb, arg);
3318static int vCancelAlarm(
unsigned int (*alarm_cb)(
void *),
void *arg)
3324s32 vSignalSema(s32 sema_id)
3330static int vSetEventFlag(
int ef, u32 bits)
3335static int vClearEventFlag(
int ef, u32 bits)
3345static int vDelayThread(
int usec)
3359 read_timeout = sys_clock->lo / 0x9000;
3360 KPRINTF(
"Read Time Out %d(msec)\n", read_timeout);
3361 sceCdSC(0xFFFFFFEE, &read_timeout);
3370 if (
sceCdSync(1) || PollEventFlag(g_ncmd_evid, 1, WEF_AND | WEF_CLEAR, &efbits) == KE_EVF_COND )
3374 rc = g_cdvdman_user_cb;
3375 g_cdvdman_user_cb = function;
3376 vSetEventFlag(g_ncmd_evid, 1);
3382 void (*old_cb)(
void *);
3386 old_cb = g_cdvdman_poff_cb;
3387 g_cdvdman_poff_cb = func;
3388 g_cdvdman_poffarg = addr;
3393int sceCdstm0Cb(
void (*p)(
int))
3395 g_cdvdman_cdstm0cb = p;
3399int sceCdstm1Cb(
void (*p)(
int))
3401 g_cdvdman_cdstm1cb = p;
3409 int ext_passthrough;
3410 USE_DEV5_MMIO_HWPORT();
3412 ext_passthrough = 0;
3413 s->m_wait_flag = s->m_waf_set_test;
3414 iSetEventFlag(g_cdvdman_intr_efid, 0x29);
3416 if ( *(u16 *)&s->m_cdvdman_command == 0x3105 )
3422 s->m_last_error = 0;
3425 1,
"Intr call func_num: %d Err= %02x OnTout= %d\n", g_cdvdman_cmdfunc, (u8)s->m_last_error, s->m_last_read_timeout);
3426 if ( !s->m_scmd_flag )
3428 cdvdman_write_scmd(s);
3431 (((u8)s->m_last_error ==
SCECdErREAD && g_cdvdman_cmdfunc == SCECdFuncRead)
3432 || ((u8)s->m_last_error == 1 && s->m_last_read_timeout && g_cdvdman_last_cmdfunc == 1))
3433 && !g_cdvdman_minver_20200 && !s->m_stream_flag && !s->m_dvd_flag && !s->m_recover_status
3436 s->m_sync_error = 0;
3437 s->m_interupt_read_state = 0;
3438 if ( s->m_dec_mode_set )
3440 s->m_dec_mode_last_set = 1;
3444 VERBOSE_KPRINTF(1,
"dec mode 0x00\n");
3445 s->m_read_chunk_reprocial_32 = 1 + (0x20 / ((!s->m_read_chunk) ? s->m_read_sectors : s->m_read_chunk));
3446 s->m_dintrlsn = (s->m_read_lsn < 0x61) ? (s->m_read_lsn + s->m_read_sectors + 48) : (s->m_read_lsn - 80);
3448 if ( !sceCdRead0_Rty(
3450 (!s->m_read_chunk) ? s->m_read_sectors : s->m_read_chunk,
3453 (u8)s->m_cdvdman_command,
3458 s->m_recover_status = 0;
3462 ext_passthrough = 1;
3466 if ( !ext_passthrough )
3468 char dev5_reg_013_masked;
3470 VERBOSE_KPRINTF(1,
"Recover_Stat:%d\n", s->m_recover_status);
3471 dev5_reg_013_masked = dev5_mmio_hwport->m_dev5_reg_013 & 0xF;
3472 if ( dev5_reg_013_masked )
3475 ((u8)s->m_last_error == 48 || ((u8)s->m_last_error == 1 && s->m_last_read_timeout)) && !s->m_recover_status
3476 && !s->m_stream_flag && g_cdvdman_cmdfunc != 9 && g_cdvdman_cmdfunc != SCECdFuncReadCDDA
3477 && (
unsigned int)s->m_read_mode.
trycount - 1 >= 4 )
3479 s->m_sync_error = 0;
3480 s->m_interupt_read_state = 0;
3481 if ( s->m_dec_mode_set )
3483 s->m_dec_mode_last_set = 2;
3487 VERBOSE_KPRINTF(1,
"dec mode 0x01\n");
3489 cdrmode.
spindlctrl = dev5_reg_013_masked + 13;
3491 if ( sceCdRead0_Rty(
3496 (u8)s->m_cdvdman_command,
3498 s->m_read_callback) )
3500 s->m_last_error = 0;
3507 s->m_last_read_timeout = 0;
3508 switch ( s->m_recover_status )
3511 s->m_sync_error = 0;
3512 s->m_interupt_read_state = 0;
3517 (!s->m_read_chunk) ? s->m_read_sectors : s->m_read_chunk,
3520 (u8)s->m_cdvdman_command,
3525 s->m_recover_status = 0;
3529 ext_passthrough = 1;
3533 s->m_sync_error = 0;
3534 s->m_interupt_read_state = 0;
3536 s->m_read_lsn, s->m_read_sectors, s->m_read_buf, &s->m_read_mode, s->m_read_chunk, s->m_read_callback) )
3538 s->m_last_error = 0;
3539 s->m_recover_status = 3;
3543 s->m_recover_status = 0;
3546 s->m_recover_status = 0;
3552 if ( ext_passthrough )
3554 s->m_last_error = 0;
3555 s->m_dintrlsn += s->m_read_sectors;
3556 s->m_read_chunk_reprocial_32 -= 1;
3557 s->m_recover_status = (!s->m_read_chunk_reprocial_32) ? 2 : 1;
3560 if ( s->m_dec_state )
3564 if ( (s->m_read2_flag == 1 || s->m_read2_flag == 3) && !s->m_use_toc )
3566 VERBOSE_KPRINTF(1,
"call Read2intrCDVD()\n");
3567 Read2intrCDVD(s->m_read2_flag);
3569 s->m_sync_error = 0;
3570 s->m_interupt_read_state = 0;
3571 if ( s->m_dec_state == 2 )
3575 if ( s->m_stream_flag == 1 && !s->m_use_toc && !s->m_read2_flag )
3577 if ( g_cdvdman_cdstm0cb )
3579 g_cdvdman_cdstm0cb(1);
3583 VERBOSE_KPRINTF(1,
"Intr func0 no seting");
3586 if ( s->m_stream_flag == 2 && !s->m_use_toc )
3588 if ( !s->m_read2_flag )
3590 if ( g_cdvdman_cdstm1cb )
3592 g_cdvdman_cdstm1cb(1);
3596 VERBOSE_KPRINTF(1,
"Intr func1 no seting");
3602 if ( !s->m_read2_flag )
3604 g_cdvdman_readptr = 0;
3608 1,
"Intr call user callback func_addr %08x num %d flg %d\n", g_cdvdman_user_cb, g_cdvdman_cmdfunc, s->m_read2_flag);
3609 if ( g_cdvdman_user_cb && g_cdvdman_cmdfunc && !s->m_read2_flag && !s->m_use_toc )
3613 cmdfunc_tmp = g_cdvdman_cmdfunc;
3614 g_cdvdman_cmdfunc = 0;
3615 if ( cmdfunc_tmp == 14 || cmdfunc_tmp == 9 )
3617 cmdfunc_tmp = SCECdFuncRead;
3619 g_cdvdman_user_cb(cmdfunc_tmp);
3621 if ( !g_cdvdman_user_cb )
3623 g_cdvdman_cmdfunc = 0;
3632 USE_DEV5_MMIO_HWPORT();
3635 s->m_waf_set_test = s->m_wait_flag;
3636 if ( (u8)s->m_last_error != 1 )
3638 s->m_last_error = dev5_mmio_hwport->m_dev5_reg_006;
3640 if ( (dev5_mmio_hwport->m_dev5_reg_008 & 1) )
3642 s->m_waf_set_test = (!(dev5_mmio_hwport->m_dev5_reg_005 & 1)) ? 1 : -1;
3643 dev5_mmio_hwport->m_dev5_reg_008 = 1;
3646 if ( (dev5_mmio_hwport->m_dev5_reg_008 & 4) )
3648 dev5_mmio_hwport->m_dev5_reg_008 = 4;
3649 iSetEventFlag(g_cdvdman_intr_efid, 4);
3650 iSetEventFlag(g_cdvdman_intr_efid, 0x10);
3651 if ( g_cdvdman_poff_cb )
3653 g_cdvdman_poff_cb(g_cdvdman_poffarg);
3662 s->m_waf_set_test = 1;
3663 s->m_ncmd_intr_count += 1;
3664 dev5_mmio_hwport->m_dev5_reg_008 = 2;
3666 iReferEventFlagStatus(g_cdvdman_intr_efid, &efinfo);
3669 if ( !s->m_last_error )
3671 s->m_drive_interupt_request = 1;
3679 return cdvdman_intr_cb(s);
3682static u32 cdvdman_l1start(
const u8 *
toc)
3684 return toc[23] + (
toc[22] << 8) + (
toc[21] << 16) - 0x30000 + 1;
3687static int DvdDual_infochk()
3689 if (
QueryIntrContext() || !(cdvdman_mediactl(3) || (u8)g_cdvdman_istruct.m_opo_or_para == 0xFF) )
3693 g_cdvdman_istruct.m_use_toc = 1;
3694 if ( !cdvdman_gettoc(g_cdvdman_ptoc) )
3696 g_cdvdman_istruct.m_use_toc = 0;
3697 g_cdvdman_istruct.m_opo_or_para = -1;
3700 g_cdvdman_istruct.m_use_toc = 0;
3701 g_cdvdman_istruct.m_layer_1_lsn = cdvdman_l1start(g_cdvdman_ptoc);
3702 g_cdvdman_istruct.m_opo_or_para = ((g_cdvdman_ptoc[14] & 0x60)) ? (((g_cdvdman_ptoc[14] & 0x10)) ? 2 : 1) : 0;
3703 if ( g_cdvdman_istruct.m_dual_layer_emulation )
3705 VERBOSE_KPRINTF(1,
"CDVD:DualEmuON\n");
3706 g_cdvdman_istruct.m_layer_1_lsn = g_cdvdman_istruct.m_current_dvd_lsn;
3707 g_cdvdman_istruct.m_opo_or_para = 0;
3711 "DvdDual_info: %02x\tLayer1_LSN:%d opo_or_para %d\n",
3713 g_cdvdman_istruct.m_layer_1_lsn,
3714 (u8)g_cdvdman_istruct.m_opo_or_para);
3718static u32 sceCdLsnDualChg(u32 lsn)
3720 int layer_disk_needed;
3725 layer_disk_needed = 2;
3727 if ( cdvdman_isdvd() && DvdDual_infochk() )
3729 if ( g_cdvdman_istruct.m_dual_layer_emulation )
3731 if ( !g_cdvdman_istruct.m_current_dvd && lsn >= g_cdvdman_istruct.m_current_dvd_lsn )
3733 layer_disk_needed = 1;
3735 if ( g_cdvdman_istruct.m_current_dvd && lsn < g_cdvdman_istruct.m_current_dvd_lsn )
3737 layer_disk_needed = 0;
3739 if ( layer_disk_needed == 2 )
3741 change_lsn = lsn - ((g_cdvdman_istruct.m_current_dvd) ? g_cdvdman_istruct.m_current_dvd_lsn : 0);
3748 VERBOSE_KPRINTF(0,
"CDVD: Exchange it for the Layer_%d_Disk Please.\n", layer_disk_needed);
3756 g_cdvdman_istruct.m_use_toc = 1;
3757 while ( layer_disk_needed != 2 )
3759 if ( cdvdman_isdvd() )
3763 read0_result = sceCdRead0(0xE, 1, g_cdvdman_ptoc, &cdrmode, 0, 0);
3765 if ( !g_cdvdman_istruct.m_last_error || read0_result )
3769 for ( i = 0; i < 20; i += 1 )
3771 if ( g_cdvdman_ptoc[i + 104] != g_masterdisc_header[i] )
3776 if ( i == 20 && g_cdvdman_ptoc[131] == 2 && (g_cdvdman_ptoc[132] & 2) )
3778 if ( layer_disk_needed == g_cdvdman_ptoc[133] )
3780 g_cdvdman_istruct.m_current_dvd = layer_disk_needed;
3781 layer_disk_needed = 2;
3785 VERBOSE_KPRINTF(0,
"CDVD: Layer_%d Disk not Found\n", layer_disk_needed);
3786 VERBOSE_KPRINTF(0,
"CDVD: Exchange it for the Layer_%d_Disk Please.\n", layer_disk_needed);
3787 if ( !g_cdvdman_istruct.m_current_dvd && lsn >= g_cdvdman_istruct.m_current_dvd_lsn )
3789 layer_disk_needed = 1;
3799 VERBOSE_KPRINTF(0,
"CDVD: Not Master Disk %s\n", (
const char *)&g_cdvdman_ptoc[i + 104]);
3808 VERBOSE_KPRINTF(1,
"CDVD: LsnDualChg Read Error %02x, %d\n", (u8)g_cdvdman_istruct.m_last_error, 0);
3813 vDelayThread(16000);
3816 change_lsn = lsn - ((g_cdvdman_istruct.m_current_dvd) ? g_cdvdman_istruct.m_current_dvd_lsn : 0);
3817 g_cdvdman_istruct.m_use_toc = 0;
3824 lsn - ((g_cdvdman_istruct.m_opo_or_para && (lsn >= (u32)g_cdvdman_istruct.m_layer_1_lsn)) ? 0x10 : 0);
3828 if ( has_change_lsn )
3830 VERBOSE_KPRINTF(1,
"CDVD: sceCdLsnDualChg lsn %d: change lsn %d\n", lsn, change_lsn);
3832 return has_change_lsn ? change_lsn : lsn;
3843 g_cdvdman_istruct.m_dual_layer_emulation = 0;
3844 if ( !cdvdman_isdvd() )
3848 if ( !g_cdvdman_emudvd9 )
3850 if ( !DvdDual_infochk() )
3854 *on_dual = !!g_cdvdman_istruct.m_opo_or_para;
3855 *layer1_start = g_cdvdman_istruct.m_layer_1_lsn;
3858 if ( g_cdvdman_mmode != SCECdMmodeDvd && g_cdvdman_mmode != 0xFF )
3865 read0_result = sceCdRead0(0xE, 1, g_cdvdman_ptoc, &cdrmode, 0, 0);
3867 if ( g_cdvdman_istruct.m_last_error && !read0_result )
3869 VERBOSE_KPRINTF(1,
"CDVD: ReadDvdDualInfo Read Error %02x, %d\n", (u8)g_cdvdman_istruct.m_last_error, 0);
3872 for ( i = 0; i < 20; i += 1 )
3874 if ( g_cdvdman_ptoc[i + 104] != g_masterdisc_header[i] )
3881 if ( !DvdDual_infochk() )
3885 *on_dual = !!g_cdvdman_istruct.m_opo_or_para;
3886 *layer1_start = g_cdvdman_istruct.m_layer_1_lsn;
3889 if ( g_cdvdman_ptoc[131] != 2 || !(g_cdvdman_ptoc[132] & 2) )
3893 g_cdvdman_istruct.m_current_dvd = g_cdvdman_ptoc[133];
3894 g_cdvdman_istruct.m_current_dvd_lsn =
3895 g_cdvdman_ptoc[134] + (g_cdvdman_ptoc[135] << 8) + (g_cdvdman_ptoc[136] << 16) + (g_cdvdman_ptoc[137] << 24) + 1;
3896 g_cdvdman_istruct.m_opo_or_para = 0;
3897 g_cdvdman_istruct.m_layer_1_lsn = g_cdvdman_istruct.m_current_dvd_lsn;
3898 g_cdvdman_istruct.m_dual_layer_emulation = 1;
3900 *layer1_start = g_cdvdman_istruct.m_layer_1_lsn;
3903 "sceCdReadDvdDualInfo():Cur_Disk %d layer1_start %d\n",
3904 (u8)g_cdvdman_istruct.m_current_dvd,
3905 g_cdvdman_istruct.m_current_dvd_lsn);
3909int sceCdSC(
int code,
int *param)
3920 *param = (int)g_cdvdman_poff_cb;
3921 poffarg_tmp = g_cdvdman_poffarg;
3923 return (
int)poffarg_tmp;
3927 return sceCdLsnDualChg(*param);
3929 return DvdDual_infochk();
3931 g_cdvdman_istruct.m_last_read_timeout = *param;
3934 return g_cdvdman_stream_timeout;
3936 *param = (int)&g_verbose_level;
3939 return g_cdvdman_sync_timeout;
3941 *param = (int)&g_cdvdman_istruct;
3944 BootMode = QueryBootMode(4);
3947 switch ( *(u8 *)BootMode )
3952 g_cdvdman_mmode = 0xFF;
3955 g_cdvdman_mmode = SCECdMmodeCd;
3968 return g_cdvdman_mmode == SCECdMmodeCd || g_cdvdman_mmode == 0xFF;
3970 return g_cdvdman_mmode == SCECdMmodeDvd || g_cdvdman_mmode == 0xFF;
3972 return g_cdvdman_mmode == 0xFF;
3977 return g_cdvdman_intr_efid;
3981 WaitEventFlag(g_fio_fsv_evid, 1, WEF_AND | WEF_CLEAR, &efbits);
3985 SetEventFlag(g_fio_fsv_evid, 1);
3987 g_cdvdman_ee_rpc_fno = *param;
3988 VERBOSE_KPRINTF(1,
"EE_ncmd_working code= %d\n", *param);
3989 return g_cdvdman_ee_rpc_fno;
3991 return (u16)_irx_id.v;
3993 g_cdvdman_spinctl = *param;
3996 return g_cdvdman_cd36key;
3998 return g_cdvdman_istruct.m_read2_flag;
4000 g_cdvdman_istruct.m_last_error = *(u8 *)param;
4001 return (u8)g_cdvdman_istruct.m_last_error;
4006 *param = (u8)g_cdvdman_istruct.m_last_error;
4009 g_cdvdman_istruct.m_stream_flag = code;
4011 return g_cdvdman_istruct.m_stream_flag;
4013 VERBOSE_KPRINTF(1,
"sceCdSC func_num Not found %d\n", code);
4018static void cdvdman_init()
4024 USE_DEV5_MMIO_HWPORT();
4026 g_cdvdman_user_cb = 0;
4027 g_cdvdman_poff_cb = 0;
4028 g_cdvdman_cmdfunc = 0;
4029 g_cdvdman_istruct.m_drive_interupt_request = 0;
4031 RegisterIntrHandler(IOP_IRQ_DMA_CDVD, 1, (
int (*)(
void *))intrh_dma_3, &g_cdvdman_istruct);
4033 sceCdSC(0xFFFFFFF3, &scres_unused);
4034 dmac_set_dpcr(dmac_get_dpcr() | 0x8000);
4035 dmac_ch_set_chcr(3, 0);
4036 if ( (dev5_mmio_hwport->m_dev5_reg_008 & 4) )
4038 dev5_mmio_hwport->m_dev5_reg_008 = 4;
4040 if ( (dev5_mmio_hwport->m_dev5_reg_008 & 1) )
4042 dev5_mmio_hwport->m_dev5_reg_008 = 1;
4045 g_cdvdman_istruct.m_tray_is_open = (dev5_mmio_hwport->m_dev5_reg_00A ^ 1) & 1;
4047 BootMode = QueryBootMode(6);
4048 g_cdvdman_istruct.m_no_dec_flag = BootMode ? ((*(u16 *)BootMode & 0xFFFC) == 0x60) : 0;
4057 USE_DEV5_MMIO_HWPORT();
4059 VERBOSE_PRINTF(1,
"sceCdInit called mode= %d\n", mode);
4064 g_cdvdman_istruct.m_cd_inited = 0;
4067 cdvdman_ncmd_sender_06();
4069 VERBOSE_PRINTF(1,
"Cdvdman Exit\n");
4077 VERBOSE_PRINTF(1,
"Cdvdman Init\n");
4078 g_cdvdman_istruct.m_read2_flag = 0;
4079 g_cdvdman_istruct.m_dec_shift = 0;
4080 g_cdvdman_istruct.m_check_version = 0;
4081 g_cdvdman_istruct.m_dec_state = 0;
4084 g_cdvdman_istruct.m_cd_inited = 1;
4088 u8 ready_status_tmp;
4090 int ready_status_mask_c0h;
4092 ready_status_tmp = 0;
4093 VERBOSE_PRINTF(1,
"sceCdInit Ready check start.\n");
4094 for ( ready_status_mask_c0h = 0; ready_status_mask_c0h != 0x40; ready_status_mask_c0h = ready_status & 0xC0 )
4096 ready_status = dev5_mmio_hwport->m_dev5_reg_005;
4097 vDelayThread(10000);
4098 if ( ready_status != ready_status_tmp )
4100 ready_status_tmp = ready_status;
4101 VERBOSE_PRINTF(1,
"sceCdInit Dev5 Status %x\n", ready_status);
4104 VERBOSE_PRINTF(1,
"sceCdInit Ready check end.\n");
4106 g_cdvdman_istruct.m_wait_flag = 1;
4107 g_cdvdman_istruct.m_scmd_flag = 1;
4108 g_cdvdman_istruct.m_last_error = 0;
4109 g_cdvdman_istruct.m_last_read_timeout = 0;
4110 g_cdvdman_spinctl = -1;
4111 SetEventFlag(g_cdvdman_intr_efid, 0x29);
4112 SetEventFlag(g_ncmd_evid, 1);
4113 SetEventFlag(g_scmd_evid, 1);
4114 SetEventFlag(g_sfile_evid, 1);
4118static int set_prev_command(
int cmd,
const char *sdata,
int sdlen,
char *rdata,
int rdlen,
int check_sef)
4125 if ( check_sef == 1 && PollEventFlag(g_scmd_evid, 1, WEF_AND | WEF_CLEAR, &efbits) == KE_EVF_COND )
4129 g_cdvdman_istruct.m_scmd = cmd;
4130 g_cdvdman_istruct.m_sdlen = sdlen;
4131 g_cdvdman_istruct.m_rdlen = rdlen;
4132 for ( i = 0; i < sdlen; i += 1 )
4134 g_cdvdman_istruct.m_scmd_sd[i] = sdata[i];
4136 if ( g_cdvdman_istruct.m_wait_flag )
4138 g_cdvdman_istruct.m_scmd_flag = 1;
4139 cdvdman_write_scmd(&g_cdvdman_istruct);
4143 while ( (dmac_ch_get_chcr(3) & 0x1000000) && !g_cdvdman_istruct.m_wait_flag )
4145 VERBOSE_KPRINTF(1,
"set_prev_command: DMA Wait\n");
4147 g_cdvdman_istruct.m_scmd_flag = 1;
4148 cdvdman_write_scmd(&g_cdvdman_istruct);
4152 g_cdvdman_istruct.m_scmd_flag = 0;
4155 for ( i = 0; i < 500; i += delaybackoff )
4157 if ( g_cdvdman_istruct.m_scmd_flag )
4159 for ( j = 0; j < rdlen; j += 1 )
4161 rdata[j] = g_cdvdman_istruct.m_scmd_rd[j];
4163 if ( check_sef == 1 )
4165 vSetEventFlag(g_scmd_evid, 1);
4167 return (u8)g_cdvdman_istruct.m_scmd;
4169 vDelayThread(1000 * delaybackoff);
4170 if ( (i & 1) && delaybackoff < 16 )
4175 g_cdvdman_istruct.m_scmd_flag = 1;
4176 if ( check_sef == 1 )
4178 vSetEventFlag(g_scmd_evid, 1);
4189 USE_DEV5_MMIO_HWPORT();
4191 for ( i = 0; i <= 0; i += 1 )
4195 if ( (dev5_mmio_hwport->m_dev5_reg_017 & 0x80) )
4197 *(u16 *)&s->m_scmd_flag = 1;
4200 while ( !(dev5_mmio_hwport->m_dev5_reg_017 & 0x40) )
4204 for ( j = 0; j < (u8)s->m_sdlen; j += 1 )
4206 dev5_mmio_hwport->m_dev5_reg_017 = s->m_scmd_sd[j];
4208 dev5_mmio_hwport->m_dev5_reg_016 = s->m_scmd;
4211 for ( j = 0; dev5_mmio_hwport->m_dev5_reg_017 & 0x80; j += 1 )
4215 *(u16 *)&s->m_scmd_flag = 1;
4222 for ( j = 0; dev5_mmio_hwport->m_dev5_reg_017 & 0x80; j += 1 )
4227 *(u16 *)&s->m_scmd_flag = 1;
4233 for ( j = 0; j < (u8)s->m_rdlen; j += 1 )
4235 if ( (dev5_mmio_hwport->m_dev5_reg_017 & 0x40) )
4239 rdptr1[j] = dev5_mmio_hwport->m_dev5_reg_018;
4241 if ( j >= (u8)s->m_rdlen )
4244 VERBOSE_KPRINTF(1,
"Prev Cmd Result Over Flow\n", rdptr1);
4247 if ( (!overflowcond && j >= (u8)s->m_rdlen) || s->m_rdlen == 16 )
4251 VERBOSE_KPRINTF(1,
"Prev Cmd Result Illegal Size Try count:%d\n", i);
4255 *(u16 *)&s->m_scmd_flag = 1;
4259 for ( j = 0; j < (
sizeof(s->m_scmd_rd) /
sizeof(s->m_scmd_rd[0])); j += 1 )
4261 s->m_scmd_rd[j] = 0;
4263 if ( s->m_rdlen != (
sizeof(s->m_scmd_rd) /
sizeof(s->m_scmd_rd[0])) )
4265 rdcnt = (u8)s->m_rdlen;
4267 for ( j = 0; j < rdcnt; j += 1 )
4269 s->m_scmd_rd[j] = rdptr1[j];
4276static int cdvdman_send_scmd2(
int cmd,
const void *sdata,
int sdlen,
void *rdata,
int rdlen,
int check_sef)
4282 USE_DEV5_MMIO_HWPORT();
4284 if ( check_sef == 1 && PollEventFlag(g_scmd_evid, 1, WEF_AND | WEF_CLEAR, &efbits) == KE_EVF_COND )
4288 for ( i = 0; i <= 0; i += 1 )
4292 if ( (dev5_mmio_hwport->m_dev5_reg_017 & 0x80) )
4294 if ( check_sef == 1 )
4296 vSetEventFlag(g_scmd_evid, 1);
4300 while ( !(dev5_mmio_hwport->m_dev5_reg_017 & 0x40) )
4304 for ( j = 0; j < sdlen; j += 1 )
4306 dev5_mmio_hwport->m_dev5_reg_017 = ((u8 *)sdata)[j];
4308 dev5_mmio_hwport->m_dev5_reg_016 = cmd;
4309 while ( (dev5_mmio_hwport->m_dev5_reg_017 & 0x80) )
4314 for ( j = 0; !(dev5_mmio_hwport->m_dev5_reg_017 & 0x40); j += 1 )
4319 VERBOSE_KPRINTF(1,
"Prev Cmd Result Over Flow\n");
4322 rdstart[j] = dev5_mmio_hwport->m_dev5_reg_018;
4324 if ( (!cmdresoverflow && j >= rdlen) || rdlen == 16 )
4328 VERBOSE_KPRINTF(1,
"Prev Cmd Result Illegal Size Try count:%d\n", i);
4329 while ( !(dev5_mmio_hwport->m_dev5_reg_017 & 0x20) )
4333 for ( j = 0; j < 16 - rdlen; j += 1 )
4338 if ( check_sef == 1 )
4340 vSetEventFlag(g_scmd_evid, 1);
4344 for ( i = 0; i < rdlen; i += 1 )
4346 ((
char *)rdata)[i] = rdstart[i];
4348 if ( check_sef == 1 )
4350 vSetEventFlag(g_scmd_evid, 1);
4359 for ( i = 0; i <= 2500; i += 1 )
4361 if ( set_prev_command(cmdNum, (
const char *)inBuff, inBuffSize, (
char *)outBuff, 16, 1) )
4368 KPRINTF(
"CDVD: set_prev_command TIMEOUT 5(SEC)\n");
4372int sceCdApplySCmd2(u8 cmdNum,
const void *inBuff,
unsigned long int inBuffSize,
void *outBuff)
4376 for ( i = 0; i <= 2500; i += 1 )
4378 if ( cdvdman_send_scmd2(cmdNum, inBuff, inBuffSize, outBuff, 16, 1) )
4384 KPRINTF(
"CDVD: set_prev_command TIMEOUT 5(SEC)\n");
4389int sceCdApplySCmd3(u8 cmdNum,
const void *inBuff,
unsigned long int inBuffSize,
void *outBuff)
4393 for ( i = 0; i <= 2500; i += 1 )
4396 if ( set_prev_command((u8)cmdNum, inBuff, inBuffSize, outBuff, 16, 1) )
4402 KPRINTF(
"CDVD: set_prev_command TIMEOUT 5(SEC)\n");
4412 USE_DEV5_MMIO_HWPORT();
4414 if ( PollEventFlag(g_ncmd_evid, 1, WEF_AND | WEF_CLEAR, &efbits) == KE_EVF_COND )
4421 "Break call: read2_flg= %d func= %d lsn= %d csec= %d nsec= %d\n",
4422 g_cdvdman_istruct.m_read2_flag,
4424 g_cdvdman_istruct.m_cdvdman_lsn,
4425 g_cdvdman_istruct.m_cdvdman_csec,
4426 g_cdvdman_istruct.m_cdvdman_nsec);
4427 if ( g_cdvdman_istruct.m_last_read_timeout )
4429 g_cdvdman_istruct.m_read2_flag = 0;
4432 g_cdvdman_istruct.m_thread_id = GetThreadId();
4433 g_cdvdman_istruct.m_break_cdvdfsv_readchain = 1;
4434 if ( g_cdvdman_istruct.m_dec_state )
4436 g_cdvdman_istruct.m_dec_shift = 0;
4437 g_cdvdman_istruct.m_check_version = 0;
4438 g_cdvdman_istruct.m_dec_state = 0;
4441 g_cdvdman_istruct.m_recover_status = 0;
4444 iSetEventFlag(g_cdvdman_intr_efid, 0x29);
4445 iCancelAlarm((
unsigned int (*)(
void *))read_timeout_alarm_cb, &g_cdvdman_read_alarm_cb_timeout);
4449 SetEventFlag(g_cdvdman_intr_efid, 0x29);
4450 CancelAlarm((
unsigned int (*)(
void *))read_timeout_alarm_cb, &g_cdvdman_read_alarm_cb_timeout);
4452 if ( !g_cdvdman_istruct.m_wait_flag || g_cdvdman_istruct.m_last_read_timeout )
4454 if ( (dev5_mmio_hwport->m_dev5_reg_005 & 0xC0) == 0x40 )
4456 VERBOSE_KPRINTF(1,
"cdvd: NonInter END\n");
4457 g_cdvdman_istruct.m_wait_flag = 1;
4459 g_cdvdman_last_cmdfunc = g_cdvdman_cmdfunc;
4460 g_cdvdman_cmdfunc = SCECdFuncBreak;
4461 dev5_mmio_hwport->m_dev5_reg_007 = 1;
4462 if ( g_cdvdman_istruct.m_last_read_timeout )
4466 g_cdvdman_istruct.m_drive_interupt_request = 0;
4467 VERBOSE_KPRINTF(1,
"cdvd: Abort command On\n");
4469 vSetEventFlag(g_ncmd_evid, 1);
4476 KPRINTF(
"Cmd Time Out %d(msec)\n", sys_clock->lo / 0x9000);
4486 s->m_dma3_param.m_dma3_msectors -= s->m_dma3_param.m_dma3_csectors;
4487 dmacbres = s->m_dma3_param.m_dma3_callback ? s->m_dma3_param.m_dma3_callback() : 1;
4488 s->m_cdvdman_dma3sec += s->m_dma3_param.m_dma3_csectors;
4489 s->m_dma3_param.m_dma3_csectors = ((u32)s->m_read_chunk > (u32)s->m_dma3_param.m_dma3_msectors) ?
4490 (u32)s->m_dma3_param.m_dma3_msectors :
4491 (u32)s->m_read_chunk;
4494 if ( s->m_dma3_param.m_dma3_msectors )
4496 dmac_ch_set_chcr(3, 0);
4497 dmac_ch_get_chcr(3);
4498 dmac_ch_set_madr(3, (u32)s->m_dma3_param.m_dma3_maddress);
4501 ((s->m_dma3_param.m_dma3_blkcount * s->m_dma3_param.m_dma3_csectors) << 16) | s->m_dma3_param.m_dma3_blkwords);
4502 dmac_ch_set_chcr(3, 0x41000200);
4503 dmac_ch_get_chcr(3);
4504 iClearEventFlag(g_cdvdman_intr_efid, ~0x20);
4509 iSetEventFlag(g_cdvdman_intr_efid, 0x20);
4512 if ( !s->m_dma3_param.m_dma3_msectors && s->m_drive_interupt_request )
4515 s->m_drive_interupt_request = 0;
4522 USE_DEV5_MMIO_HWPORT();
4524 if ( (dmac_ch_get_chcr(3) & 0x1000000) )
4526 dev5_mmio_hwport->m_dev5_reg_007 = 1;
4528 g_cdvdman_istruct.m_drive_interupt_request = 0;
4529 g_cdvdman_istruct.m_dma3_param.m_dma3_blkwords = dma3_param->m_dma3_blkwords;
4530 g_cdvdman_istruct.m_dma3_param.m_dma3_blkcount = dma3_param->m_dma3_blkcount;
4531 g_cdvdman_istruct.m_dma3_param.m_dma3_maddress = dma3_param->m_dma3_maddress;
4532 g_cdvdman_istruct.m_dma3_param.m_dma3_callback = dma3_param->m_dma3_callback;
4533 g_cdvdman_istruct.m_dma3_param.m_dma3_csectors = dma3_param->m_dma3_csectors;
4534 g_cdvdman_istruct.m_dma3_param.m_cdvdreg_howto = dma3_param->m_cdvdreg_howto;
4535 g_cdvdman_istruct.m_dma3_param.m_dma3_msectors = dma3_param->m_dma3_msectors;
4536 g_cdvdman_istruct.m_cdvdman_dma3sec = 0;
4537 dmac_ch_set_chcr(3, 0);
4538 dmac_ch_get_chcr(3);
4539 if ( dma3_param->m_dma3_csectors )
4541 vClearEventFlag(g_cdvdman_intr_efid, ~0x20);
4544 dev5_mmio_hwport->m_dev5_reg_006 = dma3_param->m_cdvdreg_howto;
4545 dmac_ch_set_madr(3, (u32)dma3_param->m_dma3_maddress);
4548 (dma3_param->m_dma3_blkcount * (dma3_param->m_dma3_csectors ? dma3_param->m_dma3_csectors : 1)) << 16
4549 | dma3_param->m_dma3_blkwords);
4550 dmac_ch_set_chcr(3, 0x41000200);
4551 return dmac_ch_get_chcr(3);
4555cdvdman_send_ncmd(
int ncmd,
const void *ndata,
int ndlen,
int func,
cdvdman_dma3_parameter_t *dma3_param,
int check_cb)
4559 USE_DEV5_MMIO_HWPORT();
4561 if ( check_cb == 1 && PollEventFlag(g_ncmd_evid, 1, WEF_AND | WEF_CLEAR, &efbits) == KE_EVF_COND )
4566 (dev5_mmio_hwport->m_dev5_reg_005 & 0xC0) != 0x40 || !g_cdvdman_istruct.m_wait_flag
4567 || !(g_cdvdman_istruct.m_read2_flag != 1 || ncmd == 8) || !(g_cdvdman_istruct.m_read2_flag != 2 || ncmd == 6) )
4569 if ( check_cb == 1 )
4571 vSetEventFlag(g_ncmd_evid, 1);
4573 VERBOSE_KPRINTF(1,
"set_cd_commnad Error\tstat %02x\n", (u8)dev5_mmio_hwport->m_dev5_reg_005);
4576 g_cdvdman_iocache = 0;
4579 cdvdman_setdma3(dma3_param);
4581 g_cdvdman_cmdfunc = func;
4584 !g_cdvdman_minver_10700 && g_cdvdman_ncmd == 6 && ncmd && ncmd != g_cdvdman_ncmd && ncmd != 7 && ncmd != 14
4587 g_cdvdman_ncmd_timeout.hi = 0;
4588 g_cdvdman_ncmd_timeout.lo = 0x6978000;
4589 vSetAlarm(&g_cdvdman_ncmd_timeout, (
unsigned int (*)(
void *))ncmd_timeout_alarm_cb, &g_cdvdman_ncmd_timeout);
4590 while ( dev5_mmio_hwport->m_dev5_reg_00A != 10 )
4592 VERBOSE_KPRINTF(1,
"Read Pause 1 chk status 0x%02x\n", dev5_mmio_hwport->m_dev5_reg_00A);
4593 if ( !g_cdvdman_ncmd_timeout.lo )
4595 g_cdvdman_ncmd = ncmd;
4596 if ( check_cb == 1 )
4598 vSetEventFlag(g_ncmd_evid, 1);
4600 KPRINTF(
"Time Out Pause WAIT set_cd_commnad\n");
4605 vCancelAlarm((
unsigned int (*)(
void *))ncmd_timeout_alarm_cb, &g_cdvdman_ncmd_timeout);
4607 g_cdvdman_ncmd = ncmd;
4608 if ( g_cdvdman_istruct.m_dec_state )
4610 sceCdDecSet(!!g_cdvdman_istruct.m_dec_shift, 1, g_cdvdman_istruct.m_dec_shift);
4612 g_cdvdman_istruct.m_last_read_timeout = 0;
4613 g_cdvdman_istruct.m_cdvdman_command = ncmd;
4614 g_cdvdman_istruct.m_last_error = 0;
4615 g_cdvdman_istruct.m_wait_flag = 0;
4616 g_cdvdman_istruct.m_thread_id = GetThreadId();
4619 iClearEventFlag(g_cdvdman_intr_efid, ~1);
4623 ClearEventFlag(g_cdvdman_intr_efid, ~1);
4625 for ( i = 0; i < ndlen; i += 1 )
4627 dev5_mmio_hwport->m_dev5_reg_005 = ((u8 *)ndata)[i];
4629 dev5_mmio_hwport->m_dev5_reg_004 = ncmd;
4630 if ( check_cb == 1 )
4632 vSetEventFlag(g_ncmd_evid, 1);
4639 VERBOSE_KPRINTF(1,
"Apply NCmd call cmd= 0x%02x\n", cmdNum);
4640 while ( cdvdman_send_ncmd(cmdNum, inBuff, inBuffSize, 0, 0, 1) < 0 )
4648int sceCdCheckCmd(
void)
4650 return g_cdvdman_istruct.m_wait_flag;
4653static int cdvdman_mediactl(
int code)
4659 USE_DEV5_MMIO_HWPORT();
4662 if ( PollEventFlag(g_scmd_evid, 1, WEF_AND | WEF_CLEAR, &efbits) == KE_EVF_COND )
4666 reg_00B_tmp_1 = dev5_mmio_hwport->m_dev5_reg_00B & 1;
4667 if ( reg_00B_tmp_1 == g_cdvdman_chmedia )
4670 if ( g_cdvdman_chflags[code] )
4672 g_cdvdman_chflags[code] = 0;
4680 for ( i = 0; i < (
sizeof(g_cdvdman_chflags) /
sizeof(g_cdvdman_chflags[0])); i += 1 )
4682 g_cdvdman_chflags[i] = i != (
unsigned int)code;
4686 if ( ((dev5_mmio_hwport->m_dev5_reg_00A) & 1) != reg_00B_tmp_1 )
4688 while ( !set_prev_command(5, 0, 0, (
char *)&rdata, 1, 0) || rdata )
4693 g_cdvdman_chmedia = dev5_mmio_hwport->m_dev5_reg_00B & 1;
4694 vSetEventFlag(g_scmd_evid, 1);
4700 if ( g_cdvdman_istruct.m_last_error )
4702 VERBOSE_KPRINTF(1,
"sceCdGetError: 0x%02x\n", (u8)g_cdvdman_istruct.m_last_error);
4704 return (u8)g_cdvdman_istruct.m_last_error;
4708int cdvdman_get_last_command()
4710 return (u8)g_cdvdman_istruct.m_cdvdman_command;
4716 return cdvdman_send_ncmd(0, 0, 0, 0, 0, 1) >= 0;
4720int cdvdman_ncmd_sender_01()
4722 return cdvdman_send_ncmd(1, 0, 0, 0, 0, 1) >= 0;
4726static int cdvdman_ncmd_sender_06()
4737 for ( i = 0; i < 48; i += 8 )
4739 KPRINTF(
"CMD_READP call\n");
4751 dma3_param.m_cdvdreg_howto = 128;
4752 dma3_param.m_dma3_blkwords = 32;
4753 dma3_param.m_dma3_blkcount = 128;
4754 dma3_param.m_dma3_csectors = 0;
4755 dma3_param.m_dma3_msectors = 0;
4756 dma3_param.m_dma3_callback = 0;
4757 dma3_param.m_dma3_maddress = g_cdvdman_ptoc;
4758 if ( cdvdman_send_ncmd(6, ndata,
sizeof(ndata), 5, &dma3_param, 1) < 0 )
4783 dma3_param.m_cdvdreg_howto = 128;
4784 dma3_param.m_dma3_blkwords = 32;
4785 dma3_param.m_dma3_blkcount = 16;
4794 dma3_param.m_dma3_csectors = 0;
4795 dma3_param.m_dma3_msectors = 0;
4796 dma3_param.m_dma3_callback = 0;
4797 dma3_param.m_dma3_maddress = g_cdvdman_ptoc;
4798 return cdvdman_send_ncmd(6, ndata,
sizeof(ndata), 5, &dma3_param, 1) >= 0;
4800 return cdvdman_send_ncmd(2, 0, 0, 5, 0, 1) >= 0;
4806 return cdvdman_send_ncmd(3, 0, 0, 6, 0, 1) >= 0;
4811 return cdvdman_send_ncmd(4, 0, 0, 7, 0, 1) >= 0;
4815int cdvdman_ncmd_sender_0B()
4820 return cdvdman_send_ncmd(11, &ndata,
sizeof(ndata), 0, 0, 1) >= 0;
4826 USE_DEV5_MMIO_HWPORT();
4828 KPRINTF(
"Cmd Time Out %d(msec)\n", sys_clock->lo / 0x9000);
4829 dev5_mmio_hwport->m_dev5_reg_007 = 1;
4834static int cdvdman_readtoc(u8 *
toc,
int param,
int func)
4847 dma3_param.m_cdvdreg_howto = 132;
4848 dma3_param.m_dma3_blkwords = 4;
4849 dma3_param.m_dma3_blkcount = 129;
4850 dma3_param.m_dma3_maddress =
toc;
4851 dma3_param.m_dma3_msectors = 0;
4852 dma3_param.m_dma3_csectors = 0;
4853 dma3_param.m_dma3_callback = 0;
4860 dma3_param.m_cdvdreg_howto = 128;
4861 dma3_param.m_dma3_blkwords = 32;
4862 dma3_param.m_dma3_blkcount = 8;
4863 dma3_param.m_dma3_maddress =
toc;
4864 dma3_param.m_dma3_msectors = 0;
4865 dma3_param.m_dma3_csectors = 0;
4866 dma3_param.m_dma3_callback = 0;
4874 if ( cdvdman_send_ncmd(9, &ndata,
sizeof(ndata), func, &dma3_param, 1) < 0 )
4879 sysclk.lo = 0x15F90000;
4880 vSetAlarm(&sysclk, (
unsigned int (*)(
void *))readtoc_timeout_alarm_cb, &sysclk);
4882 vCancelAlarm((
unsigned int (*)(
void *))readtoc_timeout_alarm_cb, &sysclk);
4884 if ( g_cdvdman_minver_10700 && !
sceCdPause() )
4892static int cdvdman_gettoc(u8 *
toc)
4894 return cdvdman_readtoc(
toc, 0, 3);
4899 int sector_sizes[4];
4901 sector_sizes[0] = 0x800;
4902 sector_sizes[1] = 0x918;
4903 sector_sizes[2] = 0x924;
4904 if ( g_cdvdman_istruct.m_recover_status && g_cdvdman_istruct.m_recover_status != 3 )
4908 if ( g_cdvdman_cmdfunc == SCECdFuncReadCDDA || g_cdvdman_cmdfunc == 12 )
4910 return dmac_ch_get_madr(3) - (uiptr)g_cdvdman_readbuf;
4912 if ( g_cdvdman_istruct.m_read2_flag )
4914 return g_cdvdman_readptr * sector_sizes[g_cdvdman_istruct.m_cdvdman_pattern];
4916 if ( g_cdvdman_cmdfunc == SCECdFuncRead )
4918 return dmac_ch_get_madr(3) - (uiptr)g_cdvdman_readbuf;
4923static int cdvdman_speedctl(u32 spindlctrl,
int dvdflag, u32 maxlsn)
4927 switch ( spindlctrl )
4930 return dvdflag ? 2 : 4;
4936 if ( g_cdvdman_minver_10700 )
4940 maxlsn_chk = 0x128000;
4941 if ( g_cdvdman_istruct.m_opo_or_para )
4943 maxlsn -= (maxlsn >= (u32)g_cdvdman_istruct.m_layer_1_lsn) ? g_cdvdman_istruct.m_layer_1_lsn : 0;
4944 maxlsn_chk = 0x165000;
4946 if ( maxlsn >= maxlsn_chk )
4948 VERBOSE_KPRINTF(1,
"Kprob Spd D lsn= %d\n", maxlsn);
4958 return dvdflag ? 2 : 131;
4960 return dvdflag ? 3 : 4;
4964 return dvdflag ? 4 : 2;
4968 return dvdflag ? 130 : 131;
4970 return dvdflag ? 130 : 132;
4972 return dvdflag ? 1 : 131;
4974 return dvdflag ? 3 : 5;
4976 return dvdflag ? 131 : 133;
4980static int cdvdman_isdvd()
4989 g_cdvdman_istruct.m_tray_is_open = 1;
4992 g_cdvdman_istruct.m_tray_is_open = 1;
4996 g_cdvdman_istruct.m_tray_is_open = 1;
4999 g_cdvdman_istruct.m_tray_is_open = 1;
5006static int sceCdRead0_Rty(u32 lsn, u32 nsec,
void *buf,
const sceCdRMode *mode,
int ncmd,
int dintrsec,
void *func)
5011 g_cdvdman_readbuf = buf;
5012 VERBOSE_KPRINTF(1,
"sceCdRead0_Rty Lsn:%d nsec:%d dintrnsec %d func %08x\n", lsn, nsec, dintrsec, func);
5013 *(u32 *)ndata = lsn;
5014 *(u32 *)&ndata[4] = nsec;
5015 ndata[8] = mode->trycount;
5016 ndata[9] = cdvdman_speedctl(mode->spindlctrl, cdvdman_isdvd(), lsn + nsec);
5017 dma3_param.m_dma3_csectors = dintrsec;
5018 dma3_param.m_dma3_callback = (int (*)(void))func;
5019 dma3_param.m_dma3_msectors = nsec;
5020 dma3_param.m_dma3_maddress = buf;
5021 dma3_param.m_dma3_blkcount = (!(u16)dintrsec) ? nsec : 1;
5024 ndata[10] = mode->datapattern;
5025 switch ( mode->datapattern )
5028 dma3_param.m_dma3_blkwords = 6;
5029 dma3_param.m_dma3_blkcount *= 97;
5030 dma3_param.m_cdvdreg_howto = 134;
5033 dma3_param.m_dma3_blkwords = 15;
5034 dma3_param.m_dma3_blkcount *= 39;
5035 dma3_param.m_cdvdreg_howto = 143;
5039 dma3_param.m_dma3_blkwords = 32;
5040 dma3_param.m_dma3_blkcount *= 16;
5041 dma3_param.m_cdvdreg_howto = 128;
5044 if ( cdvdman_send_ncmd(ncmd, ndata,
sizeof(ndata), 1, &dma3_param, 0) >= 0 )
5051 dma3_param.m_dma3_blkwords = 12;
5052 dma3_param.m_dma3_blkcount *= 43;
5053 dma3_param.m_cdvdreg_howto = 140;
5055 if ( cdvdman_send_ncmd(ncmd, ndata,
sizeof(ndata), 14, &dma3_param, 0) >= 0 )
5063int sceCdRead0(u32 lsn, u32 sectors,
void *buffer,
sceCdRMode *mode,
int csec,
void *callback)
5069 if ( PollEventFlag(g_ncmd_evid, 1, WEF_AND | WEF_CLEAR, &efbits) == KE_EVF_COND )
5075 "DVD/CD sceCdRead0 sec %d num %d spin %d trycnt %d dptn %d adr %08x\n",
5082 g_cdvdman_readbuf = buffer;
5083 dma3_param.m_dma3_csectors = (csec && (sectors < (u32)csec)) ? sectors : (u32)csec;
5084 dma3_param.m_dma3_callback = (int (*)(void))callback;
5085 dma3_param.m_dma3_msectors = sectors;
5086 dma3_param.m_dma3_blkcount = (!csec) ? sectors : 1;
5087 switch ( mode->datapattern )
5090 dma3_param.m_dma3_blkwords = 6;
5091 dma3_param.m_dma3_blkcount *= 97;
5092 dma3_param.m_cdvdreg_howto = 134;
5095 dma3_param.m_dma3_blkwords = 15;
5096 dma3_param.m_dma3_blkcount *= 39;
5097 dma3_param.m_cdvdreg_howto = 143;
5101 dma3_param.m_dma3_blkwords = 32;
5102 dma3_param.m_dma3_blkcount *= 16;
5103 dma3_param.m_cdvdreg_howto = 128;
5113 if ( g_cdvdman_mmode != SCECdMmodeCd && g_cdvdman_mmode != 0xFF )
5115 vSetEventFlag(g_ncmd_evid, 1);
5118 g_cdvdman_istruct.m_dvd_flag = 0;
5121 if ( g_cdvdman_mmode != SCECdMmodeDvd && g_cdvdman_mmode != 0xFF )
5123 vSetEventFlag(g_ncmd_evid, 1);
5126 g_cdvdman_istruct.m_dvd_flag = 1;
5129 vSetEventFlag(g_ncmd_evid, 1);
5132 g_cdvdman_istruct.m_read_mode = *mode;
5133 g_cdvdman_istruct.m_read_callback = callback;
5134 g_cdvdman_istruct.m_read_chunk = dma3_param.m_dma3_csectors;
5135 g_cdvdman_istruct.m_read_lsn = lsn;
5136 g_cdvdman_istruct.m_read_sectors = sectors;
5137 *(u32 *)ndata = lsn;
5138 *(u32 *)&ndata[4] = sectors;
5139 ndata[8] = mode->trycount;
5140 ndata[9] = cdvdman_speedctl(mode->spindlctrl, g_cdvdman_istruct.m_dvd_flag, lsn + sectors);
5141 g_cdvdman_istruct.m_read_buf = buffer;
5142 ndata[10] = mode->datapattern;
5143 dma3_param.m_dma3_maddress = buffer;
5144 VERBOSE_KPRINTF(1,
"Read Command call\n");
5145 if ( cdvdman_send_ncmd(6, ndata,
sizeof(ndata), 1, &dma3_param, 0) < 0 )
5147 vSetEventFlag(g_ncmd_evid, 1);
5150 vSetEventFlag(g_ncmd_evid, 1);
5163 for ( i = 0; i < common->m_dma3_param.m_dma3_csectors; i += 1 )
5169 if ( common->m_read2_flag == 3 )
5172 cdrloc.
minute = cdvdman_syncdec(
5173 common->m_dec_state, common->m_check_version, common->m_dec_shift, g_cdvdman_ptoc[(i * sblock)]);
5174 cdrloc.
second = cdvdman_syncdec(
5175 common->m_dec_state, common->m_check_version, common->m_dec_shift, g_cdvdman_ptoc[(i * sblock) + 1]);
5176 cdrloc.
sector = cdvdman_syncdec(
5177 common->m_dec_state, common->m_check_version, common->m_dec_shift, g_cdvdman_ptoc[(i * sblock) + 2]);
5183 syncdec_res_1 = (u8)cdvdman_syncdec(
5184 common->m_dec_state, common->m_check_version, common->m_dec_shift, g_cdvdman_ptoc[(i * sblock) + 3]);
5186 (u8)cdvdman_syncdec(
5187 common->m_dec_state, common->m_check_version, common->m_dec_shift, g_cdvdman_ptoc[(i * sblock) + 2])
5190 (u8)cdvdman_syncdec(
5191 common->m_dec_state, common->m_check_version, common->m_dec_shift, g_cdvdman_ptoc[(i * sblock) + 1])
5193 syncdec_res_4 = cdvdman_syncdec(
5194 common->m_dec_state, common->m_check_version, common->m_dec_shift, g_cdvdman_ptoc[(i * sblock)]);
5195 if ( !common->m_cdvdman_dma3sec && !common->m_interupt_read_state )
5197 common->m_interupt_read_state = (syncdec_res_4 & 0xC) | (((syncdec_res_4 & 0xC) && i) ? 0x80 : 0);
5199 cdreadlsn = (syncdec_res_1 - 0x30000) + (( common->m_opo_or_para && ((
unsigned int)(common->m_cdvdman_lsn + common->m_cdvdman_csec + i) >= common->m_layer_1_lsn && common->m_opo_or_para == 1) ) ? common->m_layer_1_lsn : 0);
5201 errlsn = common->m_cdvdman_lsn + common->m_cdvdman_csec + common->m_cdvdman_dma3sec + i;
5202 if ( cdreadlsn != (u32)errlsn )
5205 1,
"Read_IOP Sector_ID error lsn= %d readlsn= %d layer= %d\n", errlsn, cdreadlsn, (syncdec_res_4 & 1));
5209 if ( i == common->m_dma3_param.m_dma3_csectors )
5214 switch ( common->m_cdvdman_pattern )
5225 &((
char *)(common->m_cdvdman_rbuffer))[0x924 * common->m_cdvdman_dma3sec],
5226 (
const char *)g_cdvdman_ptoc,
5232 for ( i = 0; i < common->m_dma3_param.m_dma3_csectors; i += 1 )
5235 &((
char *)(common->m_cdvdman_rbuffer))[(common->m_cdvdman_dma3sec + i) * size],
5236 (
const char *)&g_cdvdman_ptoc[12 + (i * sblock)],
5240 g_cdvdman_readptr = common->m_cdvdman_csec + common->m_cdvdman_dma3sec;
5244 common->m_sync_error += 1;
5249static int cdvdman_read(u32 lsn, u32 sectors,
void *buf,
sceCdRMode *mode,
int decflag,
int shift,
int ef1,
int ef2)
5256 dvd = cdvdman_isdvd();
5259 if ( !DvdDual_infochk() )
5263 vSetEventFlag(ef1, ef2);
5267 lsn = sceCdLsnDualChg(lsn);
5269 else if ( mode->datapattern == SCECdSecS2328 || (g_cdvdman_cd36key && !g_cdvdman_istruct.m_dec_state) )
5273 if ( g_cdvdman_cd36key && !g_cdvdman_istruct.m_dec_state && mode->spindlctrl ==
SCECdSpinNom )
5278 read0_res = sceCdRead0(lsn, sectors, buf, mode, 0, 0);
5281 vSetEventFlag(ef1, ef2);
5287 if ( (
sceCdDiskReady(8) & 0xC0) != 0x40 || g_cdvdman_istruct.m_read2_flag )
5291 "sceCdRead: Double Booking error r2f= %d waf= %d\n",
5292 g_cdvdman_istruct.m_read2_flag,
5293 g_cdvdman_istruct.m_wait_flag);
5296 vSetEventFlag(ef1, ef2);
5303 g_cdvdman_istruct.m_dec_shift = shift;
5304 g_cdvdman_istruct.m_dec_state = 1;
5306 g_cdvdman_readbuf = buf;
5307 g_cdvdman_readptr = 0;
5308 g_cdvdman_istruct.m_cdvdman_lsn = lsn;
5309 g_cdvdman_istruct.m_cdvdman_csec = 0;
5310 g_cdvdman_istruct.m_cdvdman_nsec = sectors;
5311 g_cdvdman_istruct.m_cdvdman_rbuffer = (int)buf;
5312 g_cdvdman_istruct.m_cdvdman_pattern = dvd ? SCECdSecS2048 : mode->datapattern;
5313 g_cdvdman_istruct.m_cdvdman_cdrmode.
trycount = mode->trycount;
5314 g_cdvdman_istruct.m_cdvdman_cdrmode.
spindlctrl = mode->spindlctrl;
5315 g_cdvdman_istruct.m_cdvdman_cdrmode.
datapattern = dvd ? SCECdSecS2048 : SCECdSecS2340;
5316 g_cdvdman_istruct.m_read2_flag = dvd ? 1 : 3;
5317 g_cdvdman_istruct.m_sync_error = 0;
5318 g_cdvdman_istruct.m_interupt_read_state = 0;
5319 g_cdvdman_istruct.m_cdvdman_rsec = (sectors >= 0x41) ? (((lsn & 0xF)) ? (0x10 - (lsn & 0xF)) : 0x40) : sectors;
5320 g_cdvdman_read_alarm_cb_timeout.hi = 0;
5321 g_cdvdman_read_alarm_cb_timeout.lo = 0x9000 * sceCdSC(0xFFFFFFF1, &scres_unused);
5323 &g_cdvdman_read_alarm_cb_timeout,
5324 (
unsigned int (*)(
void *))read_timeout_alarm_cb,
5325 &g_cdvdman_read_alarm_cb_timeout);
5326 read_res = (dvd ?
sceCdRV : sceCdRead0)(
5328 g_cdvdman_istruct.m_cdvdman_rsec,
5330 dvd ? mode : &g_cdvdman_istruct.m_cdvdman_cdrmode,
5336 g_cdvdman_istruct.m_cdvdman_rsec = 0;
5337 g_cdvdman_istruct.m_read2_flag = 0;
5338 if ( g_cdvdman_istruct.m_dec_state )
5340 g_cdvdman_istruct.m_dec_shift = 0;
5341 g_cdvdman_istruct.m_check_version = 0;
5342 g_cdvdman_istruct.m_dec_state = 0;
5345 vCancelAlarm((
unsigned int (*)(
void *))read_timeout_alarm_cb, &g_cdvdman_read_alarm_cb_timeout);
5349 vSetEventFlag(ef1, ef2);
5357 return cdvdman_read(lsn, sectors, buf, mode, 0, 0, 0, 0);
5366 memset(&efinfo, 0,
sizeof(efinfo));
5368 vReferEventFlagStatus(g_fio_fsv_evid, &efinfo);
5374 vClearEventFlag(g_fio_fsv_evid, ~1);
5376 return cdvdman_read(lbn, sectors, buffer, mode, 0, 0, g_fio_fsv_evid, 1);
5379static int cdvdman_syncdec(
int decflag,
int decxor,
int shift, u32 data)
5381 return decflag ? ((u8)(((u8)data << (shift % 8)) | ((u8)data >> (8 - shift % 8))) ^ (u8)decxor) : (u8)data;
5384static void Read2intrCDVD(
int read2_flag)
5386 iCancelAlarm((
unsigned int (*)(
void *))read_timeout_alarm_cb, &g_cdvdman_read_alarm_cb_timeout);
5387 if ( g_cdvdman_istruct.m_last_error || g_cdvdman_retries >= 5 )
5389 if ( !g_cdvdman_istruct.m_last_error )
5393 g_cdvdman_istruct.m_read2_flag = 0;
5394 g_cdvdman_retries = 0;
5395 g_cdvdman_rtindex = 0;
5396 g_cdvdman_readptr = 0;
5397 if ( g_cdvdman_istruct.m_dec_state )
5399 g_cdvdman_istruct.m_dec_shift = 0;
5400 g_cdvdman_istruct.m_check_version = 0;
5401 g_cdvdman_istruct.m_dec_state = 0;
5403 g_cdvdman_istruct.m_interupt_read_state = 0;
5405 else if ( !g_cdvdman_istruct.m_interupt_read_state || g_cdvdman_istruct.m_cdvdman_csec )
5409 g_cdvdman_istruct.m_interupt_read_state = 0;
5410 if ( g_cdvdman_istruct.m_sync_error )
5414 if ( !g_cdvdman_rtindex )
5416 g_cdvdman_rtindex = 3;
5417 g_cdvdman_retries += 1;
5419 g_cdvdman_istruct.m_sync_error = 0;
5420 lsn_tmp = g_cdvdman_istruct.m_cdvdman_lsn + g_cdvdman_istruct.m_cdvdman_csec;
5421 if ( lsn_tmp >= 0x30 )
5423 lsn_tmp -= 0x10 * (g_cdvdman_rtindex - 1);
5427 lsn_tmp += 0x10 * (g_cdvdman_rtindex - 1);
5429 if ( ((read2_flag == 3) ? sceCdRead0 : sceCdRV)(
5431 g_cdvdman_istruct.m_cdvdman_rsec,
5433 &g_cdvdman_istruct.m_cdvdman_cdrmode,
5437 g_cdvdman_read_alarm_cb_timeout.hi = 0;
5438 g_cdvdman_read_alarm_cb_timeout.lo = 0x9000 * sceCdSC(0xFFFFFFF1, &scres_unused);
5440 &g_cdvdman_read_alarm_cb_timeout,
5441 (
unsigned int (*)(
void *))read_timeout_alarm_cb,
5442 &g_cdvdman_read_alarm_cb_timeout);
5446 VERBOSE_KPRINTF(1,
"Retry Read Fatal Error\n");
5448 g_cdvdman_istruct.m_read2_flag = 0;
5449 g_cdvdman_retries = 0;
5450 g_cdvdman_rtindex = 0;
5451 g_cdvdman_readptr = 0;
5452 if ( g_cdvdman_istruct.m_dec_state )
5454 g_cdvdman_istruct.m_dec_shift = 0;
5455 g_cdvdman_istruct.m_check_version = 0;
5456 g_cdvdman_istruct.m_dec_state = 0;
5459 g_cdvdman_rtindex -= !!g_cdvdman_rtindex;
5465 g_cdvdman_retries = 0;
5466 switch ( g_cdvdman_istruct.m_cdvdman_pattern )
5479 g_cdvdman_istruct.m_cdvdman_rbuffer += cdsectorsz * g_cdvdman_istruct.m_cdvdman_rsec;
5480 g_cdvdman_istruct.m_cdvdman_csec += g_cdvdman_istruct.m_cdvdman_rsec;
5481 if ( (
unsigned int)g_cdvdman_istruct.m_cdvdman_csec < (
unsigned int)g_cdvdman_istruct.m_cdvdman_nsec )
5483 g_cdvdman_istruct.m_cdvdman_rsec =
5484 ((
unsigned int)(g_cdvdman_istruct.m_cdvdman_csec + 0x40) < (
unsigned int)g_cdvdman_istruct.m_cdvdman_nsec) ?
5486 (g_cdvdman_istruct.m_cdvdman_nsec - g_cdvdman_istruct.m_cdvdman_csec);
5487 if ( ((read2_flag == 3) ? sceCdRead0 : sceCdRV)(
5488 g_cdvdman_istruct.m_cdvdman_lsn + g_cdvdman_istruct.m_cdvdman_csec,
5489 g_cdvdman_istruct.m_cdvdman_rsec,
5491 &g_cdvdman_istruct.m_cdvdman_cdrmode,
5495 g_cdvdman_read_alarm_cb_timeout.hi = 0;
5496 g_cdvdman_read_alarm_cb_timeout.lo = 0x9000 * sceCdSC(0xFFFFFFF1, &scres_unused);
5498 &g_cdvdman_read_alarm_cb_timeout,
5499 (unsigned int (*)(void *))read_timeout_alarm_cb,
5500 &g_cdvdman_read_alarm_cb_timeout);
5504 g_cdvdman_istruct.m_last_error = SCECdErNORDY;
5505 g_cdvdman_istruct.m_read2_flag = 0;
5506 g_cdvdman_readptr = 0;
5507 if ( g_cdvdman_istruct.m_dec_state )
5509 g_cdvdman_istruct.m_dec_shift = 0;
5510 g_cdvdman_istruct.m_check_version = 0;
5511 g_cdvdman_istruct.m_dec_state = 0;
5517 g_cdvdman_istruct.m_read2_flag = 0;
5518 g_cdvdman_readptr = 0;
5519 if ( g_cdvdman_istruct.m_dec_state )
5521 g_cdvdman_istruct.m_dec_shift = 0;
5522 g_cdvdman_istruct.m_check_version = 0;
5523 g_cdvdman_istruct.m_dec_state = 0;
5530 g_cdvdman_istruct.m_last_error = ((g_cdvdman_istruct.m_interupt_read_state & 0x80)) ?
SCECdErREADCF :
SCECdErIPI;
5531 g_cdvdman_istruct.m_interupt_read_state = 0;
5532 VERBOSE_KPRINTF(1,
"IPIerr emu Hit Dummy Err %02x\n", (u8)g_cdvdman_istruct.m_last_error);
5533 g_cdvdman_istruct.m_read2_flag = 0;
5534 g_cdvdman_retries = 0;
5535 g_cdvdman_rtindex = 0;
5536 g_cdvdman_readptr = 0;
5537 if ( g_cdvdman_istruct.m_dec_state )
5539 g_cdvdman_istruct.m_dec_shift = 0;
5540 g_cdvdman_istruct.m_check_version = 0;
5541 g_cdvdman_istruct.m_dec_state = 0;
5554static int cdvdman_readfull(u32 lsn, u32 sectors,
void *buf,
const sceCdRMode *mode,
int flag)
5559 VERBOSE_KPRINTF(1,
"lsn:%d nsec:%d buf:% cmdmode:%d\n", lsn, sectors, buf, flag);
5560 g_cdvdman_readbuf = buf;
5561 dma3_param.m_dma3_csectors = 0;
5562 dma3_param.m_dma3_msectors = 0;
5563 dma3_param.m_dma3_callback = 0;
5564 dma3_param.m_dma3_blkcount = sectors;
5565 switch ( mode->datapattern )
5568 dma3_param.m_dma3_blkwords = 8;
5569 dma3_param.m_dma3_blkcount *= 74;
5570 dma3_param.m_cdvdreg_howto = 136;
5573 dma3_param.m_dma3_blkwords = 12;
5574 dma3_param.m_dma3_blkcount *= 51;
5575 dma3_param.m_cdvdreg_howto = 140;
5579 dma3_param.m_dma3_blkwords = 12;
5580 dma3_param.m_dma3_blkcount *= 49;
5581 dma3_param.m_cdvdreg_howto = 140;
5594 if ( g_cdvdman_mmode != SCECdMmodeCd && g_cdvdman_mmode != 0xFF )
5598 *(u32 *)ndata = lsn;
5599 *(u32 *)&ndata[4] = sectors;
5600 ndata[8] = mode->trycount;
5601 ndata[9] = cdvdman_speedctl(mode->spindlctrl, 0, lsn + sectors);
5602 dma3_param.m_dma3_maddress = buf;
5603 ndata[10] = mode->datapattern;
5604 return cdvdman_send_ncmd((!flag) ? 7 : 14, ndata,
sizeof(ndata), (!flag) ? 2 : 12, &dma3_param, 1) >= 0;
5607int sceCdReadCDDA(u32 lbn, u32 sectors,
void *buffer,
sceCdRMode *mode)
5609 return cdvdman_readfull(lbn, sectors, buffer, mode, 0);
5621 || (PollEventFlag(g_ncmd_evid, 1, WEF_AND | WEF_CLEAR, &efbits) == KE_EVF_COND) )
5626 1,
"RV read: sec %d num %d spin %d trycnt %d addr %08x\n", lsn, sectors, mode->spindlctrl, mode->trycount, buf);
5627 g_cdvdman_readbuf = buf;
5628 g_cdvdman_istruct.m_dvd_flag = cdvdman_isdvd();
5629 g_cdvdman_istruct.m_read_mode = *mode;
5630 g_cdvdman_istruct.m_read_lsn = lsn;
5631 g_cdvdman_istruct.m_read_sectors = sectors;
5632 *(u32 *)ndata = lsn;
5633 *(u32 *)&ndata[4] = sectors;
5634 ndata[8] = mode->trycount;
5635 ndata[9] = cdvdman_speedctl(mode->spindlctrl, 1, lsn + sectors);
5637 dma3_param.m_dma3_csectors = (arg5 && (sectors < (u32)arg5)) ? sectors : (u32)arg5;
5638 g_cdvdman_istruct.m_read_chunk = dma3_param.m_dma3_csectors;
5639 dma3_param.m_cdvdreg_howto = 140;
5640 dma3_param.m_dma3_blkwords = 12;
5641 g_cdvdman_istruct.m_read_buf = buf;
5642 dma3_param.m_dma3_blkcount = (!arg5) ? sectors : 1;
5643 dma3_param.m_dma3_blkcount *= 43;
5644 dma3_param.m_dma3_msectors = sectors;
5645 dma3_param.m_dma3_callback = (int (*)(void))cb;
5646 g_cdvdman_istruct.m_read_callback = cb;
5647 dma3_param.m_dma3_maddress = buf;
5648 if ( cdvdman_send_ncmd(8, ndata,
sizeof(ndata), 14, &dma3_param, 0) < 0 )
5650 vSetEventFlag(g_ncmd_evid, 1);
5653 vSetEventFlag(g_ncmd_evid, 1);
5662 if ( cdvdman_isdvd() )
5664 if ( !DvdDual_infochk() )
5668 ndata = sceCdLsnDualChg(ndata);
5670 return cdvdman_send_ncmd(5, &ndata, 4, 4, 0, 1) >= 0;
5678 command = set_prev_command(18, 0, 0, (
char *)rdata,
sizeof(rdata), 1);
5680 memcpy(buffer, &rdata[1], 8);
5693 if ( sceCdGetMVersion(rdata, status) != 1 || (
unsigned int)(rdata[3] | (rdata[2] << 8) | (rdata[1] << 16)) < 0x10500 )
5695 strcpy(buffer,
"M_NAME_UNKNOWN");
5700 if ( PollEventFlag(g_scmd_evid, 1, WEF_AND | WEF_CLEAR, &efbits) == KE_EVF_COND )
5706 command = set_prev_command(0x17, &wdata,
sizeof(wdata), (
char *)rdata,
sizeof(rdata), 0);
5708 memcpy(buffer, &rdata[1], 8);
5711 cmd_tmp2 = set_prev_command(0x17, &wdata,
sizeof(wdata), (
char *)rdata,
sizeof(rdata), 0);
5712 *status |= rdata[0];
5713 memcpy(&buffer[8], &rdata[1], 8);
5714 vSetEventFlag(g_scmd_evid, 1);
5715 return command ? (!!cmd_tmp2) : 0;
5718static int sceCdGetMVersion(u8 *buffer, u32 *status)
5725 command = set_prev_command(3, wdata,
sizeof(wdata), rdata,
sizeof(rdata), 1);
5726 *status = rdata[0] & 0x80;
5727 VERBOSE_KPRINTF(1,
"MV 0x%02x,0x%02x,0x%02x,0x%02x\n", (u8)rdata[0], (u8)rdata[1], (u8)rdata[2], (u8)rdata[3]);
5729 memcpy(buffer, rdata,
sizeof(rdata));
5733static int cdvdman_scmd_sender_03_48(u8 *buf, u32 *status)
5739 if ( g_cdvdman_minver_50000 )
5745 retval = set_prev_command(3, wdata,
sizeof(wdata), rdata,
sizeof(rdata), 1);
5746 *status = (u8)rdata[0];
5753 g_cdvdman_mmode = media;
5761 memset(wdata, 0,
sizeof(wdata));
5763 return g_cdvdman_minver_20400 ? set_prev_command(27, wdata, 0, (
char *)result, 1, 1) : 1;
5768 s->m_power_flag = 0;
5777 VERBOSE_KPRINTF(1,
"sceCdPowerOff Call\n");
5778 if ( !g_cdvdman_minver_x_model_15 )
5785 vDelayThread(250000);
5788 command = set_prev_command(0xF, 0, 0, (
char *)result, 1, 1);
5791 g_cdvdman_istruct.m_power_flag = 0;
5794 KPRINTF(
"PowerOff Start...\n");
5795 g_cdvdman_istruct.m_power_flag = 1;
5796 g_cdvdman_power_off_timeout.hi = 0;
5797 g_cdvdman_power_off_timeout.lo = 0xAFC8000;
5798 vSetAlarm(&g_cdvdman_power_off_timeout, (
unsigned int (*)(
void *))power_off_alarm_cb, &g_cdvdman_istruct);
5809 VERBOSE_KPRINTF(1,
"Audio Digital Out: Set param %d\n", wdata);
5810 return set_prev_command(20, &wdata,
sizeof(wdata), (
char *)status, 1, 1);
5817 retval = set_prev_command(8, 0, 0, (
char *)clock, 8, 1);
5819 clock->
month &= 0x7F;
5820 if ( retval && !clock->
stat )
5822 memcpy(&g_cdvdman_clock, clock,
sizeof(g_cdvdman_clock));
5823 g_cdvdman_clk_flg = 1;
5825 else if ( g_cdvdman_clk_flg )
5827 memcpy(clock, &g_cdvdman_clock,
sizeof(g_cdvdman_clock));
5843 return set_prev_command(8, 0, 0, (
char *)clock, 8, 1);
5853 *traychk = cdvdman_mediactl(1);
5854 VERBOSE_KPRINTF(1,
"Tray Req test = %d\n", *traychk);
5862 g_cdvdman_iocache = 0;
5863 if ( set_prev_command(6, &wdata,
sizeof(wdata), &rdata,
sizeof(rdata), 1) && !rdata )
5865 vDelayThread(11000);
5871static int cdvdman_scmd_sender_3B(
int arg1)
5876 if ( g_cdvdman_minver_x_model_15 && arg1 == 1 )
5881 g_cdvdman_iocache = 0;
5882 if ( set_prev_command(59, &wdata,
sizeof(wdata), &rdata,
sizeof(rdata), 1) && !rdata )
5884 vDelayThread(11000);
5890#ifdef CDVD_VARIANT_DNAS
5896 USE_DEV5_MMIO_HWPORT();
5898 *((u8 *)
id + 4) = 0;
5899 *((u8 *)
id + 3) = 0;
5900 *((u8 *)
id + 2) = 0;
5901 *((u8 *)
id + 1) = 0;
5915 sceCdRead0(0x4B, 1, sectbuf, &rmode, 0, 0);
5917 if ( !cdvdman_ncmd_sender_0C(0, 0, 0x4B) )
5922 if ( g_cdvdman_istruct.m_last_error )
5926 WaitEventFlag(g_scmd_evid, 1, WEF_AND, &efbits);
5927 if ( !(dev5_mmio_hwport->m_dev5_reg_038 & 4) )
5929 vSetEventFlag(g_scmd_evid, 1);
5932 *(u8 *)
id = dev5_mmio_hwport->m_dev5_reg_030 ^ dev5_mmio_hwport->m_dev5_reg_039;
5933 *((u8 *)
id + 1) = dev5_mmio_hwport->m_dev5_reg_031 ^ dev5_mmio_hwport->m_dev5_reg_039;
5934 *((u8 *)
id + 2) = dev5_mmio_hwport->m_dev5_reg_032 ^ dev5_mmio_hwport->m_dev5_reg_039;
5935 *((u8 *)
id + 3) = dev5_mmio_hwport->m_dev5_reg_033 ^ dev5_mmio_hwport->m_dev5_reg_039;
5936 *((u8 *)
id + 4) = dev5_mmio_hwport->m_dev5_reg_034 ^ dev5_mmio_hwport->m_dev5_reg_039;
5937 vSetEventFlag(g_scmd_evid, 1);
5949 USE_DEV5_MMIO_HWPORT();
5952 if ( !g_cdvdman_istruct.m_cd_inited )
5971 if ( g_cdvdman_istruct.m_stream_flag || g_cdvdman_istruct.m_read2_flag )
5983 dev5_mmio_hwport->m_dev5_reg_007 = 1;
5995 for ( i = 0; i < 20; i += 1 )
5997 sceCdRead0(0x4B + (0x10 * i), 0x10, g_cdvdman_ptoc, &rmode, 0, 0);
6006 sceCdRead0(0x4B, 1, g_cdvdman_ptoc, &rmode, 0, 0);
6010 WaitEventFlag(g_scmd_evid, 1, WEF_AND, &efbits);
6012 if ( g_cdvdman_istruct.m_stream_flag || g_cdvdman_istruct.m_read2_flag )
6016 vSetEventFlag(g_scmd_evid, 1);
6019 strcpy(&ndata[3],
"K");
6025 if ( cdvdman_send_ncmd(12, ndata,
sizeof(ndata), 0, 0, 1) < 0 )
6029 vSetEventFlag(g_scmd_evid, 1);
6034 if ( g_cdvdman_istruct.m_last_error )
6036 *status = (u8)g_cdvdman_istruct.m_last_error;
6037 vSetEventFlag(g_scmd_evid, 1);
6040 dev5_reg_038 = dev5_mmio_hwport->m_dev5_reg_038;
6041 vSetEventFlag(g_scmd_evid, 1);
6042 return (dev5_reg_038 & 5) == 5;
6045static int cdvdman_ncmd_sender_0C(
int arg1, u32 arg2, u32 arg3)
6051 ndata[2] = !!(arg2 >> 8);
6052 *(u32 *)&ndata[3] = !arg1 ? arg3 : 0;
6053 return cdvdman_send_ncmd(12, ndata,
sizeof(ndata), 0, 0, 1) >= 0;
6059#ifdef CDVD_VARIANT_DNAS
6060 USE_DEV5_MMIO_HWPORT();
6062 g_cdvdman_cd36key = enable_shift | shiftval;
6063 dev5_mmio_hwport->m_dev5_reg_03A = (16 * (shiftval & 7)) | ((!!enable_xor) << 1) | (!!enable_shift);
int sceCdRV(u32 lsn, u32 sectors, void *buf, sceCdRMode *mode, int arg5, void *cb)
int sceCdApplySCmd2(u8 cmdNum, const void *inBuff, unsigned long int inBuffSize, void *outBuff)
int sceCdApplySCmd3(u8 cmdNum, const void *inBuff, unsigned long int inBuffSize, void *outBuff)
int sceCdSpinCtrlIOP(u32 speed)
int sceCdReadDiskID(unsigned int *id)
int CpuResumeIntr(int state)
int RegisterIntrHandler(int irq, int mode, int(*handler)(void *), void *arg)
int ReleaseIntrHandler(int irq)
int QueryIntrContext(void)
int DisableIntr(int irq, int *res)
int CpuSuspendIntr(int *state)
int sceCdReadModelID(unsigned int *id)
int sceCdStSeekF(unsigned int lsn)
void * sceCdPOffCallback(void(*func)(void *), void *addr)
int sceCdSearchFile(sceCdlFILE *file, const char *name)
int sceCdCancelPOffRdy(u32 *result)
int sceCdPowerOff(u32 *result)
int sceCdDoesUniqueKeyExist(u32 *status)
int sceCdStRead(u32 sectors, u32 *buffer, u32 mode, u32 *error)
sceCdCBFunc sceCdCallback(sceCdCBFunc function)
int sceCdReadDvdDualInfo(int *on_dual, unsigned int *layer1_start)
int sceCdStInit(u32 bufmax, u32 bankmax, void *buffer)
int sceCdReadGUID(u64 *guid)
int sceCdDiskReady(int mode)
int sceCdRM(char *buffer, u32 *status)
u32 sceCdPosToInt(sceCdlLOCCD *p)
int sceCdLayerSearchFile(sceCdlFILE *fp, const char *path, int layer)
int sceCdReadClock(sceCdCLOCK *clock)
u32 sceCdGetReadPos(void)
int sceCdGetDiskType(void)
sceCdlLOCCD * sceCdIntToPos(u32 i, sceCdlLOCCD *p)
int sceCdMmode(int media)
int sceCdApplySCmd(u8 cmdNum, const void *inBuff, u16 inBuffSize, void *outBuff)
int sceCdSetTimeout(int param, int timeout)
int sceCdStStart(u32 lbn, sceCdRMode *mode)
void(* sceCdCBFunc)(int reason)
int sceCdDecSet(unsigned char enable_xor, unsigned char enable_shift, unsigned char shiftval)
int sceCdRI(u8 *buffer, u32 *result)
int sceCdRead(u32 lbn, u32 sectors, void *buffer, sceCdRMode *mode)
int sceCdApplyNCmd(u8 cmdNum, const void *inBuff, u16 inBuffSize)
int sceCdRE(unsigned int lsn, unsigned int sectors, void *buf, sceCdRMode *mode)
int sceCdReadChain(sceCdRChain *tag, sceCdRMode *mode)
int sceCdTrayReq(int param, u32 *traychk)
int sceCdCtrlADout(int mode, u32 *status)