Added missing CD-ROM mode select functionality.
This commit is contained in:
parent
a22b735da0
commit
48853d3725
1 changed files with 66 additions and 7 deletions
|
|
@ -522,6 +522,65 @@ static uint32_t ide_atapi_mode_sense(scsi_cd_data_t *data, uint32_t pos, uint8_t
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void cdrom_mode_select(scsi_cd_data_t *data, int data_len)
|
||||||
|
{
|
||||||
|
int len = data->data_out[1] | (data->data_out[0] << 8);
|
||||||
|
int pos = 8 + len; /*Skip over mode parameter header*/
|
||||||
|
|
||||||
|
while (pos < data_len)
|
||||||
|
{
|
||||||
|
int page_code = data->data_out[pos] & 0x3f;
|
||||||
|
len = data->data_out[pos+1];
|
||||||
|
|
||||||
|
pos += 2;
|
||||||
|
|
||||||
|
switch (page_code)
|
||||||
|
{
|
||||||
|
case GPMODE_CDROM_AUDIO_PAGE:
|
||||||
|
if (len != 0xe)
|
||||||
|
{
|
||||||
|
atapi_cmd_error(data, KEY_ILLEGAL_REQ, ASC_INV_FIELD_IN_CMD_PACKET, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
memcpy(mode_pages_in[GPMODE_CDROM_AUDIO_PAGE], &data->data_out[pos], 0xe);
|
||||||
|
page_flags[GPMODE_CDROM_AUDIO_PAGE] |= PAGE_CHANGED;
|
||||||
|
pos += len;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GPMODE_R_W_ERROR_PAGE:
|
||||||
|
if (len != 0x6)
|
||||||
|
{
|
||||||
|
atapi_cmd_error(data, KEY_ILLEGAL_REQ, ASC_INV_FIELD_IN_CMD_PACKET, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pos += len;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GPMODE_CDROM_PAGE:
|
||||||
|
if (len != 0x6)
|
||||||
|
{
|
||||||
|
atapi_cmd_error(data, KEY_ILLEGAL_REQ, ASC_INV_FIELD_IN_CMD_PACKET, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pos += len;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GPMODE_CAPABILITIES_PAGE:
|
||||||
|
if (len != 0x12)
|
||||||
|
{
|
||||||
|
atapi_cmd_error(data, KEY_ILLEGAL_REQ, ASC_INV_FIELD_IN_CMD_PACKET, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pos += len;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
atapi_cmd_error(data, KEY_ILLEGAL_REQ, ASC_INV_FIELD_IN_CMD_PACKET, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t atapi_get_cd_channel(int channel)
|
uint32_t atapi_get_cd_channel(int channel)
|
||||||
{
|
{
|
||||||
return (page_flags[GPMODE_CDROM_AUDIO_PAGE] & PAGE_CHANGED) ? mode_pages_in[GPMODE_CDROM_AUDIO_PAGE][channel ? 8 : 6] : (channel + 1);
|
return (page_flags[GPMODE_CDROM_AUDIO_PAGE] & PAGE_CHANGED) ? mode_pages_in[GPMODE_CDROM_AUDIO_PAGE][channel ? 8 : 6] : (channel + 1);
|
||||||
|
|
@ -1030,18 +1089,18 @@ static int scsi_cd_command(uint8_t *cdb, void *p)
|
||||||
len = (cdb[7]<<8) | cdb[8];
|
len = (cdb[7]<<8) | cdb[8];
|
||||||
data->prefix_len = 10;
|
data->prefix_len = 10;
|
||||||
}
|
}
|
||||||
data->page_current = cdb[2];
|
|
||||||
if (page_flags[data->page_current] & PAGE_CHANGEABLE)
|
|
||||||
page_flags[GPMODE_CDROM_AUDIO_PAGE] |= PAGE_CHANGED;
|
|
||||||
|
|
||||||
data->cmd_pos = CMD_POS_TRANSFER;
|
data->cmd_pos = CMD_POS_TRANSFER;
|
||||||
data->bytes_required = len;
|
data->bytes_required = len;
|
||||||
pclog("MODE_SELECT len=%i\n", len);
|
|
||||||
return SCSI_PHASE_DATA_OUT;
|
return SCSI_PHASE_DATA_OUT;
|
||||||
}
|
}
|
||||||
pclog("MODE_SELECT complete\n");
|
if (data->bytes_received == data->bytes_required)
|
||||||
data->cmd_pos = CMD_POS_IDLE;
|
{
|
||||||
return SCSI_PHASE_STATUS;
|
cdrom_mode_select(data, data->bytes_required);
|
||||||
|
data->cmd_pos = CMD_POS_IDLE;
|
||||||
|
return SCSI_PHASE_STATUS;
|
||||||
|
}
|
||||||
|
return SCSI_PHASE_DATA_OUT;
|
||||||
|
|
||||||
case GPCMD_GET_EVENT_STATUS_NOTIFICATION: /*0x4a*/
|
case GPCMD_GET_EVENT_STATUS_NOTIFICATION: /*0x4a*/
|
||||||
temp_command = cdb[0];
|
temp_command = cdb[0];
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue