Initial commit for new fixes on the CD-ROM site (nw)

This commit is contained in:
TC1995 2024-11-22 00:30:07 +01:00
parent 5f0bed89e3
commit d6d56c86c1
2 changed files with 141 additions and 97 deletions

View file

@ -84,7 +84,7 @@ enum
CDROM_TYPE_SONY_CDU311_30h, CDROM_TYPE_SONY_CDU311_30h,
CDROM_TYPE_TOSHIBA_5302TA_0305, CDROM_TYPE_TOSHIBA_5302TA_0305,
CDROM_TYPE_TOSHIBA_5702B_TA70, CDROM_TYPE_TOSHIBA_5702B_TA70,
CDROM_TYPE_CHINON_CDS431_H42, CDROM_TYPE_CHINON_CDX435_M62,
CDROM_TYPE_DEC_RRD45_0436, CDROM_TYPE_DEC_RRD45_0436,
CDROM_TYPE_MATSHITA_501_10b, CDROM_TYPE_MATSHITA_501_10b,
CDROM_TYPE_NEC_25_10a, CDROM_TYPE_NEC_25_10a,
@ -93,6 +93,7 @@ enum
CDROM_TYPE_NEC_77_106, CDROM_TYPE_NEC_77_106,
CDROM_TYPE_NEC_211_100, CDROM_TYPE_NEC_211_100,
CDROM_TYPE_NEC_464_105, CDROM_TYPE_NEC_464_105,
CDROM_TYPE_ShinaKen_DM3x1S_104,
CDROM_TYPE_SONY_CDU541_10i, CDROM_TYPE_SONY_CDU541_10i,
CDROM_TYPE_SONY_CDU561_18k, CDROM_TYPE_SONY_CDU561_18k,
CDROM_TYPE_SONY_CDU76S_100, CDROM_TYPE_SONY_CDU76S_100,
@ -101,7 +102,8 @@ enum
CDROM_TYPE_PLEXTOR_PX32TS_103, CDROM_TYPE_PLEXTOR_PX32TS_103,
CDROM_TYPE_TEAC_CD50_100, CDROM_TYPE_TEAC_CD50_100,
CDROM_TYPE_TEAC_R55S_10R, CDROM_TYPE_TEAC_R55S_10R,
CDROM_TYPE_TEXEL_DMXX24_100, CDROM_TYPE_TEXEL_DM3024_100,
CDROM_TYPE_TEXEL_DM3028_106,
CDROM_TYPE_TOSHIBA_XM_3433, CDROM_TYPE_TOSHIBA_XM_3433,
CDROM_TYPE_TOSHIBA_XM3201B_3232, CDROM_TYPE_TOSHIBA_XM3201B_3232,
CDROM_TYPE_TOSHIBA_XM3301TA_0272, CDROM_TYPE_TOSHIBA_XM3301TA_0272,
@ -146,29 +148,31 @@ static const struct
{ "SONY", "CD-ROM CDU311", "3.0h", "SONY CD-ROM CDU311 3.0h", "SONY_CD-ROM_CDU311_3.0h", BUS_TYPE_IDE }, { "SONY", "CD-ROM CDU311", "3.0h", "SONY CD-ROM CDU311 3.0h", "SONY_CD-ROM_CDU311_3.0h", BUS_TYPE_IDE },
{ "TOSHIBA", "CD-ROM XM-5302TA", "0305", "TOSHIBA CD-ROM XM-5302TA 0305", "TOSHIBA_CD-ROM_XM-5302TA_0305", BUS_TYPE_IDE }, { "TOSHIBA", "CD-ROM XM-5302TA", "0305", "TOSHIBA CD-ROM XM-5302TA 0305", "TOSHIBA_CD-ROM_XM-5302TA_0305", BUS_TYPE_IDE },
{ "TOSHIBA", "CD-ROM XM-5702B", "TA70", "TOSHIBA CD-ROM XM-5702B TA70", "TOSHIBA_CD-ROM_XM-5702B_TA70", BUS_TYPE_IDE }, { "TOSHIBA", "CD-ROM XM-5702B", "TA70", "TOSHIBA CD-ROM XM-5702B TA70", "TOSHIBA_CD-ROM_XM-5702B_TA70", BUS_TYPE_IDE },
{ "CHINON", "CD-ROM CDS-431", "H42 ", "CHINON CD-ROM CDS-431 H42", "CHINON_CD-ROM_CDS-431_H42", BUS_TYPE_SCSI }, { "CHINON", "CD-ROM CDX-435", "M62 ", "[SCSI-1] CHINON CD-ROM CDX-435 M62", "CHINON_CD-ROM_CDX-435_M62", BUS_TYPE_SCSI },
{ "DEC", "RRD45 (C) DEC", "0436", "DEC RRD45 0436", "DEC_RRD45_0436", BUS_TYPE_SCSI }, { "DEC", "RRD45 (C) DEC", "0436", "[SCSI-1] DEC RRD45 0436", "DEC_RRD45_0436", BUS_TYPE_SCSI },
{ "MATSHITA", "CD-ROM CR-501", "1.0b", "MATSHITA CD-ROM CR-501 1.0b", "MATSHITA_CD-ROM_CR-501_1.0b", BUS_TYPE_SCSI }, { "MATSHITA", "CD-ROM CR-501", "1.0b", "[SCSI-1] MATSHITA CD-ROM CR-501 1.0b", "MATSHITA_CD-ROM_CR-501_1.0b", BUS_TYPE_SCSI },
{ "NEC", "CD-ROM DRIVE:25", "1.0a", "NEC CD-ROM DRIVE:25 1.0a", "NEC_CD-ROM_DRIVE25_1.0a", BUS_TYPE_SCSI }, { "NEC", "CD-ROM DRIVE:25", "1.0a", "[SCSI-1] NEC CD-ROM DRIVE:25 1.0a", "NEC_CD-ROM_DRIVE25_1.0a", BUS_TYPE_SCSI },
{ "NEC", "CD-ROM DRIVE:38", "1.00", "NEC CD-ROM DRIVE:38 1.00", "NEC_CD-ROM_DRIVE38_1.00", BUS_TYPE_SCSI }, { "NEC", "CD-ROM DRIVE:38", "1.00", "[SCSI-2] NEC CD-ROM DRIVE:38 1.00", "NEC_CD-ROM_DRIVE38_1.00", BUS_TYPE_SCSI },
{ "NEC", "CD-ROM DRIVE:75", "1.03", "NEC CD-ROM DRIVE:75 1.03", "NEC_CD-ROM_DRIVE75_1.03", BUS_TYPE_SCSI }, { "NEC", "CD-ROM DRIVE:75", "1.03", "[SCSI-1] NEC CD-ROM DRIVE:75 1.03", "NEC_CD-ROM_DRIVE75_1.03", BUS_TYPE_SCSI },
{ "NEC", "CD-ROM DRIVE:77", "1.06", "NEC CD-ROM DRIVE:77 1.06", "NEC_CD-ROM_DRIVE77_1.06", BUS_TYPE_SCSI }, { "NEC", "CD-ROM DRIVE:77", "1.06", "[SCSI-1] NEC CD-ROM DRIVE:77 1.06", "NEC_CD-ROM_DRIVE77_1.06", BUS_TYPE_SCSI },
{ "NEC", "CD-ROM DRIVE:211", "1.00", "NEC CD-ROM DRIVE:211 1.00", "NEC_CD-ROM_DRIVE211_1.00", BUS_TYPE_SCSI }, { "NEC", "CD-ROM DRIVE:211", "1.00", "[SCSI-2] NEC CD-ROM DRIVE:211 1.00", "NEC_CD-ROM_DRIVE211_1.00", BUS_TYPE_SCSI },
{ "NEC", "CD-ROM DRIVE:464", "1.05", "NEC CD-ROM DRIVE:464 1.05", "NEC_CD-ROM_DRIVE464_1.05", BUS_TYPE_SCSI }, { "NEC", "CD-ROM DRIVE:464", "1.05", "[SCSI-2] NEC CD-ROM DRIVE:464 1.05", "NEC_CD-ROM_DRIVE464_1.05", BUS_TYPE_SCSI },
{ "SONY", "CD-ROM CDU-541", "1.0i", "SONY CD-ROM CDU-541 1.0i", "SONY_CD-ROM_CDU-541_1.0i", BUS_TYPE_SCSI }, { "ShinaKen", "CD-ROM DM-3x1S", "1.04", "[SCSI-1] ShinaKen CD-ROM DM-3x1S 1.04", "ShinaKen_CD-ROM_DM-3x1S_1.04", BUS_TYPE_SCSI },
{ "SONY", "CD-ROM CDU-561", "1.8k", "SONY CD-ROM CDU-561 1.8k", "SONY_CD-ROM_CDU-561_1.8k", BUS_TYPE_SCSI }, { "SONY", "CD-ROM CDU-541", "1.0i", "[SCSI-1] SONY CD-ROM CDU-541 1.0i", "SONY_CD-ROM_CDU-541_1.0i", BUS_TYPE_SCSI },
{ "SONY", "CD-ROM CDU-76S", "1.00", "SONY CD-ROM CDU-76S 1.00", "SONY_CD-ROM_CDU-76S_1.00", BUS_TYPE_SCSI }, { "SONY", "CD-ROM CDU-561", "1.8k", "[SCSI-2] SONY CD-ROM CDU-561 1.8k", "SONY_CD-ROM_CDU-561_1.8k", BUS_TYPE_SCSI },
{ "PHILIPS", "CDD2600", "1.07", "PHILIPS CDD2600 1.07", "PHILIPS_CDD2600_1.07", BUS_TYPE_SCSI }, { "SONY", "CD-ROM CDU-76S", "1.00", "[SCSI-2] SONY CD-ROM CDU-76S 1.00", "SONY_CD-ROM_CDU-76S_1.00", BUS_TYPE_SCSI },
{ "PIONEER", "CD-ROM DRM-604X", "2403", "PIONEER CD-ROM DRM-604X 2403", "PIONEER_CD-ROM_DRM-604X_2403", BUS_TYPE_SCSI }, { "PHILIPS", "CDD2600", "1.07", "[SCSI-2] PHILIPS CDD2600 1.07", "PHILIPS_CDD2600_1.07", BUS_TYPE_SCSI },
{ "PLEXTOR", "CD-ROM PX-32TS", "1.03", "PLEXTOR CD-ROM PX-32TS 1.03", "PLEXTOR_CD-ROM_PX-32TS_1.03", BUS_TYPE_SCSI }, { "PIONEER", "CD-ROM DRM-604X", "2403", "[SCSI-2] PIONEER CD-ROM DRM-604X 2403", "PIONEER_CD-ROM_DRM-604X_2403", BUS_TYPE_SCSI },
{ "TEAC", "CD 50", "1.00", "TEAC CD 50 1.00", "TEAC_CD_50_1.00", BUS_TYPE_SCSI }, { "PLEXTOR", "CD-ROM PX-32TS", "1.03", "[SCSI-2] PLEXTOR CD-ROM PX-32TS 1.03", "PLEXTOR_CD-ROM_PX-32TS_1.03", BUS_TYPE_SCSI },
{ "TEAC", "CD-ROM R55S", "1.0R", "TEAC CD-ROM R55S 1.0R", "TEAC_CD-ROM_R55S_1.0R", BUS_TYPE_SCSI }, { "TEAC", "CD 50", "1.00", "[SCSI-2] TEAC CD 50 1.00", "TEAC_CD_50_1.00", BUS_TYPE_SCSI },
{ "TEXEL", "CD-ROM DM-XX24", "1.00", "TEXEL CD-ROM DM-XX24 1.00", "TEXEL_CD-ROM_DM-XX24_1.00", BUS_TYPE_SCSI }, { "TEAC", "CD-ROM R55S", "1.0R", "[SCSI-2] TEAC CD-ROM R55S 1.0R", "TEAC_CD-ROM_R55S_1.0R", BUS_TYPE_SCSI },
{ "TOSHIBA", "CD-ROM DRIVE:XM", "3433", "TOSHIBA CD-ROM DRIVE:XM 3433", "TOSHIBA_CD-ROM_DRIVEXM_3433", BUS_TYPE_SCSI }, { "TEXEL", "CD-ROM DM-3024", "1.00", "[SCSI-1] TEXEL CD-ROM DM-3024 1.00", "TEXEL_CD-ROM_DM-3024_1.00", BUS_TYPE_SCSI },
{ "TOSHIBA", "CD-ROM XM-3201B", "3232", "TOSHIBA CD-ROM XM-3201B 3232", "TOSHIBA_CD-ROM_XM-3201B_3232", BUS_TYPE_SCSI }, { "TEXEL", "CD-ROM DM-3028", "1.06", "[SCSI-2] TEXEL CD-ROM DM-3028 1.06", "TEXEL_CD-ROM_DM-3028_1.06", BUS_TYPE_SCSI },
{ "TOSHIBA", "CD-ROM XM-3301TA", "0272", "TOSHIBA CD-ROM XM-3301TA 0272", "TOSHIBA_CD-ROM_XM-3301TA_0272", BUS_TYPE_SCSI }, { "TOSHIBA", "CD-ROM DRIVE:XM", "3433", "[SCSI-2] TOSHIBA CD-ROM DRIVE:XM 3433", "TOSHIBA_CD-ROM_DRIVEXM_3433", BUS_TYPE_SCSI },
{ "TOSHIBA", "CD-ROM XM-5701TA", "3136", "TOSHIBA CD-ROM XM-5701TA 3136", "TOSHIBA_CD-ROM_XM-5701TA_3136", BUS_TYPE_SCSI }, { "TOSHIBA", "CD-ROM XM-3201B", "3232", "[SCSI-1] TOSHIBA CD-ROM XM-3201B 3232", "TOSHIBA_CD-ROM_XM-3201B_3232", BUS_TYPE_SCSI },
{ "TOSHIBA", "DVD-ROM SD-M1401", "1008", "TOSHIBA DVD-ROM SD-M1401 1008", "TOSHIBA_DVD-ROM_SD-M1401_1008", BUS_TYPE_SCSI }, { "TOSHIBA", "CD-ROM XM-3301TA", "0272", "[SCSI-2] TOSHIBA CD-ROM XM-3301TA 0272", "TOSHIBA_CD-ROM_XM-3301TA_0272", BUS_TYPE_SCSI },
{ "TOSHIBA", "CD-ROM XM-5701TA", "3136", "[SCSI-2] TOSHIBA CD-ROM XM-5701TA 3136", "TOSHIBA_CD-ROM_XM-5701TA_3136", BUS_TYPE_SCSI },
{ "TOSHIBA", "DVD-ROM SD-M1401", "1008", "[SCSI-2] TOSHIBA DVD-ROM SD-M1401 1008", "TOSHIBA_DVD-ROM_SD-M1401_1008", BUS_TYPE_SCSI },
{ "", "", "", "", "", BUS_TYPE_NONE }, { "", "", "", "", "", BUS_TYPE_NONE },
}; };

