Projekte > Optische Laufwerke > Medieninformationen

Track Informationen

READ TRACK INFORMATION Command - Operation Code $52

Das READ TRACK INFORMATION Command stellt Informationen über einen logischen Track zur Verfügung. Logischer Track wird als allgemeiner Begriff verwendet, um auf logische Unterteilungen auf einem optischen Medium zu verweisen. Der logische Track bezieht sich auf Tracks auf CD-Medien, auf die Rzone auf DVD-R/-RW-Medien, auf Fragmente auf DVD+R-Medien und auf SRR auf BD-R- Medien. Wenn das gerade eingelegte Medium keine logische Track-Struktur besitzt, ist das gesamte Medium als ein einziger logischer Track anzusehen. Wenn das Medium keine Standardstruktur weil unformatiert besitzt, wird dieser Befehl mit CHECK CONDITION status und sense bytes SK/ASC/ASCQ beendet.

Das Command ist mit einer Reihe von Feature verbunden (siehe Feature List): $001D Multi-Read, $0021 Increment Streaming Writable, $0026 Restrited Overwerite, $0027 CD-RW CAV Write, $002B DVD+R Read, $002C Rigid Restricted Overwrite, $002D CD Track At Once, $002E CD Mastering, $002F DVD-R/RW Write, $0033 Layer Jump Recording und $003B DVD+R DL. Ist keines dieser Feature vorhanden wird das Command nicht unterstützt. Der Command Descriptor Block ist in MMC 6 Kapitel 6.26.2.1 dargestellt:

  7 6 5 4 3 2 1 0
0 Operation Code = $52
1 Reserviert Open Address /
Number Type
2 Logical Block Address / Track / Session Number
3
4
5
6 Reserviert
7 Allocation Length
8
9 Control

 

Zu setzende Werte:

Operation Code $52 - READ TRACK INFORMATION Command.

Open 0b - Wenn Open auf Null festgelegt ist, muss der adressierte logische Track dem Wert des Logical Block Address / Track / Session Number Feldes entsprechen. Wenn Open auf Eins festgelegt ist, wird der erste offene logische Track mit der logischen Titelnummer gesucht, die größer als oder gleich dem angegebenen logischen Track ist.

Address/Number Type 01b und Logical BlockAddress/Track/Session Number Tracknummer:

Address/
Number
Type
Logical Block
Address/Track/
Session Number
Beschreibung
00b Logical Block
Address (LBA)
MAX = letzte mögliche Lead-out Startadresse, wie vom READ DISC INFORMATON Command zurückgegeben. Wenn die LBA >= MAX ist wird der Befehl mit CHECK CONDITION status abgebrochen und die sense bytes SK/ASC/ASCQ werden auf ILLEGAL REQUEST/LOGICAL BLOCK ADDRESS OUT OF RANGE gesetzt. Andernfalls liegt die LBA in irgendeinem logischen Track TA auf der CD.
01b Logical Track
Number (LTN)
= 0
Wenn die eingelegte Disk keine CD ist wird der Befehl mit CHECK CONDITION status abgebrochen und die sense bytes SK/ASC/ASCQ werden auf ILLEGAL REQUEST/INVALID FIELD IN CDB gesetzt. Anderenfalls erhält man die Lead-In Informationen zurück.
Logical Track
Number (LTN)
TM ist die letzte Track Nummer der letzten Session aus der READ DISC INFORMATION Command Standard Disc Information. Wenn LTN > TM ist wird der Befehl mit CHECK CONDITION status beendet und die sense bytes SK/ASC/ASCQ werden auf ILLEGAL REQUEST/INVALID FIELD IN CDB gesetzt. Anderfalls ist TA = LTN.
Logical Track
Number (LTN)
= 255
Wenn die eingelegte Disk eine CD, DVD+R oder DVD+R DL ist wird TA auf die logische Tracknummer auf den unsichtbaren/unvollständigen Track gesetzt. Für DVD meint dieser Wert TA = 255.
10b Session Number
(SN)
SM ist die Anzahl der Sessions aus dem READ DISC INFORMATION Command. Wenn SN > SM ist wird der Befehl mit CHECK CONDITION status abgebrochen und die sense bytes SK/ASC/ASCQ auf ILLEGAL REQUEST/INVALID FIELD IN CDB gesetzt. Andernfalls ist TA gleich dem ersten logischen Track in der Session SN.
11b Reserviert  

 
Allocation Length $30. Die Antwort ist maximal 48 Byte lang.

