/usr/share/doc/HOWTO/de-html/DE-SCSI-Programmierung-HOWTO-8.html is in doc-linux-de 2003.10-5.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="LinuxDoc-Tools 0.9.65">
<TITLE>Das Linux SCSI Programmier HOWTO: Inquiry Kommandobeispiel</TITLE>
<LINK HREF="DE-SCSI-Programmierung-HOWTO-9.html" REL=next>
<LINK HREF="DE-SCSI-Programmierung-HOWTO-7.html" REL=previous>
<LINK HREF="DE-SCSI-Programmierung-HOWTO.html#toc8" REL=contents>
</HEAD>
<BODY>
<A HREF="DE-SCSI-Programmierung-HOWTO-9.html"><IMG SRC="next.png" ALT="Weiter"></A>
<A HREF="DE-SCSI-Programmierung-HOWTO-7.html"><IMG SRC="prev.png" ALT="Zurück"></A>
<A HREF="DE-SCSI-Programmierung-HOWTO.html#toc8"><IMG SRC="toc.png" ALT="Inhalt"></A>
<HR>
<H2><A NAME="s8">8.</A> <A HREF="DE-SCSI-Programmierung-HOWTO.html#toc8">Inquiry Kommandobeispiel</A></H2>
<P>Eines der elementarsten SCSI-Kommandos ist das <CODE>INQUIRY</CODE> Kommando, das
zur Identifikation des SCSI-Geräts verwendet wird.
Hier ist die Definition aus der SCSI-2 Spezifikation
(weitere Details sind dem SCSI-2 Standard zu entnehmen).</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
Tabelle 44: INQUIRY Command
+=====-========-========-========-========-========-========-========-========+
| Bit| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|Byte | | | | | | | | |
|=====+=======================================================================|
| 0 | Operation Code (12h) |
|-----+-----------------------------------------------------------------------|
| 1 | Logical Unit Number | Reserved | EVPD |
|-----+-----------------------------------------------------------------------|
| 2 | Page Code |
|-----+-----------------------------------------------------------------------|
| 3 | Reserved |
|-----+-----------------------------------------------------------------------|
| 4 | Allocation Length |
|-----+-----------------------------------------------------------------------|
| 5 | Control |
+=============================================================================+
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>Die Ausgabedaten sind dann wie folgt:
<BLOCKQUOTE><CODE>
<PRE>
Tabelle 45: Standard INQUIRY Data Format
+=====-========-========-========-========-========-========-========-========+
| Bit| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|Byte | | | | | | | | |
|=====+==========================+============================================|
| 0 | Peripheral Qualifier | Peripheral Device Type |
|-----+-----------------------------------------------------------------------|
| 1 | RMB | Device-Type Modifier |
|-----+-----------------------------------------------------------------------|
| 2 | ISO Version | ECMA Version | ANSI-Approved Version |
|-----+-----------------+-----------------------------------------------------|
| 3 | AENC | TrmIOP | Reserved | Response Data Format |
|-----+-----------------------------------------------------------------------|
| 4 | Additional Length (n-4) |
|-----+-----------------------------------------------------------------------|
| 5 | Reserved |
|-----+-----------------------------------------------------------------------|
| 6 | Reserved |
|-----+-----------------------------------------------------------------------|
| 7 | RelAdr | WBus32 | WBus16 | Sync | Linked |Reserved| CmdQue | SftRe |
|-----+-----------------------------------------------------------------------|
| 8 | (MSB) |
|- - -+--- Vendor Identification ---|
| 15 | (LSB) |
|-----+-----------------------------------------------------------------------|
| 16 | (MSB) |
|- - -+--- Product Identification ---|
| 31 | (LSB) |
|-----+-----------------------------------------------------------------------|
| 32 | (MSB) |
|- - -+--- Product Revision Level ---|
| 35 | (LSB) |
|-----+-----------------------------------------------------------------------|
| 36 | |
|- - -+--- Vendor Specific ---|
| 55 | |
|-----+-----------------------------------------------------------------------|
| 56 | |
|- - -+--- Reserved ---|
| 95 | |
|=====+=======================================================================|
| | Vendor-Specific Parameters |
|=====+=======================================================================|
| 96 | |
|- - -+--- Vendor Specific ---|
| n | |
+=============================================================================+
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>Das folgende Beispiel benutzt die Lowlevel-Funktion <CODE>handle_SCSI_cmd</CODE> zum
Abschicken des Inquiry SCSI Kommandos.</P>
<P>Zuerst hängen wir den Kommandoblock an den generischen Header, dann rufen
wir <CODE>handle_SCSI_cmd</CODE> auf. Bitte beachte, daß der Parameter für
die Größe
des Ausgabepuffers die Kopfstrukturgröße nicht beinhaltet. Nach
Abarbeitung
des Kommandos enthält der Ausgabepuffer die angeforderte Information, falls
kein Fehler vorlag.</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
#define INQUIRY_CMD 0x12
#define INQUIRY_CMDLEN 6
#define INQUIRY_REPLY_LEN 96
#define INQUIRY_VENDOR 8 /* Versatz zum Herstellernamen im Antwortblock */
/* Herstellernamen und Typ anfordern */
static unsigned char *Inquiry ( void )
{
unsigned char Inqbuffer[ SCSI_OFF + INQUIRY_REPLY_LEN ];
unsigned char cmdblk [ INQUIRY_CMDLEN ] =
{ INQUIRY_CMD, /* Kommando */
0, /* lun/reserviert */
0, /* page code */
0, /* reserviert */
INQUIRY_REPLY_LEN, /* Allokationslänge */
0 };/* reserviert/flag/link */
memcpy( cmd + SCSI_OFF, cmdblk, sizeof(cmdblk) );
/*
* +------------------+
* | struct sg_header | <- cmd
* +------------------+
* | Kopie von cmdblk | <- cmd + SCSI_OFF
* +------------------+
*/
if (handle_SCSI_cmd(sizeof(cmdblk), 0, cmd,
sizeof(Inqbuffer) - SCSI_OFF, Inqbuffer )) {
fprintf( stderr, "Inquiry scheiterte\n" );
exit(2);
}
return (Inqbuffer + SCSI_OFF);
}
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>Das oben angegebene Beispiel hält sich an diese Struktur.
Die Inquiry-Funktion kopiert ihren Kommandoblock hinter den
generischen Kopf (durch <CODE>SCSI_OFF</CODE> gegeben). Dieser Befehl
hat keine weiteren Daten zu übergeben.
Funktion <CODE>Handle_SCSI_cmd</CODE> erzeugt daraus die Kopfstruktur.</P>
<P>Um das Beispiel vollständig zu machen, implementieren wir nun noch
die Funktion <CODE>main</CODE>.</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
int main( void )
{
fd = open(DEVICE, O_RDWR);
if (fd < 0) {
fprintf( stderr, "Lese-Schreiberlaubnis erforderlich für "DEVICE".\n"
);
exit(1);
}
/* ein paar Felder des Inquiry-Ergebnisses ausgeben */
printf( "%s\n", Inquiry() + INQUIRY_VENDOR );
return 0;
}
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>Zuerst öffnen wir das Gerät, prüfen auf Fehler und rufen dann das
Unterprogramm Inquiry auf. Die Ergebnisse Hersteller, Produkt und Version
werden schließlich in lesbarer Form ausgegeben.</P>
<P>Hinweis: Der Inquiry-Befehl liefert noch weitere Informationen, mehr als
diese kleine Programm ausgibt. Vielleicht möchtest Du es so erweitern,
daß Gerätetyp, ANSI-Version usw. behandelt werden.
Der Gerätetyp ist zum Beispiel von besonderer Bedeutung, da er für
das Gerät
den festen (minimalen) und erweiterten Befehlsumfang festlegt.
Wenn Du das nicht selbst programmieren möchtest, gibt es auch noch das
Programm scsiinfo von Eric Youngdale. Es liefert nahezu alle Angaben zu
einem SCSI-Gerät. Du findest es per FTP unter:</P>
<P>
<BLOCKQUOTE><CODE>
<A HREF="ftp://tsx-11.mit.edu/pub/Linux/ALPHA/scsi">tsx-11.mit.edu:/pub/Linux/ALPHA/scsi</A></CODE></BLOCKQUOTE>
</P>
<HR>
<A HREF="DE-SCSI-Programmierung-HOWTO-9.html"><IMG SRC="next.png" ALT="Weiter"></A>
<A HREF="DE-SCSI-Programmierung-HOWTO-7.html"><IMG SRC="prev.png" ALT="Zurück"></A>
<A HREF="DE-SCSI-Programmierung-HOWTO.html#toc8"><IMG SRC="toc.png" ALT="Inhalt"></A>
</BODY>
</HTML>
|