Pilote de périphérique du client de stockage de masse USB

Objectif

Prend en charge le protocole USB (Universal Serial Bus) pour le stockage de masse et le disque dur de type bloc, les unités de disque amovible (RDX), les unités flash, les CD-ROM, les DVD-RAM, les disques Blu-ray en lecture seule et les unités de mémoire optique en lecture / écriture.

Syntaxe

#include <sys/devinfo.h>
#include <sys/scsi.h>
#include <sys/scdisk.h>
#include <sys/ide.h>
#include <sys/usb.h>
#include <sys/usbdi.h>
#include <sys/mstor.h>

Descriptif

Les opérations classiques d'unité de disque dur USB, de RDX, de clés USB, de CD-ROM, de DVD-RAM, de lecture seule Blu-ray et d'unité optique en lecture / écriture sont implémentées à l'aide des sous-routines open, close, read, writeet ioctl .

Sous-programmes dépendant de l'unité

Le pilote de périphérique de stockage de masse USB prend en charge uniquement les sous-routines open, close, ioctlet config .

Sous-routines ouvertes et proches

La sous-routine openx est principalement utilisée par les commandes et les utilitaires de diagnostic. Vous devez disposer des droits appropriés pour exécuter le sous-programme. Si vous exécutez leopen sous-programme sans l’autorité requise, le sous-programme renvoie une valeur de-1 et définit le numéro d'erreur variable globale à une valeur deEPERM .

Le paramètre Ext spécifié dans la sous-routine Openx sélectionne l'opération à utiliser pour l'unité cible. Le fichier /usr/include/sys/usb.h définit les valeurs possibles pour le paramètre ext .

Le paramètre Ext peut contenir n'importe quelle combinaison logique des valeurs d'indicateur suivantes:

Article Descriptif
SC_DIAGNOSTIC Place le périphérique sélectionné en mode Diagnostic . Ce mode est singulièrement entrant, ce qui signifie qu'un seul processus à la fois peut ouvrir l'unité à la fois. Lorsqu'une unité est en mode Diagnostic , les unités USB sont initialisées lors des opérations open ou close et la consignation des erreurs est désactivée. En mode Diagnostic , seules les opérations de sous-routine close et ioctl sont acceptées. Tous les autres sous-programmes pris en charge par le périphérique renvoient une valeur de-1 et réglez le numéro d'erreur variable globale à une valeur deEACCES .

Une unité peut être ouverte en mode Diagnostic uniquement si l'unité cible n'est pas ouverte actuellement. Si vous ouvrez un appareil dans leDiagnostic mode lorsque le périphérique cible est déjà ouvert, le sous-programme renvoie une valeur de-1 et définit le numéro d'erreur variable globale à une valeur deEACCES .

SC_UNIQUE Place le périphérique sélectionné en mode Exclusive Access . Un seul processus peut ouvrir un périphérique en mode Exclusive Access à la fois.

Un périphérique ne peut être ouvert en mode Exclusive Access que s'il n'est pas actuellement ouvert. Si vous ouvrez un appareil dans leExclusive Access mode et que l'appareil est déjà ouvert, le sous-programme renvoie une valeur de-1 et définit le numéro d'erreur variable globale à une valeur deEBUSY . Si l'indicateur SC_DIAGNOSTIC est spécifié avec l'indicateur SC_SINGLE , l'unité est placée en mode Diagnostic .

Sous-routines readx et writex

Les sous-routines readx et writex ne sont pas prises en charge sur les périphériques USB. Même s'ils sont appelés, le paramètre ext n'est pas traité.

Sous-routine ioctl

Les opérations de sous-routine ioctl utilisées pour le pilote de périphérique usbcd sont spécifiques aux catégories suivantes de périphériques USB:
  • Opérations ioctl communes pour tous les périphériques USB
  • Disque dur USB, unité flash et unités RDX
  • Périphériques optiques de CD-ROM et de lecture / écriture USB

Opérations ioctl communes prises en charge pour tous les périphériques USB

Les opérations ioctl suivantes sont disponibles pour le disque dur, l'unité flash, RDX, le CD-ROM et les unités optiques en lecture / écriture:

Opération Descriptif
DKIORDSE Emet une commande de lecture sur l'unité et obtient les données de détection de l'unité cible lorsqu'une erreur se produit. Si laDKIORDSE l'opération renvoie une valeur de-1 et si lestatus_validity le champ est défini sur leSC_SCSI_ERROR valeur, des données de détection valides sont renvoyées. Sinon, les données de détection cible sont omises.