Control - ?

 

Antwortstruktur

  7 6 5 4 3 2 1 0
0 Data Length
1
2 Logical Track Number (Least Significant Byte)
3 Session Number (Least Significant Byte)
4 Reserviert
5 LJRS Damage Copy Track Mode
6 RT Blank Packet/Inc FP Data Mode
7 Reserviert LRA_V NWA_V
8 Logical Track Start Address
9
10
11
12 Next Writable Address
13
14
15
16 Free Blocks
17
18
19
20 Fixed Packet Size / Blocking Factor
21
22
23
24 Logical Track Size
25
26
27
28 Last Recorded Address
29
30
31
32 Logical Track Number (Most Significant Byte)
33 Session Number (Most Significant Byte)
34 Reserviert
35
36 Read Compatibility LBA
37
38
39
40 Next Layer Jump Address
41
42
43
44 Last Layer Jump Address
45
46
47

 
Data Length Länge der folgenden Struktur in Bytes.

Logical Track Number Die logische Tracknummer aufgeteilt in niedriges und hohes Byte.

Session Number Die Sessionnummer aufgeteilt in niedriges und hohes Byte.

LJRS Der Layer Jump Recording status definiert den gegenwärtigen Layer Jump Recording status für das eingelegte Medium:

00b - Not Layer Jump Recording Mode
01b - Layer Jump Mode: Unspezified
10b - Layer Jump Mode: Manual
11b - Layer Jump Mode: Regular interval recording

Ist der Wert ungleich Null, sind die Felder Next Layer Jump Address field und Last Layer Jump Address vorhanden. Das Flag Packet/Inc ist gesetzt und das Flag FP ist nicht gesetzt.

Damage Ist das Flag gesetzt und das Flag NWA_V nicht gilt der Track als wegen eines unvollständigen Schreibvorganges nicht abgeschlossen. Das Laufwerk kann eine automatische Reparatur versuchen wenn das CLOSE TRACK SESSION Command erfolgt. Ein Weiterschreiben des Tracks ist nicht möglich. Sind Damage und NWA_V gesetzt kann der Track weiter geschrieben werden. Die automatische Reparatur wird beim nächsten Schreibbefehl versucht. Wenn die Reaparatur erfolgreich ist, wird das Damage Flag entfernt. Bevor die Reparatur versucht wird, enthält das NWA Feld die Adresse des nächsten beschreibbaren Bereiches.

Copy Für CD-Medien bedeutet das Copy-Bit, dass dieser Track eine Kopie des zweiten oder höheren Generation ist. Für andere Medien ist das bit nicht gesetzt.

Track Mode Ursprünglich für CD-Medien definiert. Werte für verschiedene Medientypen:

CD-ROM/-R/-RW Definiert für Mode 1 Q Subchannel
DVD+R $07, Indiziert: Daten, schrittweise Aufzeichnung, Kopierschutz
Alle andere Medien $04, Indiziert: Daten, kontinuierliche Aufzeichnung, Kein Kopierschutz

 

Media Type RT = 0 RT = 1
CD-ROM,
DVD-ROM,
BD-ROM,
DVD-RAM,
DVD+RW,
BD-RE
Standard -
CD-R/-RW Der Track ist unsichtbar/ unvollständig. Ein PMA Eintrag wurde zur Erkennung der Start- und Endadressen des Tracks geschrieben.
DVD-R/-RW Die Rzone ist vollständig (z.B. geschlossen), unsichtbar oder unvollständig. Die Rzone ist reserviert. Sie kann entweder leer oder teilweise beschrieben sein.
DVD+R Der logische Track ist ein unsicht- bares/unvollständiges Fragment. Die Grenzen des Fragments sind inner- halb der Disk/Session Identifikation Zone definiert.
BD-R Der logische Track ist eine unsichtbare/unvollständige SRR. Der logische Track ist keine unsichtbare/unvollständige SRR.

 

