Projekte > Optische Laufwerke > Hardware

Geräteinformationen

INQUIRY Command - Operation Code $12

Mit dem INQUIRY Command - Operation Code $12 werden die Informationen zur Identififizierung des Laufwerks ermittelt. Das Command ist mit dem Core Feature verbunden. Das Command ist in Multi-Media Commands - 6 Kapitel 6.8 erwähnt und wird in den SCSI Primary Commands- 3 (SPC-3) beschrieben. Nach T10 ist Revision 23 vom 4. Mai 2005 aktuell. Dort ist es in Kapitel 6.4 (Seite 142) beschrieben. Im Kapitel Ermittlung der Laufwerke - SCSI Pass Through Interface wird der Operation Code bereits verwendet.

Der INQUIRY Command Descriptor Block:

  7 6 5 4 3 2 1 0
0 Operation Code = $12
1 Reserviert Obsolete EVPD
2 PAGE CODE
3 ALLOCATION LENGTH
4
5 Control

 

Die Werte:

Byte 0: Operation Code - $12

Byte 1: EVPD - 0b Standardinformationen. Mit 1b sollen sich Vital Product Data Informationen abrufen lassen. Dies hat bei meinen Laufwerken jedoch nicht funktioniert.

Byte 2: PAGE CODE - $00 Wird nur gesetzt, wenn EVPD 1b ist.

Byte 3 und 4: Länge der Antwortstruktur - Wenn EVPD 0b ist, muss sie mindestens fünf sein, weil im fünften Byte die Länge der Antwortstruktur angegeben ist. DeviceIoControl schlägt jedoch fehl, wenn die Antwortstruktur zu klein ist und/oder zu klein angegeben wird.

Byte 5: Control - ?

 

Die Standardantwortstruktur:

Diese Struktur soll mindestens 36 Byte enthalten. Ein Maximum scheint nicht vorgesehen zu sein.

  7 6 5 4 3 2 1 0
0 Peripheral Qualifier Peripheral Device Type
1 RMB Reserviert
2 Version
3 Obsolete Obsolete NormACA HiSup Response Data Format
4 Additional Length (n-4)
5 SCCS ACC TPGS 3ps Reserviert Protect
6 BQue EncServ VS MultiP MChngr Obsolete Obsolete Addr16a
7 Obsolete Obsolete Wbus16a Synca Linked Obsolete CmdQue VS
8 T10 Vendor Identification
15
16 Product Identification
31
32 Product Revision Level
35
36 Vendor specific
55
56 Reserviert Clockinga Qasa Iusa
57 Reserviert
58 Version Descriptor 1
59
  .
.
.
72 Version Descriptor 8
73
74 Reserviert
95
96 Vendor specific
n
a Die Bedeutungen dieser Felder sind zu SPI-5 spezifisch. Für SCSI Übertragungsprotokolle mit Ausnahme des SCSI Parallel Interface sind diese Felder reserviert.

 

Peripheral Qualifier - Peripheriebezeichner

Bezeichner Beschreibung
000b Ein Peripheriegerät, das den angegebenen Gerätetyp besitzt, wird mit der logischen Einheit verbunden. Wenn der Geräteserver nicht in der Lage ist festzustellen, ob ein Peripheriegerät angeschlossen ist, muss er diesen Peripheriebezeichner verwenden. Dieser Peripheriekennzeichner bedeutet nicht, dass das mit der logischen Einheit verbundene Peripheriegerät zum Zugang bereit ist.
001b Ein Peripheriegerät, welches den angegebenen Peripheriegerätetyp besitzt, wird nicht mit dieser logischen Einheit verbunden. Jedoch ist der Geräteserver fähig, den angegebenen Peripheriegerätetyp auf dieser logischen Einheit zu unterstützen.
010b Reserviert
011b Der Geräteserver ist nicht dazu fähig, ein Peripheriegerät auf dieser logischen Einheit zu unterstützen. Für diesen Peripheriebezeichner soll der Peripheriegerätetyp auf 1Fh gesetzt werden. Alle anderen Peripheriegerätetyp-Werte werden für diesen Peripheriebezeichner reserviert.
100b - 111b Herstellerspezifisch

 