L'opération DKIORDSE est fournie à des fins de diagnostic. Il permet l'utilisation limitée de l'unité cible lors de son fonctionnement dans un environnement système actif. Le paramètre arg de l'opération DKIORDSE contient l'adresse d'une structure sc_rdwrt . Cette structure est définie dans le fichier /usr/include/sys/scsi.h .

La structure devinfo définit la taille de transfert maximale pour une opération de lecture. Si vous transférez plus que la limite maximale, le sous-programme renvoie une valeur de-1 et définit le numéro d'erreur variable globale à une valeur deEINVAL .

Remarque: l'opération CDIORDSE peut être remplacée par l'opération DKIORDSE lorsque la commande de lecture est émise pour obtenir des données d'analyse à partir d'une unité de CD-ROM. L'opération DKIORDSE est l'opération recommandée.
DKIOCMD Lorsque l'unité est correctement ouverte en mode Normal ou Diagnostic , l'opération DKIOCMD peut exécuter n'importe quelle commande SCSI (Small Computer System Interface) sur l'unité spécifiée. Le pilote de périphérique ne consigne pas de reprise d'erreur ou d'échec de cette opération.

L'octet de statut SCSI et les octets de statut de l'adaptateur sont renvoyés via le paramètre arg qui contient l'adresse d'une structure sc_iocmd , qui est définie dans le fichier /usr/include/sys/scsi.h . Si laDKIOCMD L'opération échoue, le sous-programme renvoie une valeur de-1 et définit le numéro d'erreur variable globale à une valeur non nulle. Dans ce cas, l'appelant doit évaluer les octets d'état renvoyés pour déterminer la cause de l'échec de l'opération et les actions de reprise.

La structure devinfo définit la taille de transfert maximale pour la commande. Si vous transférez plus que la valeur maximale, le sous-programme renvoie une valeur de-1 et définit le numéro d'erreur variable globale à une valeur deEINVAL .

DKIOCMD (suite) L'exemple de code suivant émet l'opération DKIOCMD ioctl sur l'unité usbms0 pour obtenir les données d'interrogation standard SCSI:
    char sense_data[255];
    char *data_buffer=NULL;
    struct sc_iocmd sciocmd;
....

    fd = open("/dev/usbms0", O_RDWR);
    if (fd == -1){
        printf("\niocmd: Open FAIL\n");
        exit(-1);
    }

    memset(&sciocmd, '\0', sizeof(struct scsi_iocmd));
    sciocmd.version = SCSI_VERSION_1;
    sciocmd.timeout_value = 30;
    sciocmd.command_length = 6;
    sciocmd.flags = B_READ;
    sciocmd.autosense_length = 255;
    sciocmd.autosense_buffer_ptr = &sense_data[0];

    sciocmd.data_length = 0xFF;
    sciocmd.buffer = inq_data;
    sciocmd.scsi_cdb[0] = SCSI_INQUIRY;
    sciocmd.scsi_cdb[1] = 0x00; /* Standard Inquiry*/
    sciocmd.scsi_cdb[2] = 0x00;
    sciocmd.scsi_cdb[3] = 0x00;
    sciocmd.scsi_cdb[4] = 0xFF;
    sciocmd.scsi_cdb[5] = 0x00;

    if ((rc=ioctl(fd, DKIOCMD, &sciocmd)) != 0){
        printf("iocmd: Ioctl FAIL errno %d\n",errno);
        printf("status_validity: %x, scsi_status: %x, adapter_status:%x\n",
               sciocmd.status_validity, sciocmd.scsi_bus_status,
               sciocmd.adapter_status);
        hexdump(sense_data, (long)20);
        close(fd);
        exit(-1);
    } else {
        printf("cdiocmd : Ioctl PASS\n");
        if (cmd = SCSI_INQUIRY)
            hexdump(inq_data,0x20);
    }

    close(fd);
DKIOLCMD Lorsque l'unité est correctement ouverte en mode Normal ou Diagnostic , l'opération DKIOLCMD peut exécuter n'importe quelle commande SCSI sur l'unité spécifiée. Le pilote de périphérique ne consigne aucune erreur de récupération d'erreur de cette opération.

Cette opération ioctl est similaire à l'opération DKIOCMD16 qui est utilisée pour émettre des commandes SCSI de 16 octets vers l'unité de stockage de masse USB.