Media Type Blank = 0 Blank = 1
CD-R/RW Mindestens der Track Pre-gap wurde geschrieben. Alle Sektoren innerhalb des Tracks und des Pre-gaps sind leer.
DVD-R/-RW,
DVD+R,
BD-R
Einige beschreibbare Einheiten innerhalb der logischen Tracks sind beschrieben. Alle beschreibbaren Einheiten innerhalb des logischen Tracks sind leer.
DVD-RAM,
BD-RE
Blank hat keine Bedeutung für dieses Medium. Das Bit ist immer Null.
DVD+RW Der CD-Status im Disc-Informationsblock zeigt, dass die Disk nicht leer ist. Der CD-Status im Disc-Informationsblock zeigt, dass die gesamte CD leer ist.

 

Media Type Packet/Inc = 0 Packet/Inc = 1
CD-R/RW Basiert auf vorhandenem Track-Format und Write Parameter Mode Page.
DVD-R/-RW Basiert auf vorhandenem Rzone-Format und Write Parameter Mode Page.
DVD-RAM,
DVD+R,
DVD+RW,
BD-RE
- Immer

 

Media Type FP = 0 FP = 1
CD-R/RW Basiert auf vorhandenem Track-Format und Write Parameter Mode Page.
DVD-R/-RW Basiert auf vorhandenem Rzone-Format und Write Parameter Mode Page.
DVD-RAM,
DVD+R,
DVD+RW,
BD-RE
Immer -

 
Beim Schreiben von CD und DVD-R/RW können die Parameter RT, Blanc und Packet/Inc über die Write Parameters Page gesetzt werden. Der Zustand des Tracks bestimmt welche Parameter gesetzt werden und den Parametern in der mode page entsprechen müssen.

Track Status entsprechend der RT, Blank, Packet/Inc und FP Flags:

RT Blank Packet FP DVD-R/-RW CD
Write Method Track Status Write Method Track Status
0 0 0 - DAO Vollständig Kontinuierlich/
TAO/SAO
Vollständig/
Während
TAO/SAO
0 0 1 0 Schrittweise Unvollständig oder vollständig1 Variabel Unvollständig
0 0 1 1 Eingeschränkt überschrieben Unvollständig oder vollständig2 Fest Unvollständig
0 1 0 - DAO Unsichtbar TAO/Variable/ Fest3 Unsichtbar
0 1 1 1 Eingeschränkt überschreiben Unsichtbar - Ungültig
1 0 0 - DAO Während DAO TAO Vollständig/ Während TAO
1 0 1 0 Schrittweise Teilweise beschrieben
Reserviert
Variabel Vollständig/teilweise beschrieben
Reserviert
1 0 1 1 - Ungültig Fest Vollständig/teilweise beschrieben
Reserviert
1 1 0 - DAO Leer
Reserviert
Vor Schreiben
TAO Leer
Reserviert
1 1 1 0 Schrittweise Leer
Reserviert
Variabel/Fest Leer
Reserviert

 
1 Wenn das Free Blocks Feld Null ist, ist der Track vollständig, sonst unvollständig.
2 Wenn der Track in einer Session im Zwischenzustand ist, ist der Track im unvollständigem Zustand.
3 Wenn die letzte Session leer ist, ist SAO gültig.

Data Mode gibt den Inhalt des Tracks für CD an:

Wert Definition
1 Mode 1 (ISO/IEC 10149)
2 Mode 2 (ISO/IEC 10149 oder CD-ROM XA)
$F Datenblocktyp unbekannt (Kein Track Descriptor Block)
0, 3..$E Reserviert

 
Für andere Medien ist der Wert Eins.