View file

@ -87,7 +87,7 @@ uint8_t scsi_cdrom_command_flags[0x100] = {
IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0x22*/ IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0x22*/
0, 0, /* 0x23-0x24 */ 0, 0, /* 0x23-0x24 */
IMPLEMENTED | CHECK_READY, /* 0x25 */ IMPLEMENTED | CHECK_READY, /* 0x25 */
IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0x26 */ 0, /* 0x26 */
0, /* 0x27 */ 0, /* 0x27 */
IMPLEMENTED | CHECK_READY, /* 0x28 */ IMPLEMENTED | CHECK_READY, /* 0x28 */
0, 0, /* 0x29-0x2A */ 0, 0, /* 0x29-0x2A */
@ -564,10 +564,12 @@ scsi_cdrom_get_channel(void *priv, int channel)
switch (dev->drv->type) { switch (dev->drv->type) {
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k: case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_TEXEL_DMXX24_100: case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEXEL_DM3028_106:
ret = dev->ms_pages_saved_sony.pages[dev->sony_vendor ? GPMODE_CDROM_AUDIO_PAGE_SONY : GPMODE_CDROM_AUDIO_PAGE][channel ? 10 : 8]; ret = dev->ms_pages_saved_sony.pages[dev->sony_vendor ? GPMODE_CDROM_AUDIO_PAGE_SONY : GPMODE_CDROM_AUDIO_PAGE][channel ? 10 : 8];
break; break;
default: default:
@ -589,10 +591,12 @@ scsi_cdrom_get_volume(void *priv, int channel)
switch (dev->drv->type) { switch (dev->drv->type) {
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k: case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_TEXEL_DMXX24_100: case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEXEL_DM3028_106:
ret = dev->ms_pages_saved_sony.pages[dev->sony_vendor ? GPMODE_CDROM_AUDIO_PAGE_SONY : ret = dev->ms_pages_saved_sony.pages[dev->sony_vendor ? GPMODE_CDROM_AUDIO_PAGE_SONY :
GPMODE_CDROM_AUDIO_PAGE][channel ? 11 : 9]; GPMODE_CDROM_AUDIO_PAGE][channel ? 11 : 9];
break; break;
@ -612,10 +616,12 @@ scsi_cdrom_mode_sense_load(scsi_cdrom_t *dev)
switch (dev->drv->type) { switch (dev->drv->type) {
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k: case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_TEXEL_DMXX24_100: case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEXEL_DM3028_106:
memset(&dev->ms_pages_saved_sony, 0, sizeof(mode_sense_pages_t)); memset(&dev->ms_pages_saved_sony, 0, sizeof(mode_sense_pages_t));
memcpy(&dev->ms_pages_saved_sony, &scsi_cdrom_mode_sense_pages_default_sony_scsi, memcpy(&dev->ms_pages_saved_sony, &scsi_cdrom_mode_sense_pages_default_sony_scsi,
sizeof(mode_sense_pages_t)); sizeof(mode_sense_pages_t));
@ -664,10 +670,12 @@ scsi_cdrom_mode_sense_save(scsi_cdrom_t *dev)
switch (dev->drv->type) { switch (dev->drv->type) {
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k: case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_TEXEL_DMXX24_100: case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEXEL_DM3028_106:
sprintf(file_name, "scsi_cdrom_%02i_mode_sense_sony_bin", dev->id); sprintf(file_name, "scsi_cdrom_%02i_mode_sense_sony_bin", dev->id);
fp = plat_fopen(nvr_path(file_name), "wb"); fp = plat_fopen(nvr_path(file_name), "wb");
if (fp) { if (fp) {
@ -747,10 +755,12 @@ scsi_cdrom_mode_sense_read(scsi_cdrom_t *dev, uint8_t page_control, uint8_t page
{ {
switch (dev->drv->type) { switch (dev->drv->type) {
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k: case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_TEXEL_DMXX24_100: case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEXEL_DM3028_106:
switch (page_control) { switch (page_control) {
case 0: case 0:
case 3: case 3:
@ -1008,10 +1018,12 @@ scsi_cdrom_command_common(scsi_cdrom_t *dev)
case 0xc0: case 0xc0:
switch (dev->drv->type) { switch (dev->drv->type) {
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k: case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_TEXEL_DMXX24_100: case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEXEL_DM3028_106:
/* 44100 * 16 bits * 2 channels = 176400 bytes per second */ /* 44100 * 16 bits * 2 channels = 176400 bytes per second */
bytes_per_second = 176400.0; bytes_per_second = 176400.0;
bytes_per_second *= (double) dev->drv->cur_speed; bytes_per_second *= (double) dev->drv->cur_speed;
@ -1020,11 +1032,13 @@ scsi_cdrom_command_common(scsi_cdrom_t *dev)
case 0xc1: case 0xc1:
switch (dev->drv->type) { switch (dev->drv->type) {
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k: case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_PIONEER_DRM604X_2403: case CDROM_TYPE_PIONEER_DRM604X_2403:
case CDROM_TYPE_TEXEL_DMXX24_100: case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEXEL_DM3028_106:
/* 44100 * 16 bits * 2 channels = 176400 bytes per second */ /* 44100 * 16 bits * 2 channels = 176400 bytes per second */
bytes_per_second = 176400.0; bytes_per_second = 176400.0;
bytes_per_second *= (double) dev->drv->cur_speed; bytes_per_second *= (double) dev->drv->cur_speed;
@ -1033,11 +1047,13 @@ scsi_cdrom_command_common(scsi_cdrom_t *dev)
case 0xc2 ... 0xc3: case 0xc2 ... 0xc3:
switch (dev->drv->type) { switch (dev->drv->type) {
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k: case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_PIONEER_DRM604X_2403: case CDROM_TYPE_PIONEER_DRM604X_2403:
case CDROM_TYPE_TEXEL_DMXX24_100: case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEXEL_DM3028_106:
if (dev->current_cdb[0] == 0xc2) if (dev->current_cdb[0] == 0xc2)
dev->callback += 40.0; dev->callback += 40.0;
/* 44100 * 16 bits * 2 channels = 176400 bytes per second */ /* 44100 * 16 bits * 2 channels = 176400 bytes per second */
@ -1583,10 +1599,12 @@ scsi_command_check_ready(scsi_cdrom_t *dev, uint8_t *cdb)
ret = 1; ret = 1;
break; break;
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k: case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_TEXEL_DMXX24_100: case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEXEL_DM3028_106:
if (cdb[0] == 0xC0) if (cdb[0] == 0xC0)
break; break;
ret = 1; ret = 1;
@ -1855,16 +1873,13 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb)
memcpy(dev->current_cdb, cdb, 12); memcpy(dev->current_cdb, cdb, 12);
dev->sony_vendor = 0; dev->sony_vendor = 0;
// if (cdb[0] != 0) { if (cdb[0] != 0) {
scsi_cdrom_log("CD-ROM %i: Command 0x%02X, Sense Key %02X, Asc %02X, Ascq %02X, Unit attention: %i\n", pclog("CD-ROM %i: CDB: %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X, Sense Key %02X, Asc %02X, Ascq %02X, Unit attention: %i\n",
dev->id, cdb[0], scsi_cdrom_sense_key, scsi_cdrom_asc, scsi_cdrom_ascq, dev->id, cdb[0], cdb[1], cdb[2], cdb[3], cdb[4], cdb[5], cdb[6], cdb[7],
cdb[8], cdb[9], cdb[10], cdb[11], scsi_cdrom_sense_key, scsi_cdrom_asc, scsi_cdrom_ascq,
dev->unit_attention); dev->unit_attention);
scsi_cdrom_log("CD-ROM %i: Request length: %04X\n", dev->id, dev->tf->request_length); scsi_cdrom_log("CD-ROM %i: Request length: %04X\n", dev->id, dev->tf->request_length);
}
scsi_cdrom_log("CD-ROM %i: CDB: %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
dev->id, cdb[0], cdb[1], cdb[2], cdb[3], cdb[4], cdb[5], cdb[6], cdb[7],
cdb[8], cdb[9], cdb[10], cdb[11]);
// }
msf = cdb[1] & 2; msf = cdb[1] & 2;
dev->sector_len = 0; dev->sector_len = 0;
@ -2018,10 +2033,12 @@ begin:
goto begin; goto begin;
break; break;
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k: case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_TEXEL_DMXX24_100: /*GPCMD_PLAY_MSF_SONY*/ case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEXEL_DM3028_106: /*GPCMD_PLAY_MSF_SONY*/
cdb[0] = GPCMD_PLAY_AUDIO_MSF; cdb[0] = GPCMD_PLAY_AUDIO_MSF;
dev->current_cdb[0] = cdb[0]; dev->current_cdb[0] = cdb[0];
dev->sony_vendor = 1; dev->sony_vendor = 1;
@ -2109,19 +2126,21 @@ begin:
if (dev->sector_len == 0) if (dev->sector_len == 0)
dev->sector_len = 256; /* For READ (6) and WRITE (6), a length of 0 indicates a transfer of 256 sector. */ dev->sector_len = 256; /* For READ (6) and WRITE (6), a length of 0 indicates a transfer of 256 sector. */
dev->sector_pos = ((((uint32_t) cdb[1]) & 0x1f) << 16) | (((uint32_t) cdb[2]) << 8) | ((uint32_t) cdb[3]); dev->sector_pos = ((((uint32_t) cdb[1]) & 0x1f) << 16) | (((uint32_t) cdb[2]) << 8) | ((uint32_t) cdb[3]);
scsi_cdrom_log("Read 6: CD-ROM %i: Length: %i, LBA: %i\n", dev->id, dev->sector_len,
dev->sector_pos);
msf = 0; msf = 0;
break; break;
case GPCMD_READ_10: case GPCMD_READ_10:
dev->sector_len = (cdb[7] << 8) | cdb[8]; dev->sector_len = (cdb[7] << 8) | cdb[8];
dev->sector_pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; dev->sector_pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5];
scsi_cdrom_log("CD-ROM %i: Length: %i, LBA: %i\n", dev->id, dev->sector_len, scsi_cdrom_log("Read 10: CD-ROM %i: Length: %i, LBA: %i\n", dev->id, dev->sector_len,
dev->sector_pos); dev->sector_pos);
msf = 0; msf = 0;
break; break;
case GPCMD_READ_12: case GPCMD_READ_12:
dev->sector_len = (((uint32_t) cdb[6]) << 24) | (((uint32_t) cdb[7]) << 16) | (((uint32_t) cdb[8]) << 8) | ((uint32_t) cdb[9]); dev->sector_len = (((uint32_t) cdb[6]) << 24) | (((uint32_t) cdb[7]) << 16) | (((uint32_t) cdb[8]) << 8) | ((uint32_t) cdb[9]);
dev->sector_pos = (((uint32_t) cdb[2]) << 24) | (((uint32_t) cdb[3]) << 16) | (((uint32_t) cdb[4]) << 8) | ((uint32_t) cdb[5]); dev->sector_pos = (((uint32_t) cdb[2]) << 24) | (((uint32_t) cdb[3]) << 16) | (((uint32_t) cdb[4]) << 8) | ((uint32_t) cdb[5]);
scsi_cdrom_log("CD-ROM %i: Length: %i, LBA: %i\n", dev->id, dev->sector_len, scsi_cdrom_log("Read 12: CD-ROM %i: Length: %i, LBA: %i\n", dev->id, dev->sector_len,
dev->sector_pos); dev->sector_pos);
msf = 0; msf = 0;
break; break;
@ -2286,10 +2305,12 @@ begin:
switch (dev->drv->type) { switch (dev->drv->type) {
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k: case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_TEXEL_DMXX24_100: case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEXEL_DM3028_106:
if (!(scsi_cdrom_mode_sense_page_flags_sony & (1LL << (uint64_t) (cdb[2] & 0x3f)))) { if (!(scsi_cdrom_mode_sense_page_flags_sony & (1LL << (uint64_t) (cdb[2] & 0x3f)))) {
scsi_cdrom_invalid_field(dev); scsi_cdrom_invalid_field(dev);
scsi_cdrom_buf_free(dev); scsi_cdrom_buf_free(dev);
@ -2341,7 +2362,7 @@ begin:
} }
} }
scsi_cdrom_set_buf_len(dev, BufLen, &len); scsi_cdrom_set_buf_len(dev, BufLen, &alloc_length);
scsi_cdrom_log("CD-ROM %i: Reading mode page: %02X...\n", dev->id, cdb[2]); scsi_cdrom_log("CD-ROM %i: Reading mode page: %02X...\n", dev->id, cdb[2]);
@ -2668,17 +2689,19 @@ begin:
case 0xC0: case 0xC0:
switch (dev->drv->type) { switch (dev->drv->type) {
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k: case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_TEXEL_DMXX24_100: /*GPCMD_SET_ADDRESS_FORMAT_SONY*/ case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEXEL_DM3028_106: /*GPCMD_SET_ADDRESS_FORMAT_SONY*/
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
dev->sony_vendor = 1; dev->sony_vendor = 1;
dev->drv->sony_msf = cdb[8] & 1; dev->drv->sony_msf = cdb[8] & 1;
scsi_cdrom_command_complete(dev); scsi_cdrom_command_complete(dev);
break; break;
case CDROM_TYPE_PIONEER_DRM604X_2403: /*GPCMD_MAGAZINE_EJECT_PIONEER*/ case CDROM_TYPE_PIONEER_DRM604X_2403: /*GPCMD_MAGAZINE_EJECT_PIONEER*/
case CDROM_TYPE_CHINON_CDS431_H42: /*GPCMD_EJECT_CHINON*/ case CDROM_TYPE_CHINON_CDX435_M62: /*GPCMD_EJECT_CHINON*/
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
scsi_cdrom_stop(sc); scsi_cdrom_stop(sc);
cdrom_eject(dev->id); cdrom_eject(dev->id);
@ -2740,12 +2763,14 @@ begin:
case 0xC1: case 0xC1:
switch (dev->drv->type) { switch (dev->drv->type) {
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k: case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_TEXEL_DMXX24_100: /*GPCMD_READ_TOC_SONY*/ case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEXEL_DM3028_106: /*GPCMD_READ_TOC_SONY*/
scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN); scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN);
msf = dev->ms_pages_saved_sony.pages[GPMODE_CDROM_PAGE_SONY][2] & 0x01; msf = dev->drv->sony_msf;
dev->sony_vendor = 1; dev->sony_vendor = 1;
max_len = cdb[7]; max_len = cdb[7];
@ -2759,7 +2784,7 @@ begin:
return; return;
} }
len = cdrom_read_toc_sony(dev->drv, dev->buffer, cdb[5], msf || dev->drv->sony_msf, max_len); len = cdrom_read_toc_sony(dev->drv, dev->buffer, cdb[5], msf, max_len);
if (len == -1) { if (len == -1) {
/* If the returned length is -1, this means cdrom_read_toc_sony() has encountered an error. */ /* If the returned length is -1, this means cdrom_read_toc_sony() has encountered an error. */
scsi_cdrom_invalid_field(dev); scsi_cdrom_invalid_field(dev);
@ -2973,13 +2998,13 @@ begin:
dev->buffer[1] = 0x11; dev->buffer[1] = 0x11;
break; break;
case CD_STATUS_PAUSED: case CD_STATUS_PAUSED:
dev->buffer[1] = (dev->drv->type == CDROM_TYPE_CHINON_CDS431_H42) ? 0x15 : 0x12; dev->buffer[1] = (dev->drv->type == CDROM_TYPE_CHINON_CDX435_M62) ? 0x15 : 0x12;
break; break;
case CD_STATUS_DATA_ONLY: case CD_STATUS_DATA_ONLY:
dev->buffer[1] = (dev->drv->type == CDROM_TYPE_CHINON_CDS431_H42) ? 0x00 : 0x15; dev->buffer[1] = (dev->drv->type == CDROM_TYPE_CHINON_CDX435_M62) ? 0x00 : 0x15;
break; break;
default: default:
dev->buffer[1] = (dev->drv->type == CDROM_TYPE_CHINON_CDS431_H42) ? 0x00 : 0x13; dev->buffer[1] = (dev->drv->type == CDROM_TYPE_CHINON_CDX435_M62) ? 0x00 : 0x13;
break; break;
} }
@ -2995,10 +3020,12 @@ begin:
case 0xC6: case 0xC6:
switch (dev->drv->type) { switch (dev->drv->type) {
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k: case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_TEXEL_DMXX24_100: /*GPCMD_PLAY_TRACK_SONY*/ case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEXEL_DM3028_106: /*GPCMD_PLAY_TRACK_SONY*/
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
dev->sony_vendor = 1; dev->sony_vendor = 1;
@ -3022,7 +3049,7 @@ begin:
else else
scsi_cdrom_illegal_mode(dev); scsi_cdrom_illegal_mode(dev);
break; break;
case CDROM_TYPE_CHINON_CDS431_H42: /*GPCMD_STOP_CHINON*/ case CDROM_TYPE_CHINON_CDX435_M62: /*GPCMD_STOP_CHINON*/
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
scsi_cdrom_stop(sc); scsi_cdrom_stop(sc);
scsi_cdrom_command_complete(dev); scsi_cdrom_command_complete(dev);
@ -3147,16 +3174,6 @@ begin:
} }
break; break;
case 0x26:
if (dev->drv->type == CDROM_TYPE_CHINON_CDS431_H42) { /*GPCMD_UNKNOWN_CHINON*/
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
scsi_cdrom_stop(sc);
scsi_cdrom_command_complete(dev);
} else {
scsi_cdrom_illegal_opcode(dev);
}
break;
case GPCMD_START_STOP_UNIT: case GPCMD_START_STOP_UNIT:
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
@ -3191,17 +3208,19 @@ begin:
goto begin; goto begin;
break; break;
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k: case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_TEXEL_DMXX24_100: /*GPCMD_PLAYBACK_STATUS_SONY*/ case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEXEL_DM3028_106: /*GPCMD_PLAYBACK_STATUS_SONY*/
scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN); scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN);
dev->sony_vendor = 1; dev->sony_vendor = 1;
max_len = cdb[7]; max_len = cdb[7];
max_len <<= 8; max_len <<= 8;
max_len |= cdb[8]; max_len |= cdb[8];
msf = dev->ms_pages_saved_sony.pages[GPMODE_CDROM_PAGE_SONY][2] & 0x01; msf = dev->drv->sony_msf;
scsi_cdrom_buf_alloc(dev, 18); scsi_cdrom_buf_alloc(dev, 18);
@ -3212,7 +3231,7 @@ begin:
dev->buffer[1] = 0x00; /*Reserved*/ dev->buffer[1] = 0x00; /*Reserved*/
dev->buffer[2] = 0x00; /*Audio Status data length*/ dev->buffer[2] = 0x00; /*Audio Status data length*/
dev->buffer[3] = 0x00; /*Audio Status data length*/ dev->buffer[3] = 0x00; /*Audio Status data length*/
dev->buffer[4] = cdrom_get_audio_status_sony(dev->drv, &dev->buffer[6], msf || dev->drv->sony_msf); /*Audio status*/ dev->buffer[4] = cdrom_get_audio_status_sony(dev->drv, &dev->buffer[6], msf); /*Audio status*/
dev->buffer[5] = 0x00; dev->buffer[5] = 0x00;
scsi_cdrom_log("Audio Status = %02x\n", dev->buffer[4]); scsi_cdrom_log("Audio Status = %02x\n", dev->buffer[4]);
@ -3339,23 +3358,22 @@ begin:
if (dev->drv->bus_type == CDROM_BUS_SCSI) { if (dev->drv->bus_type == CDROM_BUS_SCSI) {
dev->buffer[3] = 0x02; dev->buffer[3] = 0x02;
switch (dev->drv->type) { switch (dev->drv->type) {
case CDROM_TYPE_CHINON_CDS431_H42: case CDROM_TYPE_CHINON_CDX435_M62:
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_MATSHITA_501_10b: case CDROM_TYPE_MATSHITA_501_10b:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEAC_CD50_100:
case CDROM_TYPE_TEAC_R55S_10R:
case CDROM_TYPE_TEXEL_DMXX24_100:
dev->buffer[2] = 0x00; dev->buffer[2] = 0x00;
dev->buffer[3] = 0x01; /*SCSI-1 compliant*/ dev->buffer[3] = 0x01; /*SCSI-1 compliant*/
break; break;
case CDROM_TYPE_TEXEL_DM3028_106:
dev->buffer[2] = 0x02;
dev->buffer[3] = 0x01; /*SCSI-2 compliant*/
break;
case CDROM_TYPE_NEC_25_10a: case CDROM_TYPE_NEC_25_10a:
case CDROM_TYPE_NEC_38_103:
case CDROM_TYPE_NEC_75_103: case CDROM_TYPE_NEC_75_103:
case CDROM_TYPE_NEC_77_106: case CDROM_TYPE_NEC_77_106:
case CDROM_TYPE_NEC_211_100:
case CDROM_TYPE_NEC_464_105:
dev->buffer[3] = 0x00; /*SCSI unknown version per NEC manuals*/ dev->buffer[3] = 0x00; /*SCSI unknown version per NEC manuals*/
break; break;
case CDROM_TYPE_TOSHIBA_XM3201B_3232: case CDROM_TYPE_TOSHIBA_XM3201B_3232:
@ -3388,8 +3406,6 @@ begin:
case CDROM_TYPE_NEC_38_103: case CDROM_TYPE_NEC_38_103:
case CDROM_TYPE_NEC_75_103: case CDROM_TYPE_NEC_75_103:
case CDROM_TYPE_NEC_77_106: case CDROM_TYPE_NEC_77_106:
case CDROM_TYPE_NEC_211_100:
case CDROM_TYPE_NEC_464_105:
break; break;
default: default:
dev->buffer[6] = 0x01; /* 16-bit transfers supported */ dev->buffer[6] = 0x01; /* 16-bit transfers supported */
@ -3439,7 +3455,7 @@ atapi_out:
len = MIN(len, max_len); len = MIN(len, max_len);
scsi_cdrom_set_buf_len(dev, BufLen, &len); scsi_cdrom_set_buf_len(dev, BufLen, &max_len);
scsi_cdrom_log("Inquiry = %d, max = %d, BufLen = %d.\n", len, max_len, *BufLen); scsi_cdrom_log("Inquiry = %d, max = %d, BufLen = %d.\n", len, max_len, *BufLen);
scsi_cdrom_data_command_finish(dev, len, len, max_len, 0); scsi_cdrom_data_command_finish(dev, len, len, max_len, 0);
@ -3470,10 +3486,12 @@ atapi_out:
goto begin; goto begin;
break; break;
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k: case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_TEXEL_DMXX24_100: /*GPCMD_READ_HEADER_SONY*/ case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEXEL_DM3028_106: /*GPCMD_READ_HEADER_SONY*/
scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN); scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN);
dev->sony_vendor = 1; dev->sony_vendor = 1;
@ -3534,17 +3552,19 @@ atapi_out:
goto begin; goto begin;
break; break;
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k: case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_TEXEL_DMXX24_100: /*GPCMD_READ_SUBCHANNEL_SONY*/ case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEXEL_DM3028_106: /*GPCMD_READ_SUBCHANNEL_SONY*/
scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN); scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN);
dev->sony_vendor = 1; dev->sony_vendor = 1;
max_len = cdb[7]; max_len = cdb[7];
max_len <<= 8; max_len <<= 8;
max_len |= cdb[8]; max_len |= cdb[8];
msf = dev->ms_pages_saved_sony.pages[GPMODE_CDROM_PAGE_SONY][2] & 0x01; msf = dev->drv->sony_msf;
scsi_cdrom_log("CD-ROM %i: Getting sub-channel type (%s), code-q = %02x\n", dev->id, msf ? "MSF" : "LBA", cdb[2] & 0x40); scsi_cdrom_log("CD-ROM %i: Getting sub-channel type (%s), code-q = %02x\n", dev->id, msf ? "MSF" : "LBA", cdb[2] & 0x40);
@ -3552,7 +3572,7 @@ atapi_out:
scsi_cdrom_buf_alloc(dev, 9); scsi_cdrom_buf_alloc(dev, 9);
memset(dev->buffer, 0, 9); memset(dev->buffer, 0, 9);
len = 9; len = 9;
cdrom_get_current_subchannel_sony(dev->drv, dev->buffer, msf || dev->drv->sony_msf); cdrom_get_current_subchannel_sony(dev->drv, dev->buffer, msf);
len = MIN(len, max_len); len = MIN(len, max_len);
scsi_cdrom_set_buf_len(dev, BufLen, &len); scsi_cdrom_set_buf_len(dev, BufLen, &len);
scsi_cdrom_data_command_finish(dev, len, len, len, 0); scsi_cdrom_data_command_finish(dev, len, len, len, 0);
@ -3665,6 +3685,7 @@ atapi_out:
dev->buffer[6] = 8; dev->buffer[6] = 8;
len = 8; len = 8;
scsi_cdrom_log("CD-ROM Capacity=%x.\n", dev->drv->cdrom_capacity - 1);
scsi_cdrom_set_buf_len(dev, BufLen, &len); scsi_cdrom_set_buf_len(dev, BufLen, &len);
scsi_cdrom_data_command_finish(dev, len, len, len, 0); scsi_cdrom_data_command_finish(dev, len, len, len, 0);
@ -3690,10 +3711,12 @@ atapi_out:
goto begin; goto begin;
break; break;
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k: case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_TEXEL_DMXX24_100: /*GPCMD_PAUSE_SONY*/ case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEXEL_DM3028_106: /*GPCMD_PAUSE_SONY*/
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
dev->sony_vendor = 1; dev->sony_vendor = 1;
cdrom_audio_pause_resume(dev->drv, !(cdb[1] & 0x10)); cdrom_audio_pause_resume(dev->drv, !(cdb[1] & 0x10));
@ -3713,10 +3736,12 @@ atapi_out:
goto begin; goto begin;
break; break;
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k: case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_TEXEL_DMXX24_100: /*GPCMD_PLAY_AUDIO_SONY*/ case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEXEL_DM3028_106: /*GPCMD_PLAY_AUDIO_SONY*/
cdb[0] = GPCMD_PLAY_AUDIO_10; cdb[0] = GPCMD_PLAY_AUDIO_10;
dev->current_cdb[0] = cdb[0]; dev->current_cdb[0] = cdb[0];
dev->sony_vendor = 1; dev->sony_vendor = 1;
@ -3751,10 +3776,12 @@ atapi_out:
goto begin; goto begin;
break; break;
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k: case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_TEXEL_DMXX24_100: /*GPCMD_PLAYBACK_CONTROL_SONY*/ case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEXEL_DM3028_106: /*GPCMD_PLAYBACK_CONTROL_SONY*/
scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_OUT); scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_OUT);
dev->sony_vendor = 1; dev->sony_vendor = 1;
@ -3959,6 +3986,7 @@ scsi_cdrom_phase_data_out(scsi_common_t *sc)
block_desc_len = dev->buffer[2]; block_desc_len = dev->buffer[2];
block_desc_len <<= 8; block_desc_len <<= 8;
block_desc_len |= dev->buffer[3]; block_desc_len |= dev->buffer[3];
pclog("BlockDescLen (6)=%d, ParamListLen (6)=%d.\n", block_desc_len, param_list_len);
} else { } else {
block_desc_len = dev->buffer[6]; block_desc_len = dev->buffer[6];
block_desc_len <<= 8; block_desc_len <<= 8;
@ -3969,9 +3997,12 @@ scsi_cdrom_phase_data_out(scsi_common_t *sc)
pos = hdr_len + block_desc_len; pos = hdr_len + block_desc_len;
for (uint16_t j = 0; j < pos; j++) {
pclog("Buffer Mode Select, pos=%d, data=%02x.\n", j, dev->buffer[j]);
}
while (1) { while (1) {
if (pos >= param_list_len) { if (pos >= param_list_len) {
scsi_cdrom_log("CD-ROM %i: Buffer has only block descriptor\n", dev->id); pclog("CD-ROM %i: Buffer has only block descriptor\n", dev->id);
break; break;
} }
@ -3982,12 +4013,17 @@ scsi_cdrom_phase_data_out(scsi_common_t *sc)
switch (dev->drv->type) { switch (dev->drv->type) {
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k: case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_TEXEL_DMXX24_100: case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEXEL_DM3028_106:
if ((page == 0x08) && (page_len == 0x02))
dev->drv->sony_msf = dev->buffer[pos] & 0x01;
if (!(scsi_cdrom_mode_sense_page_flags_sony & (1LL << ((uint64_t) page)))) { if (!(scsi_cdrom_mode_sense_page_flags_sony & (1LL << ((uint64_t) page)))) {
scsi_cdrom_log("CD-ROM %i: Unimplemented page %02X\n", dev->id, page); pclog("CD-ROM %i: Sony: Unimplemented page %02X\n", dev->id, page);
error |= 1; error |= 1;
} else { } else {
for (i = 0; i < page_len; i++) { for (i = 0; i < page_len; i++) {
@ -3998,7 +4034,7 @@ scsi_cdrom_phase_data_out(scsi_common_t *sc)
if (ch) if (ch)
dev->ms_pages_saved_sony.pages[page][i + 2] = val; dev->ms_pages_saved_sony.pages[page][i + 2] = val;
else { else {
scsi_cdrom_log("CD-ROM %i: Unchangeable value on position %02X on page %02X\n", dev->id, i + 2, page); pclog("CD-ROM %i: Sony: Unchangeable value on position %02X on page %02X\n", dev->id, i + 2, page);
error |= 1; error |= 1;
} }
} }
@ -4007,7 +4043,7 @@ scsi_cdrom_phase_data_out(scsi_common_t *sc)
break; break;
default: default:
if (!(scsi_cdrom_mode_sense_page_flags & (1LL << ((uint64_t) page)))) { if (!(scsi_cdrom_mode_sense_page_flags & (1LL << ((uint64_t) page)))) {
scsi_cdrom_log("CD-ROM %i: Unimplemented page %02X\n", dev->id, page); pclog("CD-ROM %i: Unimplemented page %02X\n", dev->id, page);
error |= 1; error |= 1;
} else { } else {
for (i = 0; i < page_len; i++) { for (i = 0; i < page_len; i++) {
@ -4018,7 +4054,7 @@ scsi_cdrom_phase_data_out(scsi_common_t *sc)
if (ch) if (ch)
dev->ms_pages_saved.pages[page][i + 2] = val; dev->ms_pages_saved.pages[page][i + 2] = val;
else { else {
scsi_cdrom_log("CD-ROM %i: Unchangeable value on position %02X on page %02X\n", dev->id, i + 2, page); pclog("CD-ROM %i: Unchangeable value on position %02X on page %02X\n", dev->id, i + 2, page);
error |= 1; error |= 1;
} }
} }
@ -4031,10 +4067,12 @@ scsi_cdrom_phase_data_out(scsi_common_t *sc)
switch (dev->drv->type) { switch (dev->drv->type) {
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k: case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_TEXEL_DMXX24_100: case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEXEL_DM3028_106:
val = scsi_cdrom_mode_sense_pages_default_sony_scsi.pages[page][0] & 0x80; val = scsi_cdrom_mode_sense_pages_default_sony_scsi.pages[page][0] & 0x80;
break; break;
default: default:
@ -4060,10 +4098,12 @@ scsi_cdrom_phase_data_out(scsi_common_t *sc)
case 0xC9: case 0xC9:
switch (dev->drv->type) { switch (dev->drv->type) {
case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_ShinaKen_DM3x1S_104:
case CDROM_TYPE_SONY_CDU541_10i: case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k: case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100: case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_TEXEL_DMXX24_100: case CDROM_TYPE_TEXEL_DM3024_100:
case CDROM_TYPE_TEXEL_DM3028_106:
for (i = 0; i < 18; i++) { for (i = 0; i < 18; i++) {
dev->ms_pages_saved_sony.pages[GPMODE_CDROM_AUDIO_PAGE_SONY][i] = dev->buffer[i]; dev->ms_pages_saved_sony.pages[GPMODE_CDROM_AUDIO_PAGE_SONY][i] = dev->buffer[i];
} }