L'octet de statut SCSI et les octets de statut de l'adaptateur sont renvoyés via le paramètre arg qui contient l'adresse d'une structure sc_iocmd16cdb . Cette structure est définie dans le fichier /usr/include/sys/scsi.h . Si laDKIOLCMD L'opération échoue, le sous-programme renvoie une valeur de-1 et définit le numéro d'erreur variable globale à une valeur non nulle. Dans ce cas, l'appelant doit évaluer les octets d'état renvoyés pour déterminer la cause de l'échec de l'opération et les actions de reprise.

A la fin de la demande DKIOLCMD ioctl , la zone résiduelle indique les données restantes que le périphérique n'a pas entièrement satisfait pour cette demande. En cas d'achèvement réussi, la zone résiduelle indique que l'unité ne dispose pas de toutes les données demandées ou que l'unité dispose de moins de données que celles demandées. En cas d'échec d'une demande, vous devez vérifier la zone status_validity pour déterminer s'il existe un problème de bus SCSI valide. Dans ce cas, la zone résiduelle indique le nombre d'octets que l'unité n'a pas pu remplir pour cette demande.

La structure devinfo définit la taille de transfert maximale pour la commande. Si vous transférez plus que la valeur maximale, le sous-programme renvoie une valeur de-1 et définit le numéro d'erreur variable globale à une valeur deEINVAL .

DKIOLCMD (suite) L'exemple de code suivant émet l'opération DKIOLCMD ioctl sur l'unité usbms0 pour obtenir les données d'interrogation standard SCSI:
    char sense_data[255];
    char *data_buffer=NULL;
    struct sc_iocmd16cdb sciocmd;
....

    fd = open("/dev/usbms0", O_RDWR);
    if (fd == -1){
        printf("\niocmd: Open FAIL\n");
        exit(-1);
    }

    memset(&sciocmd, '\0', sizeof(struct scsi_iocmd));
    sciocmd.version = SCSI_VERSION_1;
    sciocmd.timeout_value = 30;
    sciocmd.command_length = 6;
    sciocmd.flags = B_READ;
    sciocmd.autosense_length = 255;
    sciocmd.autosense_buffer_ptr = &sense_data[0];

    sciocmd.data_length = 0xFF;
    sciocmd.buffer = inq_data;
    sciocmd.scsi_cdb[0] = SCSI_INQUIRY;
    sciocmd.scsi_cdb[1] = 0x00; /* Standard Inquiry*/
    sciocmd.scsi_cdb[2] = 0x00;
    sciocmd.scsi_cdb[3] = 0x00;
    sciocmd.scsi_cdb[4] = 0xFF;
    sciocmd.scsi_cdb[5] = 0x00;

    if ((rc=ioctl(fd, DKIOCMD, &sciocmd)) != 0){
        printf("iocmd: Ioctl FAIL errno %d\n",errno);
        printf("status_validity: %x, scsi_status: %x, adapter_status:%x\n",
               sciocmd.status_validity, sciocmd.scsi_bus_status,
               sciocmd.adapter_status);
        hexdump(sense_data, (long)20);
        close(fd);
        exit(-1);
    } else {
        printf("cdiocmd : Ioctl PASS\n");
        if (cmd = SCSI_INQUIRY)
            hexdump(inq_data,0x20);
    }

    close(fd);
DK_PASSTHRU Une fois l'unité ouverte, l'opération DK_PASSTHRU peut exécuter n'importe quelle commande SCSI sur l'unité spécifiée. Le pilote de périphérique effectue une récupération d'erreur limitée si cette opération échoue. L'opération DK_PASSTHRU diffère de l'opération DKIOCMD de sorte qu'elle ne nécessite pas de commande openx avec l'argument ext de la zone SC_DIAGNOSTIC . Pour cette raison, l'opération DK_PASSTHRU peut être émise sur les unités qui sont utilisées par d'autres opérations.

L'octet de statut SCSI et les octets de statut de l'adaptateur sont renvoyés via le paramètre arg qui contient l'adresse d'une structure sc_passthru . Cette structure est définie dans le fichier /usr/include/sys/scsi.h . Si laDK_PASSTHRU L'opération échoue, le sous-programme renvoie une valeur de-1 et définit le numéro d'erreur variable globale à une valeur non nulle. Dans ce cas, l'appelant doit évaluer les octets d'état renvoyés pour déterminer la cause de l'échec de l'opération et les actions de reprise.