NWA_V Gibt an, ob das Next Writable Address Feld gültig ist. Wenn der Track nicht beschreibbar ist, ist das Flag nicht gesetzt. Wenn es eine grundlegend formatierte DVD+RW ist, ist das Flag nicht gesetzt.

LRA_V Gibt an, ob das Last Recorded Address Feld gültig ist. Das Flag wird nicht gesetzt, wenn der Track Schäden besitzt und automatisch repariert wurde.

Track Start Address Das Feld enthält die Adresse des ersten Blockes mit Benutzerinformationen für den Logical Track.

Next Writable Address Wenn sie gültig ist, gibt sie die LBA des nächsten beschreibbaren Benutzer-Blocks im Track welcher im CDB angegeben ist an.

Free Blocks Gibt die maximale Anzahl der im logischen Track zur Aufnahme zur Verfügung stehenden Nutzerdatenblöcke.

Fixed Packet Size / Blocking Factor Für CD ist die Größe nur gültig wenn die Packet und FP Flags gesetzt sind. Für DVD Medien ist der Wert 16, für BD Medien 32.

Logical Track Size Die Anzahl der Nutzerdatenblöcke im logischen Track.

Last Recorded Address Die Adresse ist für DVD-R, DVD-R DL, DVD-RW und BD-R gültig, wenn das Flag LJRS nicht gesetzt ist. Es ist die Adresse des letzten beschriebenen Nutzerdatensektors des angegebenen logischen Tracks. Der letzte geschriebene Sektor der Auffüllsektoren gelten dabei nicht.

Read Compatibility LBA Wenn die Disc eine DVD+R und der Track unsichtbar ist (d.h. RT = 0), ist dieses Feld present. Die Read Compatibility LBA ist eine Auffüllempfehlung des Laufwerkes, die verwendet wird, um einen minimalen Aufnahmeradius (28-30 mm) zu gewährleisten. Für DVD + R DL liegt die Adresse bei L0.

Next Layer Jump Address Ist die Adresse des künftigen Layer Jumps von L0 zu L1 oder L1 zu L0 der reservierten / unsichtbaren / unvollständigen Rzone des DVD-R DL Mediums. Die Adresse ist entweder die L0- oder die L1-Adresse. Wenn keine andere Schicht in der Rzone liegt, hat das Feld den Wert Null. Für leere DVD-R DL ist der Wert ebenfalls Null.

Last Layer Jump Address Ist die Adresse des letzten Layersprungs bei L0. Im Falle von DVD-R DL Medium wird nur die vorige Layer Jump Address an L0 zurückgegeben. Wenn kein Layersprung in der Rzone gefunden wurde und NWA gesetzt ist, ist das Feld auf Null gesetzt. Für DVD-R DL mit die geschlossener Rzone enthält das Feld die größte beschriebene LBA auf L0 in der geschlossenen Rzone. Wenn die Rzone unsichtbar oder unvollständig ist, berichten das Last Layer Address und die Next Layer Jump Address Felder die Informationen über den Layer Jump Block (LJB). Wenn das Feld LJRS auf 00b gesetzt ist und die Next Layer Jump Address und Last Layer Jump Address Felder nach dem Read Compatibility LBA present sind, sind diese Felder $00000000.

 