Peripheral Device Type

Code Dokumenta Beschreibung
$00 SBC-2 Gerät für den direkten Zugriff (zB Festplatten)
$01 SSC-2 Gerät für den sequentiellen Zugriff (zB Magnetbandgerät)
$02 SSC Drucker
$03 SPC-2 Prozessor
$04 SBC Einmalbeschreibbare Geräte (zB einige optische Laufwerke)
$05 MMC-4 CD/DVD-Geräte
$06   Scanner (veraltet)
$07 SBC Optische Speichergeräte (zB einige optische Laufwerke)
$08 SMC-2 Medienwechselgeräte (zB Jukeboxen)
$09   Kommunikationgerät (veraltet)
$0A - $0B   Veraltet
$0C SCC-2 Speicherverbundkontrollgerät (zB RAID)
$0D SES Enclosure services device
$0E RBC Vereinfachte Geräte für den direkten Zugriff (zB Disketten- laufwerke)
$0F OCRW Optisches Kartenlese-/-schreibegerät
$10 BCC Bridge Controller Commands
$11 OSD Objektbasiertes Speichergerät
$12 ADC Automation/Drive Interface
$13 - $1D   Reserviert
$1E   Weithin bekannte logische Einheiten b
$1F   Unbekannte oder kein Gerätetyp

 

a Alle Standards sind der Revision unterworfen, und Parteien der auf diesem Standard basierenden Verträge werden dazu aufgerufen, die Möglichkeit zu untersuchen, die neusten Ausgaben der verzeichneten Standards anzuwenden.

b Alle weithin bekannte logischen Einheiten nutzen den selben Peripheriegerätetypcode.

RMB - Removable Medium Bit
Ist das Bit auf Null gesetzt, ist das Medium nicht austauschbar.

Version - Zeigt an, welchem Standard das Gerät folgt.

Code Beschreibung
$00 Das Gerät erhebt keinen Anspruch auf Konformität mit jedem Standard.
$01 Veraltet (SCSI=001b)
$02 Veraltet
$03 Das Gerät entspricht den ANSI INCITS 301-1997 (SPC).
$04 Das Gerät entspricht den ANSI INCITS 351-2001 (SPC-2).
$05 Das Gerät entspricht den ANSI INCITS 408-2005 (SPC-3).
$06 - $07 Reserviert
$08 - $0C Veraltet (ECMA=001b)
$0D - $3F Reserviert
$40 - $44 Veraltet (ISO=01b)
$45 - $47 Reserviert
$48 - $4C Veraltet (ISO=01b & ECMA=001b)
$4D - $7F Reserviert
$80 - $84 Veraltet (ISO=10b)
$85 - $87 Reserviert
$88 - $8C Veraltet (ECMA=001b)
$8D - $FF Reserviert

 

NormACA
Gibt an, ob NormalACA (SAM-3) unterstützt wird.

HiSup
Gibt an, ob ein hierarchisches Adressierungmodell, um LUNs logischen Einheiten zuzuteilen, unterstützt wird.

Response Data Format
Das Format der aktuellen SPC-3 Revision hat den Wert 2. Kleinere Werte sind veraltet, höhere reserveriert.

Additional Length (n-4)
Gibt die Länge der Daten ab diesem Datenfeld an. Wurde im INQUIRY Command Descriptor Block für ALLOCATION LENGTH ein kleinerer Wert als Additional Length - 4 ist das tatsächliche Länge geringer. Allerdings muss die Antwortstruktur so groß sein, dass alle Daten hineinpassen.

SCCS embedded storage array controller component support
Gibt an, ob das SCSI Zielgerät eine Speicherverbundkontrollgerätkomponente unterstützt.

ACC - Access Controls Coordinator
Gibt an, ob das SCSI Zielgerät einen Zugriffssteuerungskoordinator unterstützt.

TPGS - target port group support