Si unDK_PASSTHRU l'opération échoue car un champ dans lesc_passthru structure a une valeur invalide, le sous-programme renvoie une valeur de-1 et réglez le numéro d'erreur variable globale àEINVAL . La zone einval_arg est définie sur le numéro de zone (en commençant par 1 pour la zone de version) de la zone dont la valeur n'est pas valide. La valeur 0 pour la zone einval_arg indique qu'aucune information supplémentaire sur l'échec n'est disponible.

La zone de version de la structure sc_passthru peut être définie sur la valeur de SCSI_VERSION_2 et vous pouvez spécifier les zones suivantes:
  • La zone variable_cdb_ptr est un pointeur vers une mémoire tampon qui contient la variable cdb .
  • La zone variable_cdb_length détermine la longueur de la variable cdb vers laquelle pointe la zone variable_cdb_ptr .

A la fin de la demande DK_PASSTHRU , la zone résiduelle indique les données restantes que le périphérique n'a pas entièrement satisfait pour cette demande. En cas d'achèvement réussi, la zone résiduelle indique que l'unité ne dispose pas de toutes les données demandées ou que l'unité dispose de moins de données que celles demandées. En cas d'échec d'une demande, vous devez vérifier la zone status_validity pour déterminer s'il existe un problème de bus SCSI valide. Dans ce cas, la zone résiduelle indique le nombre d'octets que l'unité n'a pas pu remplir pour cette demande.

La structure devinfo définit la taille de transfert maximale pour la commande. Si une tentative est faite pour transférer une taille supérieure à la taille maximale de transfert, le sous-programme renvoie une valeur de-1 , définit le numéro d'erreur variable globale à une valeur deEINVAL , et définit leeinval_arg champ à une valeur deSC_PASSTHRU_INV_D_LEN . Ces valeurs sont définies dans le fichier /usr/include/sys/scsi.h .

Remarque: Si vous appelez l'opération DK_PASSTHRU en tant qu'utilisateur non superutilisateur, l'opération échoue avec la valeur d'erreur EACCES au lieu de la valeur EPERM .
DK_PASSTHRU (suite) L'exemple de code suivant envoie l'opération DK_PASSTHRU ioctl à l'unité usbms0 pour obtenir les données d'interrogation SCSI standard:
    char sense_data[255];
    char *data_buffer=NULL;
    struct sc_passthru sciocmd;
....

    fd = open("/dev/usbms0", O_RDWR);
    if (fd == -1){
        printf("\npassthru: Open FAIL\n");
        exit(-1);
    }

    memset(&sciocmd, '\0', sizeof(struct sc_passthru));
    sciocmd.version = SCSI_VERSION_1;
    sciocmd.timeout_value = 30;
    sciocmd.command_length = 6;
    sciocmd.autosense_length = 255;
    sciocmd.autosense_buffer_ptr = &sense_data[0];

    sciocmd.data_length = 0xFF;
    sciocmd.buffer = inq_data;

    sciocmd.flags = B_READ;

    sciocmd.scsi_cdb[0] = SCSI_INQUIRY;
    sciocmd.scsi_cdb[1] = 0x00; /* Standard Inquiry*/
    sciocmd.scsi_cdb[2] = 0x00;
    sciocmd.scsi_cdb[3] = 0x00;
    sciocmd.scsi_cdb[4] = 0xFF;
    sciocmd.scsi_cdb[5] = 0x00;

    if ((rc=ioctl(fd, DK_PASSTHRU, &sciocmd)) != 0){
        if (sciocmd.adap_set_flags & SC_AUTOSENSE_DATA_VALID) {
            /* look at sense data */
        } /* end SC_AUTOSENSE_DATA_VALID */

        printf("passthru: Ioctl FAIL errno %d\n",errno);
        printf("status_validity: %x, scsi_status: %x, adapter_status:%x\n",
               sciocmd.status_validity, sciocmd.scsi_bus_status,
               sciocmd.adapter_status);
        printf("Residual: %x\n", sciocmd.residual);
        exit(-1);
    } else {
        printf("passthru: Ioctl PASS\n");
        printf("status_validity: %x, scsi_status: %x, adapter_status:%x\n",
               sciocmd.status_validity, sciocmd.scsi_bus_status,
               sciocmd.adapter_status);
        printf("Residual: %x\n", sciocmd.residual);
        /* inq_data buffer has valid Standard Inquiry data */
    }

Opérations ioctl pour les unités de disque dur USB, d'unité flash et RDX

