Projekte > Optische Laufwerke > Medieninformationen

CD ATIP

READ TOC/PMA/ATIP Command - Operation Code $43

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 wird dabei als Herstellerkennung (Manufacturer ID) verwendet und die letzttmögliche Startzeit des Lead-Out stellt die Kapazität des unbeschriebenen Mediums dar. Eine herunterladbare Liste der Manufacturer IDs habe ich nicht gefunden. Eine Datenbank ist jedoch unter InstantInfo verfügbar. Diese wird anscheinend nicht mehr gepflegt, so dass sich die Wahrscheinlichkeit, dass der ATIP in der Datenbank gefunden wird, immer geringer wird.

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

 

Zu setzende Werte:

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 für ATIP ist bis zu 32 Byte lang.

Control - ?

Antwortstruktur

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.

Special Information 1

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.

Special Information 2

Start Time of Lead-In: Startzeit des Disc-Lead-In bzw die ManufacturerID.

Special Information 3

Last Possible Start Time of Lead-Out: Für Orange Book Teil II konforme CD-R/RWs enthält die MSF-Adresse den letztmö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.

Additional Information 1

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

 

Additional Information 2

Enthält Felder für zusätzliche Schreibstrategieparameter.

Additional Information 3

Enthält Felder für die Media Identifikation.

 

Deklarationen

 
  {
  *  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;
 
          

 

Ausführung und Auswertung

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.

 
  function TOptDrives.ReadATIP(aDevice: THandle): Boolean;
  {*******************************************************************************
  *  Den ATIP einer CD ermitteln.
  }
  var
    READ_TOC_PMA_ATIP_CDB : TREAD_TOC_PMA_ATIP_CDB;
    pReadAtipData         : PREAD_TOC_PMA_ATIP_DATA;
    aCDB                  : Array of Byte;
  begin
    Result := False;
    {
    *  ATIP initialisieren.
    }
    FillChar(FDrive[FActive].AbsoluteTime, SizeOf(FDrive[FActive].AbsoluteTime), $00);
    {
    *  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_PMA_ATIP;
    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.
    }
    SetLength(aCDB, 10);
    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.
    }
    GetMem(pReadAtipData, SizeOf(TREAD_TOC_PMA_ATIP_DATA));
    if GET_SCSI_PASS_THROUGH_DIRECT(aDevice, aCDB, pReadAtipData,
                                    SizeOf(TREAD_TOC_PMA_ATIP_DATA)) then
    with FDrive[FActive].AbsoluteTime
    do begin
      DataLength := pReadAtipData.General[0] shl 8 or pReadAtipData.General[1];
      {
      *  Prüfen, ob Daten folgen.
      }
      if DataLength >= 14)
      and (pReadAtipData.Data[1] and $80 = 0)
      and (pReadAtipData.Data[2] and $80 > 0)
      then begin
        {
        *  Special Information 1
        }
        SpecialInformation1.ITWritingPower := pReadAtipData.Data[0] and $F0 shr 4;
        SpecialInformation1.ReferenceSpeed := pReadAtipData.Data[0] and $07;
        SpecialInformation1.URU            := pReadAtipData.Data[1] and $40 > 0;
        SpecialInformation1.DiscType       := pReadAtipData.Data[2] and $40 > 0;
        SpecialInformation1.DiscSubType    := pReadAtipData.Data[2] and $38 shr 3;
        SpecialInformation1.A1Valid        := pReadAtipData.Data[2] and $04 > 0;
        SpecialInformation1.A2Valid        := pReadAtipData.Data[2] and $02 > 0;
        SpecialInformation1.A3Valid        := pReadAtipData.Data[2] and $01 > 0;
        {
        *  Special Information 2
        }
        SpecialInformation2.ATIPStartTimeLeadIn_Min   := pReadAtipData.Data[4];
        SpecialInformation2.ATIPStartTimeLeadIn_Sec   := pReadAtipData.Data[5];
        SpecialInformation2.ATIPStartTimeLeadIn_Frame := pReadAtipData.Data[6];
        {
        *  Special Information 3
        }
        SpecialInformation3.ATIPLastStartTimeLeadOut_Min   := pReadAtipData.Data[8];
        SpecialInformation3.ATIPLastStartTimeLeadOut_Sec   := pReadAtipData.Data[9];
        SpecialInformation3.ATIPLastStartTimeLeadOut_Frame := pReadAtipData.Data[10];
        {
        *  Additional Information 1
        }
        if SpecialInformation1.A1Valid
        and (pReadAtipData.Data[12] and $80 = 0)
        and (pReadAtipData.Data[13] and $80 = 0)
        and (pReadAtipData.Data[14] and $80 > 0)
        then begin
          AdditionalInformation1.LowestCLVSpeed  := pReadAtipData.Data[12]
                                                    and $70 shr 4;
          AdditionalInformation1.HighestCLVSpeed := pReadAtipData.Data[12]
                                                    and $0F;
          AdditionalInformation1.PowerMultFactor := pReadAtipData.Data[13]
                                                    and $70 shr 4;
          AdditionalInformation1.TargetValue     := pReadAtipData.Data[13]
                                                    and $0E shr 1;
          AdditionalInformation1.PowerRatio      := pReadAtipData.Data[14]
                                                    and $70 shr 4;
        end;
        {
        *  Additional Information 2
        }
        if SpecialInformation1.A2Valid
        then begin
          AdditionalInformation2.A2Values[0] := pReadAtipData.Data[16];
          AdditionalInformation2.A2Values[1] := pReadAtipData.Data[17];
          AdditionalInformation2.A2Values[2] := pReadAtipData.Data[18];
        end;
        {
        *  Additional Information 3
        }
        if SpecialInformation1.A3Valid
        then begin
          AdditionalInformation3.A3Values[0] := pReadAtipData.Data[20];
          AdditionalInformation3.A3Values[1] := pReadAtipData.Data[21];
          AdditionalInformation3.A3Values[2] := pReadAtipData.Data[22];
          AdditionalInformation3.S4Values[0] := pReadAtipData.Data[24];
          AdditionalInformation3.S4Values[1] := pReadAtipData.Data[25];
          AdditionalInformation3.S4Values[2] := pReadAtipData.Data[26];
        end;
      end;
      Result := True;
    end;
  end;
          

 

Demo, welche diese Funktion nutzt:

ATIP (podATIP.7z - 289 kb) MD5 (1 kb). Stand: 25. Juli 2013

Änderungen an der Demo

Datum Beschreibung
26.02.2012Aktualisiert: Groupbox "Optische Laufwerke".