Code Beschreibung
00b Das SCSI-Zielgerät unterstützt keinen asymmetrischen logischen Unit Zugang oder unterstützt eine Form des asymmetrischen Zugangs des Herstellers. Weder die REPORT TARGET GROUPS noch die SET TARGET GROUPS Befehle werden unterstützt.
01b Nur impliziter asymmetrischer logischer Unit Zugang wird unterstützt. Das SCSI Zielgerät ist in der Lage den asymmetrischen Zugriffsstatus ohne SET TARGET PORT GROUPS Befehl zu ändern. Der REPORT TARGET PORT GROUPS Befehl wird unterstützt und der SET TARGET PORT GROUPS Befehl wird nicht unterstützt.
10b Nur explizit asymmetrischer logischer Unit Zugang wird unterstützt. Das SCSI-Zielgerät ändert den asymmetrische Zugriffsstatus nur auf Anforderung mit dem SET TARGET PORT GROUPS Befehl. Sowohl der REPORT TARGET PORT GROUPS Befehl als auch der SET TARGET PORT GROUPS Befehl werden unterstützt.
11b Sowohl expliziter als auch impliziter asymmetrischer logischer Unit Zugang wird unterstützt. Sowohl der REPORT TARGET PORT GROUPS Befehl als auch die SET TARGET PORT GROUPS Befehle werden unterstützt.

 
3ps - Third-Party Copy
Gibt an, ob das SCSI Zielgerät third-party copy Befehle unterstützt.

Protect
Gibt an, ob das SCSI Zielgerät Protection Informationen unterstützt.

BQue und CmdQue
Geben an, ob die logische Einheit das volle Aufgabenverwaltungsmodell (SAM-3) oder das grundlegende Aufgabenverwaltungsmodell unterstützen.

BQUE CMDQUE Beschreibung
0 0 Veraltet
0 1 Volles Aufgabenverwaltungsmodell wird unterstützt.
1 0 Grundlegendes Aufgabenverwaltungsmodell wird unterstützt.
1 1 Verbotene Kombination von BQUE und CMDQUE.

 

EncServ - Enclosure Services
Gibt an, ob das SCSI Zielgerät eine embedded enclosure services(?) Komponente enthält.

MultiP - Multi Port
Gibt an, ob es ein Multiport SCSI Zielgerät (zwei oder mehr Ports) ist und den SCSI Multiport- geräteanforderungen in den einschlägigen Normen (zB SAM-3) entspricht.

MChngr - Medium Changer
Gibt an, ob das SCSI Zielgerät Befehl zur Steuerung eines angeschlossenen Medienwechslers unterstützt. Das Bit ist nur gültig, wenn das Gerät austauschbare Medien unterstützt (RMB gesetzt).

Linked
Gibt an, ob der Geräteserver linked command unterstützt (Siehe SAM-3).

T10 Vendor Identification
Das T10 VENDOR IDENTIFICATION Feld enthält acht Byte mit linksbündigen ASCII Zeichen zur Idenitfikation des Herstellers. Die Kennung soll der durch die INCITS zugeteilten entsprechen. Eine Liste ist in SPC-3 Anhang E und auf der Seite T10 Vendor ID Strings verfügbar.

Product Identification
Das PRODUCT IDENTIFICATION Feld enthält sechzehn Byte mit linksbündigen ASCII Zeichen, welche durch den Hersteller definiert sind. Die Zeichen sind druckbare Zeichen im Bereich von $20 bis $7E. Das Feld wird mit dem Wert $00 abgeschlossen. Ungenutzte Zeichen werden mit $20 aufgefüllt.

Product Revision Level
Das PRODUCT REVISION LEVEL Feld enthält fünf Byte mit linksbündigen ASCII Zeichen, welche durch den Hersteller definiert sind.

Version Descriptor 1 - 8
Die VERSION DESCRIPTOR Felder erlauben die Identfizierung von bis zu acht Standards, zu welchen das SCSI Zielgerät Übereinstimmung fordert. Eine alphabetisch sortierte Liste ist in SPC-3 Tabelle 87 und auf der Seite SPC-3 Standards/Versions Descriptor Codes verfügbar. Eine nummerisch sortierte Liste ist in SPC-6 Anhang D.8 (Tabelle D.14).

 