Les opérations ioctl suivantes sont disponibles uniquement pour les unités de disque dur USB, de clé USB et RDX:

Opération Descriptif
INFOS Renvoie la structure devinfo définie dans le fichier /usr/include/sys/devinfo.h . L'opération IOCINFO est la seule opération définie pour tous les pilotes de périphérique qui utilisent la sous-routine ioctl . Les valeurs suivantes sont renvoyées:
devinfo.devtype = DD_SCDISK;
devinfo.flags =(uchar)DF_RAND;
devinfo.devsubtype = 0x00;
devinfo.un.scdk.max_request = Maximum_transfer_supported_by_usbcd_driver;
devinfo.un.scdk.numblks = Largest_LBA_supported_by_device+1;
devinfo.un.scdk.blksize = Block_size_set_for_the_USB_Disk/Flash/RDX_Device;
DKPMR Emet une commande de suppression de support (PMR) SCSI lors de l'ouverture de l'unité. Cette commande empêche l'éjection des supports tant que l'unité n'est pas fermée, mise hors tension et redémarrée, ou tant qu'une opération DKAMR n'est pas lancée. Le paramètre arg de l'opération DKAMR est null. Si l'opération DKAMR aboutit, la sous-routine renvoie la valeur 0. Si le périphérique est un disque dur SCSI, leDKAMR L'opération échoue, le sous-programme renvoie une valeur de-1 , et définit le numéro d'erreur variable globale à une valeur deEINVAL . Si laDKAMR l'opération échoue pour toute autre raison, le sous-programme renvoie une valeur de-1 et définit le numéro d'erreur variable globale à une valeur deEIO .
Remarque: Cette fonction est fournie pour prendre en charge les périphériques USB RDX qui prennent en charge l'éjection des cartouches de support.
DKAMR Emet une commande d'élimination des supports (AMR) lors de l'ouverture de l'unité. Le support peut ensuite être éjecté à l'aide du bouton d'éjection du pilote ou de l'opération DKEJECT . Le paramètre arg de cette opération ioctl est null. Si l'opération DKAMR aboutit, la sous-routine renvoie la valeur 0. Si l'unité est un disque dur SCSI, l'opération DKAMR échoue. De plus, le sous-programme renvoie une valeur de-1 et définit le numéro d'erreur variable globale à une valeur deEINVAL . Pour toute autre cause d'échec de cette opération, le sous-programme renvoie une valeur de-1 , et définit le numéro d'erreur variable globale à une valeur deEIO .
Remarque: Cette fonction est fournie pour prendre en charge les périphériques USB RDX qui prennent en charge l'éjection des cartouches de support.

Opérations ioctl pour les unités optiques de CD-ROM et de lecture / écriture

Les opérations ioctl suivantes sont disponibles pour les unités de CD-ROM et les unités optiques en lecture / écriture:

Opération Descriptif
INFOS Renvoie la structure devinfo définie dans le fichier /usr/include/sys/devinfo.h . L'opération IOCINFO est la seule opération définie pour tous les pilotes de périphérique qui utilisent la sous-routine ioctl . Les valeurs suivantes sont renvoyées:
devinfo.devtype = DD_CDROM;
devinfo.flags = (uchar)DF_RAND;
devinfo.devsubtype = 0x00;
devinfo.un.idecd.numblks = 
  Largest logical block addressing (LBA) supported by device + 1;
devinfo.un.idecd.blksize = Block size set for the USB Disk, flash, or RDX device;
IDEPASSTHRU Emet une commande ATAPI (AT Attachment Packet Interface) sur l'unité spécifiée lors de l'ouverture de l'unité. L'opération IDEPASSTHRU ne requiert pas de commande openx avec l'argument ext de la valeur SC_DIAGNOSTIC . Par conséquent, une opération IDEPASSTHRU peut être émise sur les unités utilisées par d'autres opérations.

Les octets de statut AT Attachment (ATA) et les octets d'erreur ATA sont renvoyés via le paramètre arg . Ce paramètre contient l'adresse d'une structure ide_ata_passthru définie dans le fichier /usr/include/sys/ide.h . Si laIDEPASSTHRU L'opération échoue, le sous-programme renvoie une valeur de-1 et définit le numéro d'erreur variable globale à une valeur non nulle. Dans ce cas, l'appelant évalue les octets d'état renvoyés pour déterminer la cause de l'échec de l'opération et les actions de reprise.

