IOATAPICDCommand.cpp [plain text]
#include <IOKit/assert.h>
#include <IOKit/storage/ata/IOATAPICDDrive.h>
IOATACommand *
IOATAPICDDrive::atapiCommandReadTOC(IOMemoryDescriptor * buffer,
bool msf,
UInt8 format,
UInt8 startTrackSession)
{
ATACDBInfo atapiCmd;
assert(buffer);
bzero(&atapiCmd, sizeof(atapiCmd));
atapiCmd.cdbLength = 12;
atapiCmd.cdb[0] = kIOATAPICommandReadTOC;
atapiCmd.cdb[1] = msf ? 0x02 : 0x00;
atapiCmd.cdb[6] = startTrackSession;
atapiCmd.cdb[7] = (UInt8)(buffer->getLength() >> 8);
atapiCmd.cdb[8] = (UInt8)(buffer->getLength());
if ((format & 0x04))
atapiCmd.cdb[2] = (format & 0x07); else
atapiCmd.cdb[9] = (format & 0x03) << 6;
return atapiCommand(&atapiCmd, buffer);
}
IOATACommand *
IOATAPICDDrive::atapiCommandPlayAudioMSF(CDMSF timeStart, CDMSF timeStop)
{
ATACDBInfo atapiCmd;
bzero(&atapiCmd, sizeof(atapiCmd));
atapiCmd.cdbLength = 12;
atapiCmd.cdb[0] = kIOATAPICommandPlayAudioMSF;
atapiCmd.cdb[3] = timeStart.minute;
atapiCmd.cdb[4] = timeStart.second;
atapiCmd.cdb[5] = timeStart.frame;
atapiCmd.cdb[6] = timeStop.minute;
atapiCmd.cdb[7] = timeStop.second;
atapiCmd.cdb[8] = timeStop.frame;
return atapiCommand(&atapiCmd);
}
IOATACommand *
IOATAPICDDrive::atapiCommandPauseResume(bool resume)
{
ATACDBInfo atapiCmd;
bzero(&atapiCmd, sizeof(atapiCmd));
atapiCmd.cdbLength = 12;
atapiCmd.cdb[0] = kIOATAPICommandPauseResume;
if (resume) atapiCmd.cdb[8] = 0x01;
return atapiCommand(&atapiCmd);
}
IOATACommand *
IOATAPICDDrive::atapiCommandStopPlay()
{
ATACDBInfo atapiCmd;
bzero(&atapiCmd, sizeof(atapiCmd));
atapiCmd.cdbLength = 12;
atapiCmd.cdb[0] = kIOATAPICommandStopPlay;
return atapiCommand(&atapiCmd);
}
IOATACommand *
IOATAPICDDrive::atapiCommandReadSubChannel(IOMemoryDescriptor * buffer,
UInt8 dataFormat,
UInt8 trackNumber)
{
ATACDBInfo atapiCmd;
assert(buffer);
bzero(&atapiCmd, sizeof(atapiCmd));
atapiCmd.cdbLength = 12;
atapiCmd.cdb[0] = kIOATAPICommandReadSubChannel;
atapiCmd.cdb[1] = 0x02;
atapiCmd.cdb[2] = 0x40;
atapiCmd.cdb[3] = dataFormat;
atapiCmd.cdb[6] = trackNumber;
atapiCmd.cdb[7] = (buffer->getLength() >> 8) & 0xff;
atapiCmd.cdb[8] = buffer->getLength() & 0xff;
return atapiCommand(&atapiCmd, buffer);
}
IOATACommand *
IOATAPICDDrive::atapiCommandScan(CDMSF timeStart, bool reverse)
{
ATACDBInfo atapiCmd;
bzero(&atapiCmd, sizeof(atapiCmd));
atapiCmd.cdbLength = 12;
atapiCmd.cdb[0] = kIOATAPICommandScan;
atapiCmd.cdb[1] = reverse ? 0x10 : 0x00;
atapiCmd.cdb[3] = timeStart.minute;
atapiCmd.cdb[4] = timeStart.second;
atapiCmd.cdb[5] = timeStart.frame;
atapiCmd.cdb[9] = 0x40;
return atapiCommand(&atapiCmd);
}
IOATACommand *
IOATAPICDDrive::atapiCommandReadCD(IOMemoryDescriptor * buffer,
UInt32 block,
UInt32 nblks,
CDSectorArea sectorArea,
CDSectorType sectorType)
{
ATACDBInfo atapiCmd;
assert(buffer);
bzero(&atapiCmd, sizeof(atapiCmd));
atapiCmd.cdbLength = 12;
atapiCmd.cdb[ 0] = kIOATAPICommandReadCD;
atapiCmd.cdb[ 1] = (sectorType & 0x7) << 2;
atapiCmd.cdb[ 2] = (block >> 24) & 0xFF;
atapiCmd.cdb[ 3] = (block >> 16) & 0xFF;
atapiCmd.cdb[ 4] = (block >> 8) & 0xFF;
atapiCmd.cdb[ 5] = (block ) & 0xFF;
atapiCmd.cdb[ 6] = (nblks >> 16) & 0xFF;
atapiCmd.cdb[ 7] = (nblks >> 8) & 0xFF;
atapiCmd.cdb[ 8] = (nblks ) & 0xFF;
atapiCmd.cdb[ 9] = (sectorArea & ~kCDSectorAreaSubChannel);
atapiCmd.cdb[10] = (sectorArea & kCDSectorAreaSubChannel);
return atapiCommand(&atapiCmd, buffer);
}