Deklarationen

Da die Antwortstruktur nicht direkt ausgewertet werden kann, werden zwei Antwortstrukturen deklariert. Eine für die Antwort auf die Abfrage, welche dann in die zweite übertragen wird.

 
  {
  *  Für den Befehl:
  }
 
  const
    SCSIOP_INQUIRY = $12;
 
  type
    TSCSI_INQUIRY_CDB = record
      OperationCode    : Byte;
      EVPD             : Byte;
      PageCode         : Byte;
      AllocationLength : Word;
      Control          : Byte;
    end;
 
  type
    TINQUIRY_STANDARD_DATA = record
      Peripheral_Qual_DevType : Byte;
      RMB_Reserved0           : Byte;
      Version                 : Byte;
      NACA_HiSup_ResDataFrmt  : Byte;
      AdditionalLength        : Byte;
      Data0                   : Array[5..7] of Byte;
      T10VendorIdentification : Array[0..7] of Char;
      ProductIdentification   : Array[0..15] of Char;
      ProductRevisionLevel    : Array[0..3] of Char;
      VendorSpecific0         : Array[0..19] of Char;
      Data1                   : Byte;
      Reserved1               : Byte;
      VersionDescriptor       : Array[1..8]  of Word;
      Reserved2               : Array[0..20] of Byte;
      VendorSpecific1         : Array[0..3] of Byte;
    end;
 
  {
  *  Für die Auswertung:
  }
 
  type
    TDeviceInfo = record
      Peripheral_Qualifier    : Byte;
      Peripheral_DevType      : Byte;
      Removable_Medium        : Boolean;
      Version                 : Byte;
      NormACA                 : Boolean;
      HiSup                   : Boolean;
      ResDataFrmt             : Byte;
      SCCS                    : Boolean;
      ACC                     : Boolean;
      TPGS                    : Byte;
      Thirdps                 : Boolean;
      Protect                 : Boolean;
      BQue                    : Boolean;
      EncServ                 : Boolean;
      MultiP                  : Boolean;
      MChngr                  : Boolean;
      Addr16                  : Boolean;
      Wbus16                  : Boolean;
      Sync                    : Boolean;
      Linked                  : Boolean;
      CmdQue                  : Boolean;
      T10VendorIdentification : AnsiString;
      ProductIdentification   : AnsiString;
      ProductRevisionLevel    : AnsiString;
      VendorSpecific0         : AnsiString;
      Clocking                : Byte;
      Qas                     : Boolean;
      Ius                     : Boolean;
      VersionDescriptor       : Array[1..8] of Word;
    end;
 
          

 

Ausführung