Si l'opération IDEPASSTHRU échoue, le pilote de périphérique effectue une reprise sur incident limitée. Si cette opération échoue parce qu'un champ dans leide_ata_passthru structure a une valeur invalide, le sous-programme renvoie une valeur de-1 et définit le numéro d'erreur variable globale àEINVAL .

A l'issue de la demande IDEPASSTHRU , la zone résiduelle indique que l'unité ne possède pas toutes les données demandées ou que l'unité possède une quantité de données inférieure à la quantité demandée. Si la demande IDEPASSTHRU échoue, la zone résiduelle indique le nombre d'octets que l'unité n'a pas pu exécuter pour cette demande.

IDEPASSTHRU (suite)

L'exemple de code suivant émet une commande d'interrogation SCSI qui utilise l'opération IDEPASSTHRU :

    struct ide_atapi_passthru atapicmd;
    char inq_buffer[255];
    uchar sense_data[255];
 
    /* set up the arg parameter block */
    memset(&atapicmd, '\0', sizeof(struct ide_atapi_passthru));
    memset(sense_data, '\0', 255);

    atapicmd.ide_device = 0;
    atapicmd.flags = IDE_PASSTHRU_READ;
    atapicmd.timeout_value    = 30;
    atapicmd.rsv0             = IDE_PASSTHRU_VERSION_01;
    atapicmd.rsv1             = 0;
    atapicmd.atapi_cmd.length = 12;
    atapicmd.atapi_cmd.resvd  = 0;
    atapicmd.atapi_cmd.resvd1 = 0;
    atapicmd.atapi_cmd.resvd2 = 0;

    atapicmd.data_ptr = inq_buffer;
    atapicmd.buffsize = 0xFF;

    atapicmd.atapi_cmd.packet.opcode  = SCSI_INQUIRY;
    atapicmd.atapi_cmd.packet.byte[0] = (0x00 | vpd)  ;  /*Standard Inquiry */
    atapicmd.atapi_cmd.packet.byte[1] = page_code;  /*Page Code-Valid if vpd=1 */
    atapicmd.atapi_cmd.packet.byte[2] = 0x00;
    atapicmd.atapi_cmd.packet.byte[3] = 0xFF;
    atapicmd.atapi_cmd.packet.byte[4] = 0x00;

    atapicmd.sense_data        = sense_data;
    atapicmd.sense_data_length = 255;

    fd = openx(“/dev/cd0”, O_RDWR, NULL, SC_DIAGNOSTIC);
    if (fd == -1) {
         printf("IDEPASSTHRU: Openx failed with errno %x \n", errno);
         exit(-1);
    }

   if ((rc = ioctl(fd, IDEPASSTHRU, &atapicmd) != 0)) {
         printf("IDEPASSTHRU: IOCTL Failed");
         printf("errno %d\n",errno);
         printf("ata_status: %x, ata_error:%x\n",
                atapicmd.ata_status, atapicmd.ata_error);
         close(fd);
         exit(-1);
     } else {
         printf("IDEPASSTHRU : Ioctl PASS\n");
         printf("ata_status: %x, ata_error: %x\n",
                atapicmd.ata_status, atapicmd.ata_error);
     }
     close(fd);