Deklarationen

 
  {
  *  Für die Auswertung.
  }
  type
    TTrackInformationBlock = record
      DataLength         : Word;
      LogicalTrackNumber : Word;
      SessionNumber      : Word;
      LJRS               : Byte;
      Damage             : Boolean;
      Copy               : Boolean;
      TrackMode          : Byte;
      RT                 : Boolean;
      Blank              : Boolean;
      PacketInc          : Boolean;
      FP                 : Boolean;
      DataMode           : Byte;
      LRA_V              : Boolean;
      NWA_V              : Boolean;
      LogTrackStartAddr  : Cardinal;
      NextWritableAddr   : Cardinal;
      FreeBlocks         : Cardinal;
      FixedPacketSize    : Cardinal;
      LogTrackSize       : Cardinal;
      LastRecordedAddr   : Cardinal;
      ReadCompLBA        : Cardinal;
      NextLayerJumpAddr  : Cardinal;
      LastLayerJumpAddr  : Cardinal;
    end;
 
  {
  *  Für den Befehl.
  }
  const
    SCSIOP_READ_TRACK_INFORMATION = $52;
 
  type
    TREAD_TRACK_INFORMATION_CDB = record
      OperationCode      : Byte;
      Open               : Byte;
      AddressNumberType  : Byte;
      LBATrackSessionNum : Byte;
      AllocationLength   : Word;
      Control            : Byte;
    end;
 
          

 

Ausführung und Auswertung

