Der ATIP ist die Absolute Time in Pre-Grove von CD-R/RW-Medien. Diese Zeitinformationen werden zur Positionierung auf dem Medium während des Brennvorganges verwendet. Ausgelesen werden die Startzeit des Lead-In und die maximale Startzeit des Lead-Out. Das Lead-In liegt vor der Startzeit 0m0s0f und kann deshalb in der Regel nur von Brennern ausgelesen werden. Ein ATIP steht am Beginn eines jeden Sektors nach einer Synchronisationskennung und enthält neben der MSF Adresse auch eine Typinformation:
| Sync | Minuten | Sekunden | Frames | EDC | |||||||||||||||||||||
| M1 | X | X | X | X | X | X | X | S1 | X | X | X | X | X | X | X | F1 | X | X | X | X | X | X | X | ||
Die Startzeit des Lead-In stellt dabei die Herstellerkennung (Manufacturer ID) und die größtmögliche Startzeit des
Lead-Out die Kapazität des unbeschriebenen Mediums dar. Eine herunterladbare Liste der Manufacturer IDs habe ich
nicht gefunden. Eine Datenbank gibt es jedoch bei
InstantInfo.
Das READ TOC/PMA/ATIP Command wird in der MMC-6 in den Kapitel 6.25 ff beschrieben. Der READ TOC/PMA/ATIP Command Descriptor Block ist in Kapitel 6.25.2.1 dargestellt:
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| 0 | Operation Code ($43) | |||||||
| 1 | Reserviert | MSF (1) | Reserviert | |||||
| 2 | Reserviert | Format (0100b) | ||||||
| 3 | Reserviert | |||||||
| 4 | ||||||||
| 5 | ||||||||
| 6 | Track/Session Number ($00) | |||||||
| 7 | Allocation Length | |||||||
| 8 | ||||||||
| 9 | Control | |||||||
Operation Code: $43 - READ TOC/PMA/ATIP Command.
MSF: 1b - Die Adressen sollen in MSF angegeben werden (0b = LBA). Das Bit muss hier nicht gesetzt werden, da der ATIP als MSF Adresse definiert ist.
Format: 0100b - ATIP.
Track/Session Number: $00 - Ist hier reserviert.
Allocation Length: $0020 - Länge der Antwortstruktur. Das Response Format 0100b - ATIP ist bis zu 32 Byte lang. Die Beschreibung gibt es in der MMC-6 in Kapitel 2.25.3.6.2. Die A1 Values finden sich in der MMC-0 in Kapitel 5.1.13.6. CD-ROM und DVDs unterstützen das Response Format nicht und die Antwortlänge ist 0.
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| 0 | ATIP Data Length | |||||||
| 1 | ||||||||
| 2 | Beim ATIP Format reserviert. | |||||||
| 3 | ||||||||
| ATIP Descriptor | ||||||||
| Special Information 1 | ||||||||
| 0 | Indicative Target Writing Power | Reserviert | Reference Speed | |||||
| 1 | 0 | URU | Reserviert | |||||
| 2 | 1 | Disc Type | Disc Sub-Type | A1 Valid | A2 Valid | A3 Valid | ||
| 3 | Reserviert | |||||||
| Special Information 2 | ||||||||
| 4 | ATIP Start Time of Lead-In (Min) | |||||||
| 5 | ATIP Start Time of Lead-In (Sec) | |||||||
| 6 | ATIP Start Time of Lead-In (Frame) | |||||||
| 7 | Reserviert | |||||||
| Special Information 3 | ||||||||
| 8 | ATIP Last Possible Time of Lead-Out (Min) | |||||||
| 9 | ATIP Last Possible Time of Lead-Out (Sec) | |||||||
| 10 | ATIP Last Possible Time of Lead-Out (Frame) | |||||||
| 11 | Reserviert | |||||||
| Additional Information 1 (A1 Values) | ||||||||
| 12 | 0 | Lowest Usable CLV Recording Speed | Highest Usable CLV Recording Speed | |||||
| 13 | 0 | Power Multiplication Factor p | Target y value of the Modulation/Power function | Reserviert | ||||
| 14 | 1 | Recommended Erase/Write Power Ratio | Reserviert | |||||
| 15 | Reserviert | |||||||
| Additional Information 2 | ||||||||
| 16 | A2 Values | |||||||
| 17 | ||||||||
| 18 | ||||||||
| 19 | Reserviert | |||||||
| Additional Information 3 | ||||||||
| 20 | A3 Values | |||||||
| 21 | ||||||||
| 22 | ||||||||
| 23 | Reserviert | |||||||
| 24 | S4 Values | |||||||
| 25 | ||||||||
| 26 | ||||||||
| 27 | Reserviert | |||||||
ATIP Data Length
Gibt in Bytes an, wie lang die folgende Datenstruktur ist.
Indicative Target Writing Power: Verschlüsselte Information für die Anfangseinstellungen der Laserleistung zum Schreiben.
Reference Speed: Verschlüsselte Information für die empfohlene Schreibgeschwindigkeit. Nur gültig für CD-RW. Der Wert 001b entspricht 2X, die Werte 010b..111b sind reserviert.
URU - Unrestricted Use Disc: Gibt an, ob die Disc für den uneingeschränkten (unrestricted) oder den allgemeinen (general) Gebrauch bestimmt ist.
Disc Type: Gibt an, ob die CD wiederbeschreibbar ist.
Disc Sub-Type: Gibt den Untertyp der CD-RW an. Für wiederbeschreibbare CD sind acht Untertypen möglich. Das
CD-RW Media Write Support Feature gibt die Schreibunterstützung des Laufwerkes für alle Untertypen an.
Bei Wikipedia werden die Typen Multi-Speed (1-4x), High-Speed
(4-10x), High-Speed+ (4-12x), Ultra Speed (10-24x) und Ultra Speed+ (16-32x) genannt.
Ich habe hier drei verschiedene Medien: 2-4x -> 0, 4-12x -> 1 und 16-24x -> 2.
Für einmal beschreibbare CDs soll es keine Untertypen geben und der Wert entsprechend 0 sein. Dem scheint aber
nicht so zu sein. Bei ein paar getesteten CD-R hatten diese die Werte 2, 4 und 6.
A1: Gibt an, ob die A1-Wertefelder gültig sind.
A2: Gibt an, ob die A2-Wertefelder gültig sind.
A3: Gibt an, ob die A3-Wertefelder gültig sind.
Start Time of Lead-In: Startzeit des Disc-Lead-In.
Last Possible Start Time of Lead-Out: Für Orange Book Teil II konforme CD-R/RWs enthält die MSF-Adresse den größtmöglichen Startpunkt für das abschließende Lead-Out. Er darf nicht größer als 79:59:74 MSF sein und sollte nicht überschritten werden. Eine Disc mit einer Session besitzt ein Lead-Out von 90 Sekunden. Bei Multi-Session ist das abschließende Lead-Out 30 Sekunden. Bei CD-R mit höherer Kapazität ist es die Startzeit der zusätzlichen Kapazität.
Enthält Felder für zusätzliche Schreibstrategieparameter. Bei CD-R mit höherer Kapazität enthält es ein Kapazitätserweiterungsfeld.
Lowest CLV Recording Speeds:
| Value | Recording Speed |
| 000b | Reserviert |
| 001b | 2X |
| 010b..111b | Reserviert |
Highest CLV Recording Speeds:
| Value | Recording Speed |
| 000b | Reserviert |
| 001b | 2X |
| 010b | 4X |
| 011b | 6X |
| 100b | 8X |
| 101b..111b | Reserviert |
Enthält Felder für zusätzliche Schreibstrategieparameter.
Enthält Felder für die Media Identifikation.
{
* Für die Auswertung.
}
const
RespFmtTOC = $00;
RespFmtMSI = $01;
RespFmtRawTOC = $02;
RespFmtPMA = $03;
RespFmtATIP = $04;
RespFmtCDTEXT = $05;
type
TSpecialInformation1 = record
ITWritingPower : Byte;
ReferenceSpeed : Byte;
URU : Boolean;
DiscType : Boolean;
DiscSubType : Byte;
A1Valid : Boolean;
A2Valid : Boolean;
A3Valid : Boolean;
end;
type
TSpecialInformation2 = record
ATIPStartTimeLeadIn_Min : Byte;
ATIPStartTimeLeadIn_Sec : Byte;
ATIPStartTimeLeadIn_Frame : Byte;
end;
type
TSpecialInformation3 = record
ATIPLastStartTimeLeadOut_Min : Byte;
ATIPLastStartTimeLeadOut_Sec : Byte;
ATIPLastStartTimeLeadOut_Frame : Byte;
end;
type
TAdditionalInformation1 = record
LowestCLVSpeed : Byte;
HighestCLVSpeed : Byte;
PowerMultFactor : Byte;
TargetValue : Byte;
PowerRatio : Byte;
end;
type
TAdditionalInformation2 = record
A2Values : Array[0..2] of Byte;
end;
type
TAdditionalInformation3 = record
A3Values : Array[0..2] of Byte;
S4Values : Array[0..2] of Byte;
end;
type
TATIP = record
DataLength : Word;
SpecialInformation1 : TSpecialInformation1;
SpecialInformation2 : TSpecialInformation2;
SpecialInformation3 : TSpecialInformation3;
AdditionalInformation1 : TAdditionalInformation1;
AdditionalInformation2 : TAdditionalInformation2;
AdditionalInformation3 : TAdditionalInformation3;
end;
...
{
* Für den Befehl.
}
const
SCSIOP_READ_TOC = $43;
type
TREAD_TOC_PMA_ATIP_CDB = record
OperationCode : Byte;
MSF : Byte;
Format : Byte;
TrackSessionNumber : Byte;
AllocationLength : Word;
Control : Byte;
end;
type
TREAD_TOC_PMA_ATIP_DATA = record
General : Array[$00..$03] of byte;
Data : Array[$00..$1B] of Byte;
end;
Nach dem Ausfüllen des Command Descriptors Blockes wird die Abfrage ausgeführt und die Antwort ausgewertet. Hier muss jedoch abweichend zu den Ausführungen in Hardwareinformationen den Variablen nInBufferSize und nOutBufferSize SizeOf(TSCSI_PASS_THROUGH_DIRECT_WITH_BUFFER) zugewiesen.
...
begin
...
{
* Den Command Descriptor Block füllen.
}
ZeroMemory(@READ_TOC_PMA_ATIP_CDB, SizeOf(READ_TOC_PMA_ATIP_CDB));
READ_TOC_PMA_ATIP_CDB.OperationCode := SCSIOP_READ_TOC;
READ_TOC_PMA_ATIP_CDB.MSF := 1;
READ_TOC_PMA_ATIP_CDB.Format := RespFmtATIP;
READ_TOC_PMA_ATIP_CDB.AllocationLength := SizeOf(TREAD_TOC_PMA_ATIP_DATA);
{
* Den Command Descriptor Block übertragen.
}
ZeroMemory(@aCDB, SizeOf(aCDB));
aCDB[0] := READ_TOC_PMA_ATIP_CDB.OperationCode;
aCDB[1] := READ_TOC_PMA_ATIP_CDB.MSF and $01 shl 1;
aCDB[2] := READ_TOC_PMA_ATIP_CDB.Format and $0F;
aCDB[7] := HiByte(READ_TOC_PMA_ATIP_CDB.AllocationLength);
aCDB[8] := LoByte(READ_TOC_PMA_ATIP_CDB.AllocationLength);
{
* Befehl ausführen
}
ZeroMemory(@READ_TOC_PMA_ATIP_DATA, SizeOf(READ_TOC_PMA_ATIP_DATA));
if GET_SCSI_PASS_THROUGH_DIRECT(aDevice, aCDB, @READ_TOC_PMA_ATIP_DATA,
SizeOf(TREAD_TOC_PMA_ATIP_DATA))
then begin
ATIP.DataLength := READ_TOC_PMA_ATIP_DATA.General[0] shl 8 or
READ_TOC_PMA_ATIP_DATA.General[1];
with ATIP.SpecialInformation1
do begin
ITWritingPower := READ_TOC_PMA_ATIP_DATA.Data[0] and $F0 shr 4;
ReferenceSpeed := READ_TOC_PMA_ATIP_DATA.Data[0] and $07;
URU := READ_TOC_PMA_ATIP_DATA.Data[1] and $40 > 0;
DiscType := READ_TOC_PMA_ATIP_DATA.Data[2] and $40 > 0;
DiscSubType := READ_TOC_PMA_ATIP_DATA.Data[2] and $38 shr 3;
A1Valid := READ_TOC_PMA_ATIP_DATA.Data[2] and $04 > 0;
A2Valid := READ_TOC_PMA_ATIP_DATA.Data[2] and $02 > 0;
A3Valid := READ_TOC_PMA_ATIP_DATA.Data[2] and $01 > 0;
end;
with ATIP.SpecialInformation2
do begin
ATIPStartTimeLeadIn_Min := READ_TOC_PMA_ATIP_DATA.Data[4];
ATIPStartTimeLeadIn_Sec := READ_TOC_PMA_ATIP_DATA.Data[5];
ATIPStartTimeLeadIn_Frame := READ_TOC_PMA_ATIP_DATA.Data[6];
end;
with ATIP.SpecialInformation3
do begin
ATIPLastStartTimeLeadOut_Min := READ_TOC_PMA_ATIP_DATA.Data[8];
ATIPLastStartTimeLeadOut_Sec := READ_TOC_PMA_ATIP_DATA.Data[9];
ATIPLastStartTimeLeadOut_Frame := READ_TOC_PMA_ATIP_DATA.Data[10];
end;
with ATIP.AdditionalInformation1
do begin
LowestCLVSpeed := READ_TOC_PMA_ATIP_DATA.Data[12] and $70 shr 4;
HighestCLVSpeed := READ_TOC_PMA_ATIP_DATA.Data[12] and $0F;
PowerMultFactor := READ_TOC_PMA_ATIP_DATA.Data[13] and $70 shr 4;
TargetValue := READ_TOC_PMA_ATIP_DATA.Data[13] and $0E shr 1;
PowerRatio := READ_TOC_PMA_ATIP_DATA.Data[14] and $70 shr 4;
end;
with ATIP.AdditionalInformation2
do begin
A2Values[0] := READ_TOC_PMA_ATIP_DATA.Data[16];
A2Values[1] := READ_TOC_PMA_ATIP_DATA.Data[17];
A2Values[2] := READ_TOC_PMA_ATIP_DATA.Data[18];
end;
with ATIP.AdditionalInformation3
do begin
A3Values[0] := READ_TOC_PMA_ATIP_DATA.Data[20];
A3Values[1] := READ_TOC_PMA_ATIP_DATA.Data[21];
A3Values[2] := READ_TOC_PMA_ATIP_DATA.Data[22];
S4Values[0] := READ_TOC_PMA_ATIP_DATA.Data[24];
S4Values[1] := READ_TOC_PMA_ATIP_DATA.Data[25];
S4Values[2] := READ_TOC_PMA_ATIP_DATA.Data[26];
end;
end;
...
end;
Hier können einige Plausibilitätsprüfungen vorgenommen werden. Zum Beispiel kann man die Längenangaben und die
bereits definierten Bits überprüfen.
Demo, welche diese Funktion nutzt:

Medien Disc ATIP (podDiscATIP.7z - 263 kb) MD5 (1 kb). Stand: 26. Februar 2012
Fr_An - Erstellt: 2. Februar 2012 - Letzte Änderung: 26. Februar 2012
seit 28. Juli 2010