DKPMR Emet une interface SCSI (Small Computer System Interface) empêche la commande de suppression de support lors de l'ouverture de l'unité. Cette commande empêche l'éjection des supports jusqu'à ce que l'unité soit fermée, mise hors tension, puis sous tension, ou jusqu'à ce qu'une opération DKAMR soit lancée. Le paramètre arg de l'opération DKPMR est null. Si l'opération DKPMR aboutit, la sous-routine renvoie la valeur 0. Si le périphérique est un disque dur SCSI, leDKPMR L'opération échoue, le sous-programme renvoie une valeur de-1 , et définit le numéro d'erreur variable globale à une valeur deEINVAL . Si laDKPMR l’opération échoue pour toute autre raison, le sous-programme renvoie une valeur de-1 et définit le numéro d'erreur variable globale à une valeur deEIO .
DKAMR Emet une commande de suppression de support lors de l'ouverture de l'unité. Le support peut être éjecté à l'aide du bouton d'éjection des unités ou de l'opération DKEJECT . Le paramètre arg de cette opération est null. Si l'opération DKAMR aboutit, la sous-routine renvoie la valeur 0. Si le périphérique est un disque dur SCSI, leDKAMR L'opération échoue et le sous-programme renvoie une valeur de-1 et définit le numéro d'erreur variable globale à une valeur deEINVAL . Pour toute autre cause d’échec de fonctionnement, le sous-programme renvoie une valeur de-1 et définit le numéro d'erreur variable globale à une valeur deEIO .
DKEJECT Emet une commande de support d'éjection sur l'unité lorsque l'unité est ouverte. Le paramètre arg de cette opération est null. Si l'opération DKEJECT aboutit, la sous-routine renvoie la valeur 0. Si le périphérique est un disque dur SCSI, leDKEJECT L'opération échoue, le sous-programme renvoie une valeur de-1 , et définit le numéro d'erreur variable globale à une valeur deEINVAL . Pour toute autre cause d’échec de fonctionnement, le sous-programme renvoie une valeur de-1 et définit le numéro d'erreur variable à une valeur deEIO .
DKAUDIO Emet une commande audio de lecture sur l'unité indiquée et contrôle le volume sur les ports de sortie de l'unité. Les commandes audio peuvent jouer, mettre en pause, reprendre, arrêter, déterminer le nombre de pistes et déterminer le statut d'une opération audio en cours. L'opération DKAUDIO lit l'audio uniquement via les ports de sortie de l'unité de CD-ROM. Le paramètre arg de cette opération est l'adresse d'une structure cd_audio_cmds définie dans le fichier /usr/include/sys/scdisk.h . Le mode d'accès exclusif est requis.

Si laDKAUDIO L'opération est tentée lorsque l'attribut audio pris en charge du périphérique est défini surNo , le sous-programme renvoie une valeur de-1 et définit le numéro d'erreur variable globale à une valeur deEINVAL . Si laDKAUDIO L'opération échoue, le sous-programme renvoie une valeur de-1 et définit le numéro d'erreur variable globale à une valeur non nulle. Dans ce cas, l'appelant doit évaluer les octets d'état renvoyés pour déterminer la cause de l'échec de l'opération et des actions de reprise.

MODE DK_CD_ Emet l'une des commandes suivantes:
CD_GET_MODE
Renvoie le mode de données CD-ROM en cours dans la zone cd_mode_form de la structure mode_form_op lorsque l'unité est correctement ouverte.
CD_CHG_MODE
Remplace le mode de données CD-ROM par le mode spécifié dans la zone cd_mode_form de la structure mode_form_op lorsque l'unité est correctement ouverte en mode d'accès exclusif.

Si un CD-ROM n'est pas configuré pour différents modes de données à l'aide des codes de densité de sélection de mode et si vous modifiez le mode de données du CD-ROM en définissant le champ d'action duchange_mode_form structure à laCD_CHG_MODE commande, le sous-programme renvoie une valeur de-1 et définit le numéro d'erreur variable globale à une valeur deEINVAL . Les tentatives de changement du mode CD-ROM vers l'un des modes DVD entraînent également une valeur de retour de-1 et le numéro d'erreur la variable globale est définie surEINVAL . Si laDK_CD_MODE opération pour leCD_CHG_MODE La commande est tentée lorsque l'appareil n'est pas en mode d'accès exclusif, le sous-programme renvoie une valeur de-1 et définit le numéro d'erreur variable globale à une valeur deEACCES . Pour toute autre cause d’échec de fonctionnement, le sous-programme renvoie une valeur de-1 et définit le numéro d'erreur variable globale à une valeur deEIO .

Configuration matérielle requise pour l'unité