Nach dem Ausfüllen des Command Descriptors Blockes wird die Abfrage ausgeführt und die Antwort ausgewertet.

         
  function TOptDrives.ReadTrackInformation(aDevice: THandle): Boolean;
  {*******************************************************************************
  *  Die Informationen zu den Tracks ermitteln.
  }
  var
    READ_TRACK_INFO_CDB : TREAD_TRACK_INFORMATION_CDB;
    pTrackInformation   : PREAD_TRACK_INFO_DATA;
    aCDB                : Array of Byte;
    nTrackNr, i         : Integer;
    nFrom               : Integer;
    nTo                 : Integer;
  begin
    Result := False;
    {
    *  Aus der Standard Disc Information die Tracks feststellen.
    }
    nFrom := FDrive[FActive].DiscInformation.NumberOfFirstTrackOnDisc;
    nTo   := FDrive[FActive].DiscInformation.LastTrackNumberInLastSession;
    if (nFrom > 0) and (nTo > 0) and (nFrom <= nTo)
    then begin
      {
      *  Anzahl der Blöcke setzen.
      }
      SetLength(FDrive[FActive].TrackInformation, nTo - nFrom + 1);
      {
      *  Tracks abarbeiten.
      }
      for nTrackNr := nFrom to nTo
      do begin
        i := nTrackNr - nFrom;
        {
        *  Track Info initialisieren.
        }
        FillChar(FDrive[FActive].TrackInformation[i],
                 SizeOf(FDrive[FActive].TrackInformation[i]), $00);
        {
        *  Den Command Descriptor Block füllen.
        }
        ZeroMemory(@READ_TRACK_INFO_CDB, SizeOf(READ_TRACK_INFO_CDB));
        READ_TRACK_INFO_CDB.OperationCode      := SCSIOP_READ_TRACK_INFORMATION;
        READ_TRACK_INFO_CDB.Open               := 0;
        READ_TRACK_INFO_CDB.AddressNumberType  := 1;
        READ_TRACK_INFO_CDB.LBATrackSessionNum := nTrackNr;
        READ_TRACK_INFO_CDB.AllocationLength   := SizeOf(TREAD_TRACK_INFO_DATA);
        READ_TRACK_INFO_CDB.Control            := 0;
        {
        *  Den Command Descriptor Block übertragen.
        }
        SetLength(aCDB, 10);
        aCDB[0] := READ_TRACK_INFO_CDB.OperationCode;
        aCDB[1] := ((READ_TRACK_INFO_CDB.Open and $01) shl 1) or
                    (READ_TRACK_INFO_CDB.AddressNumberType and $03);
        aCDB[2] := (READ_TRACK_INFO_CDB.LBATrackSessionNum and $FF000000) shr 24;
        aCDB[3] := (READ_TRACK_INFO_CDB.LBATrackSessionNum and $00FF0000) shr 16;
        aCDB[4] := (READ_TRACK_INFO_CDB.LBATrackSessionNum and $0000FF00) shr 8;
        aCDB[5] := (READ_TRACK_INFO_CDB.LBATrackSessionNum and $000000FF);
        aCDB[7] := HiByte(READ_TRACK_INFO_CDB.AllocationLength);
        aCDB[8] := LoByte(READ_TRACK_INFO_CDB.AllocationLength);
        {
        *  Befehl ausführen.
        }
        GetMem(pTrackInformation, SizeOf(TREAD_TRACK_INFO_DATA));
        Result := GET_SCSI_PASS_THROUGH_DIRECT(aDevice, aCDB, pTrackInformation,
                                               SizeOf(TREAD_TRACK_INFO_DATA));
        if Result then
        with FDrive[FActive].TrackInformation[i]
        do begin
          DataLength := pTrackInformation[0] shl 8 or pTrackInformation[1];
          {
          *  Prüfen, ob Daten folgen.
          }
          if DataLength >= 2
          then begin
            LogicalTrackNumber       := pTrackInformation[2] or
                                        pTrackInformation[32] shl 8;
            SessionNumber            := pTrackInformation[3] or
                                        pTrackInformation[33] shl 8;
            LJRS                     := pTrackInformation[5] and $C0 shr 6;
            Damage                   := pTrackInformation[5] and $20 > 0;
            Copy                     := pTrackInformation[5] and $10 > 0;
            TrackMode                := pTrackInformation[5] and $0F;
            RT                       := pTrackInformation[6] and $80 > 0;
            Blank                    := pTrackInformation[6] and $40 > 0;
            PacketInc                := pTrackInformation[6] and $20 > 0;
            FP                       := pTrackInformation[6] and $10 > 0;
            DataMode                 := pTrackInformation[6] and $0F;
            LRA_V                    := pTrackInformation[7] and $02 > 0;
            NWA_V                    := pTrackInformation[7] and $01 > 0;
            LogicalTrackStartAddress := pTrackInformation[8] shl 24 or
                                        pTrackInformation[9] shl 16 or
                                        pTrackInformation[10] shl 8 or
                                        pTrackInformation[11];
            NextWritableAddress      := pTrackInformation[12] shl 24 or
                                        pTrackInformation[13] shl 16 or
                                        pTrackInformation[14] shl 8 or
                                        pTrackInformation[15];
            FreeBlocks               := pTrackInformation[16] shl 24 or
                                        pTrackInformation[17] shl 16 or
                                        pTrackInformation[18] shl 8 or
                                        pTrackInformation[19];
            FixedPacketSize          := pTrackInformation[20] shl 24 or
                                        pTrackInformation[21] shl 16 or
                                        pTrackInformation[22] shl 8 or
                                        pTrackInformation[23];
            LogicalTrackSize         := pTrackInformation[24] shl 24 or
                                        pTrackInformation[25] shl 16 or
                                        pTrackInformation[26] shl 8 or
                                        pTrackInformation[27];
            LastRecordedAddress      := pTrackInformation[28] shl 24 or
                                        pTrackInformation[29] shl 16 or
                                        pTrackInformation[30] shl 8 or
                                        pTrackInformation[31];
            ReadCompatibilityLBA     := pTrackInformation[36] shl 24 or
                                        pTrackInformation[37] shl 16 or
                                        pTrackInformation[38] shl 8 or
                                        pTrackInformation[39];
            NextLayerJumpAddress     := pTrackInformation[40] shl 24 or
                                        pTrackInformation[41] shl 16 or
                                        pTrackInformation[42] shl 8 or
                                        pTrackInformation[43];
            LastLayerJumpAddress     := pTrackInformation[44] shl 24 or
                                        pTrackInformation[45] shl 16 or
                                        pTrackInformation[46] shl 8 or
                                        pTrackInformation[47];
          end;
        end;
      end;
    end;
  end;
          

 

Demo, welche diese Funktion nutzt:

Track Information (podTrackInformation.7z - 294 kb) MD5 (1 kb). Stand: 23. Juli 2013

Änderungen an der Demo

Datum Beschreibung
23.07.2013Kleine Überarbeitung und neuer Name.
26.02.2012Aktualisiert: Groupbox "Optische Laufwerke".