IOATAPIDVDCommand.cpp [plain text]
#include <IOKit/assert.h>
#include <IOKit/storage/ata/IOATAPIDVDDrive.h>
IOATACommand *
IOATAPIDVDDrive::atapiCommandSendKey(IOMemoryDescriptor * buffer,
const DVDKeyClass keyClass,
const UInt8 agid,
const DVDKeyFormat keyFormat)
{
ATACDBInfo atapiCmd;
assert(buffer);
bzero(&atapiCmd, sizeof(atapiCmd));
atapiCmd.cdbLength = 12;
atapiCmd.cdb[0] = kIOATAPICommandSendKey;
atapiCmd.cdb[7] = keyClass;
atapiCmd.cdb[8] = (UInt8)(buffer->getLength() >> 8);
atapiCmd.cdb[9] = (UInt8)(buffer->getLength());
atapiCmd.cdb[10] = agid << 6 | keyFormat;
return atapiCommand(&atapiCmd, buffer);
}
IOATACommand *
IOATAPIDVDDrive::atapiCommandReportKey(IOMemoryDescriptor * buffer,
const DVDKeyClass keyClass,
const UInt32 lba,
const UInt8 agid,
const DVDKeyFormat keyFormat)
{
ATACDBInfo atapiCmd;
assert(buffer);
bzero(&atapiCmd, sizeof(atapiCmd));
atapiCmd.cdbLength = 12;
atapiCmd.cdb[0] = kIOATAPICommandReportKey;
if (keyFormat == kTitleKey) {
atapiCmd.cdb[2] = (UInt8)(lba >> 24);
atapiCmd.cdb[3] = (UInt8)(lba >> 16);
atapiCmd.cdb[4] = (UInt8)(lba >> 8);
atapiCmd.cdb[5] = (UInt8)(lba);
}
atapiCmd.cdb[7] = keyClass;
atapiCmd.cdb[8] = (UInt8)(buffer->getLength() >> 8);
atapiCmd.cdb[9] = (UInt8)(buffer->getLength());
atapiCmd.cdb[10] = agid << 6 | keyFormat;
return atapiCommand(&atapiCmd, buffer);
}
IOATACommand *
IOATAPIDVDDrive::atapiCommandGetConfiguration(IOMemoryDescriptor * buffer,
UInt8 rt,
UInt16 sfn = 0)
{
ATACDBInfo atapiCmd;
assert(buffer);
bzero(&atapiCmd, sizeof(atapiCmd));
atapiCmd.cdbLength = 12;
atapiCmd.cdb[0] = kIOATAPICommandGetConfiguration;
atapiCmd.cdb[1] = rt & 0x03;
atapiCmd.cdb[2] = (UInt8)(sfn >> 8); atapiCmd.cdb[3] = (UInt8)(sfn); atapiCmd.cdb[7] = (UInt8)(buffer->getLength() >> 8);
atapiCmd.cdb[8] = (UInt8)(buffer->getLength());
return atapiCommand(&atapiCmd, buffer);
}
IOATACommand *
IOATAPIDVDDrive::atapiCommandReadDVDStructure(IOMemoryDescriptor * buffer,
UInt8 format,
UInt32 address = 0,
UInt8 layer = 0,
UInt8 agid = 0)
{
ATACDBInfo atapiCmd;
assert(buffer);
bzero(&atapiCmd, sizeof(atapiCmd));
atapiCmd.cdbLength = 12;
atapiCmd.cdb[0] = kIOATAPICommandReadDVDStructure;
atapiCmd.cdb[2] = (UInt8)(address >> 24);
atapiCmd.cdb[3] = (UInt8)(address >> 16);
atapiCmd.cdb[4] = (UInt8)(address >> 8);
atapiCmd.cdb[5] = (UInt8)(address);
atapiCmd.cdb[6] = layer;
atapiCmd.cdb[7] = format;
atapiCmd.cdb[8] = (UInt8)(buffer->getLength() >> 8);
atapiCmd.cdb[9] = (UInt8)(buffer->getLength());
atapiCmd.cdb[10] = (agid & 0x3) << 6;
return atapiCommand(&atapiCmd, buffer);
}