Les unités de disque dur USB, d'unité flash, de RDX, de CD-ROM et de lecture / écriture sont les suivantes:

  • Ces unités doivent prendre en charge une taille de bloc de 512 octets par bloc.
  • Si le sens du mode est pris en charge, le bit de protection en écriture (WP) doit également être pris en charge pour les disques durs à mémoire à accès séquentiel (SAM) et les unités de disque optique en lecture / écriture.
  • Les disques durs USB, les unités flash, RDX et les unités optiques de lecture / écriture doivent signaler le nombre de nouvelles tentatives matérielles en octets des données de détection des erreurs récupéréées. Si le disque dur USB ou l'unité de disque optique de lecture / écriture ne prend pas en charge cette fonction, le journal des erreurs système peut indiquer une défaillance prématurée de l'unité.
  • Les lecteurs de CD-ROM USB et de lecture / écriture doivent prendre en charge la commande de lecture SCSI à 10 octets.
  • Les unités de disque dur USB, les unités flash, RDX et les unités optiques de lecture / écriture doivent prendre en charge la commande d'écriture et de vérification SCSI et la commande d'écriture SCSI à 6 octets.
  • L'unité de disque optique en lecture / écriture doit définir les options de format (FOV) à 0 pour l'en-tête de la liste des incidents de la commande d'unité de format SCSI pour utiliser l'opération de commande de format. Si l'unité ne prend pas en charge cette fonction, vous pouvez écrire une application pour l'unité afin qu'elle formate le support à l'aide de l'opération DKFORMAT .
  • Si une unité de CD-ROM USB utilise le format de CD_ROM Data Mode 1, elle doit prendre en charge une taille de bloc de 512 octets par bloc.
  • Si une unité de CD-ROM USB utilise le format de données CD_ROM Mode 2 Form 1, elle doit prendre en charge une taille de bloc de 2048 octets par bloc.
  • Si une unité de CD-ROM USB utilise le format 2 du format de données CD_ROM, format 2, elle doit prendre en charge une taille de bloc de 2336 octets par bloc.
  • Si une unité de CD-ROM USB utilise le mode CD_DA, elle doit prendre en charge une taille de bloc de 2352 octets par bloc.
  • Pour contrôler le volume à l'aide de l'opération DKAUDIO (lecture audio), le périphérique doit prendre en charge la page de données en mode SCSI-2 0xE.
  • Pour utiliser l'opération DKAUDIO (lecture audio), le périphérique doit prendre en charge les commandes facultatives SCSI-2 suivantes:
    • Sous-canal en lecture
    • Reprise de pause
    • Lire le fichier de récapitulatif du courrier audio (.msf)
    • Lecture de l'index des pistes audio
    • Table des matières en lecture (table des matières)
Remarque: seul le système de fichiers ISO (International Organization for Standardization) (ISO 9660 en lecture seule), le système de fichiers UDF (Universal Disk Format) version 2.01ou antérieure sont pris en charge sur les unités USB pour le système d'exploitation AIX® . Toutefois, vous pouvez créer une sauvegarde système ou un archivage de données sur les unités à l'aide des commandes mksysb, tar, cpio, backupou restore . Vous pouvez également utiliser la commande dd pour ajouter les images ISO aux dispositifs.
Pour utiliser les unités de disque flash USB, RDX, CD-ROM, DVD-RAM et Blu-ray, installez le module d'unité suivant:
devices.usbif.08025002
Le système d'exploitation AIX ne prend pas en charge la fonction plug-and-play pour les périphériques USB. Pour qu'une unité Flash, RDX, CD-ROM, Blu-ray ou DVD-RAM soit disponible pour les utilisateurs AIX , un utilisateur root doit connecter l'unité à un port USB système et exécuter la commande suivante:
# cfgmgr -l usb0
Remarque: Soyez prudent lorsque vous retirez les unités flash des ports. Si les unités ne sont pas correctement fermées ou démontés avant de retirer les unités, les données des unités peuvent être endommagées.
Une fois les unités retirées, elles restent à l'état disponible dans le gestionnaire de données d'objet (ODM) jusqu'à ce que l'utilisateur root exécute la commande suivante:
# rmdev -l usbmsn
ou
#rmdev -l cdn
Lorsqu'une unité est à l'état disponible, vous pouvez reconnecter l'unité au système et l'unité peut être relatée ou rouverte. Si une unité est déconnectée d'un port USB du système alors qu'elle est encore ouverte pour un utilisateur, cette unité n'est pas réutilisable tant que vous n'avez pas fermé et rouvert.

AIX version 6.1 avec le niveau de technologie 6100-06 reconnaît et configure les unités Blu-ray connectées par USB en lecture seule. Le système d'exploitation AIX ne prend pas en charge l'opération d'écriture sur les supports CD, DVD ou Blu-ray présents dans l'unité USB Blu-ray. Bien que l'opération d'écriture n'est pas prévenue (si l'unité est capable d'écriture), aucun support n'est fourni pour les problèmes rencontrés lors de l'opération d'écriture.

La capacité du système d'exploitation AIX à fonctionner sur les périphériques USB d'origine USB (OEM), Blu-ray et les unités optiques est validée par rapport à un échantillon d'unités USB OEM standard qui sont conformes aux normes USB. Vous pouvez rencontrer des problèmes avec certains périphériques USB qui ne sont pas compatibles et le système d'exploitation AIX ne fournit aucun support pour ces problèmes.