Nach der Ausführung wird die Antwortstruktur ausgewertet.

 
  function TOptDrives.ReadInquiry(aDevice: THandle): Boolean;
  {*******************************************************************************
  *  Inquiry Command
  }
  var
    SCSI_INQUIRY_CDB : TSCSI_INQUIRY_CDB;
    pInquiryData     : pINQUIRY_STANDARD_DATA;
    aCDB             : Array of Byte;
    i                : Integer;
  begin
    Result := False;
     {
    *  Das übergebene Handle auf Gültigkeit prüfen.
    }
    if aDevice <> INVALID_HANDLE_VALUE
    then begin
      {
      *  Den Command Descriptor Block füllen.
      }
      ZeroMemory(@SCSI_INQUIRY_CDB, SizeOf(SCSI_INQUIRY_CDB));
      SCSI_INQUIRY_CDB.OperationCode    := SCSIOP_INQUIRY;
      SCSI_INQUIRY_CDB.AllocationLength := SizeOf(TINQUIRY_STANDARD_DATA);
      {
      *  Den Command Descriptor Block übertragen.
      }
      SetLength(aCDB, CDB6GENERIC_LENGTH);
      aCDB[0] := SCSI_INQUIRY_CDB.OperationCode;
      aCDB[1] := SCSI_INQUIRY_CDB.EVPD;
      aCDB[2] := SCSI_INQUIRY_CDB.PageCode;
      aCDB[3] := HiByte(SCSI_INQUIRY_CDB.AllocationLength);
      aCDB[4] := LoByte(SCSI_INQUIRY_CDB.AllocationLength);
      aCDB[5] := SCSI_INQUIRY_CDB.Control;
      {
      *  Befehl ausführen. Manchmal ist es notwendig, den Speicher anzufordern.
      }
      GetMem(pInquiryData, SizeOf(TINQUIRY_STANDARD_DATA));
      Result := GET_SCSI_PASS_THROUGH_DIRECT(aDevice, aCDB, pInquiryData,
                                             SizeOf(TINQUIRY_STANDARD_DATA));
      if Result then
      with fDrive[fActive].DeviceInfo
      do begin
        Peripheral_Qualifier    := pInquiryData.Peripheral_Qual_DevType shr 5;
        Peripheral_DevType      := pInquiryData.Peripheral_Qual_DevType and $1F;
        Removable_Medium        := pInquiryData.RMB_Reserved0 and $80 > 0;
        Version                 := pInquiryData.Version;
        NormACA                 := pInquiryData.NACA_HiSup_ResDataFrmt and $20 > 0;
        HiSup                   := pInquiryData.NACA_HiSup_ResDataFrmt and $10 > 0;
        ResDataFrmt             := pInquiryData.NACA_HiSup_ResDataFrmt and $0F;
        SCCS                    := pInquiryData.Data0[5] and $80 > 0;
        ACC                     := pInquiryData.Data0[5] and $40 > 0;
        TPGS                    := pInquiryData.Data0[5] and $30 shr 4;
        Thirdps                 := pInquiryData.Data0[5] and $08 > 0;
        Protect                 := pInquiryData.Data0[5] and $01 > 0;
        BQue                    := pInquiryData.Data0[6] and $80 > 0;
        EncServ                 := pInquiryData.Data0[6] and $40 > 0;
        MultiP                  := pInquiryData.Data0[6] and $10 > 0;
        MChngr                  := pInquiryData.Data0[6] and $08 > 0;
        Addr16                  := pInquiryData.Data0[6] and $01 > 0;
        Wbus16                  := pInquiryData.Data0[7] and $20 > 0;
        Sync                    := pInquiryData.Data0[7] and $10 > 0;
        Linked                  := pInquiryData.Data0[7] and $08 > 0;
        CmdQue                  := pInquiryData.Data0[7] and $02 > 0;
        T10VendorIdentification := Trim(pInquiryData.T10VendorIdentification);
        ProductIdentification   := Trim(pInquiryData.ProductIdentification);
        ProductRevisionLevel    := Trim(pInquiryData.ProductRevisionLevel);
        VendorSpecific0         := Trim(pInquiryData.VendorSpecific0);
        Clocking                := pInquiryData.Data1 and $0C shr 2;
        Qas                     := pInquiryData.Data1 and $02 > 0;
        Ius                     := pInquiryData.Data1 and $01 > 0;
        for i := 1 to 8
        do VersionDescriptor[i] := pInquiryData.VersionDescriptor[i];
      end;
      FreeMem(pInquiryData);
    end;
  end;
          

 

Demo, welche diese Funktion nutzt:

Inquiry (podInquiry.7z - 292 kb) MD5 (1 kb). Stand: 30. Juni 2013

Der Download enthält auch die vendorid.txt 4. Juni 2013 und die stds.txt vom 21. März 2013.

Hinweis: Bei mir wird ein nicht vorhandener Version Descriptor angezeigt, wenn die stds.txt geladen wird. Sieht nach einem Speicherproblem aus.

Änderungen an der Demo

Datum Beschreibung
30.06.2013Kleine Überarbeitung und neuer Name.
10.04.2013Überarbeitung. vendorid.txt und stds.txt aktualisert.
07.01.2012Wegen der Ausrichtung der Bytes im Word müssen diese bei der Auswertung der Version Descriptors getauscht werden.