Driver De Dispositivo Cliente USB Mass Storage

Propósito

Suporta o protocolo Universal Serial Bus (USB) para armazenamento em massa e disco rígido de tipo granel, Removable Disk Drive (RDX), pen drives, CD-ROM, DVD-RAM, Blu-ray read-only e dispositivos de memória óptica de leitura / gravação.

Sintaxe

#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>

Descrição

Disco rígido USB típico, RDX, pen drives, CD-ROM, DVD-RAM, Blu-ray read-only, e operações de unidade óptica de leitura / gravação são implementadas usando as subroutines open, close, read, writee ioctl .

Subroutines dependentes de dispositivo

O driver de dispositivo de armazenamento em massa USB suporta apenas as subroutines open, close, ioctle config .

subroutines abertas e fechas

A subroutine openx é usada principalmente pelos comandos de diagnóstico e utilitários. A autoridade adequada é necessária para executar a subroutine. Se você executar oopen sub-rotina sem a autoridade necessária, a sub-rotina retornará um valor de-1 e define o errno variável global para um valor deEPERM .

O parâmetro ext que é especificado no subroutine openx seleciona a operação a ser utilizada para o dispositivo de destino. O arquivo /usr/include/sys/usb.h define os valores possíveis para o parâmetro ext .

O parâmetro ext pode conter qualquer combinação lógica dos seguintes valores de sinalização:

Item Descrição
SC_DIAGNÓSTICO Coloca o dispositivo selecionado no modo Diagnostic . Este modo é singularmente entrante, o que significa que apenas um processo por vez pode abrir o dispositivo de cada vez. Quando um dispositivo está no modo Diagnostic , os dispositivos USB são inicializados durante as operações open ou close , e o registro de erros é desativado. No modo Diagnostic , apenas as operações subroutine close e ioctl são aceitas. Todas as outras sub-rotinas suportadas pelo dispositivo retornam um valor de-1 e definir o errno variável global para um valor deEACCES .

Um dispositivo pode ser aberto no modo Diagnostic apenas se o dispositivo de destino não for aberto atualmente. Se você abrir um dispositivo noDiagnostic modo quando o dispositivo de destino já está aberto, a sub-rotina retorna um valor de-1 e define o errno variável global para um valor deEACCES .

SC_ÚNICO Coloca o dispositivo selecionado no modo Exclusive Access . Apenas um processo pode abrir um dispositivo no modo Exclusive Access de cada vez.

Um dispositivo pode ser aberto no modo Exclusive Access apenas se o dispositivo não estiver atualmente aberto. Se você abrir um dispositivo noExclusive Access modo e o dispositivo já está aberto, a sub-rotina retorna um valor de-1 e define o errno variável global para um valor deEBUSY . Se a sinalização SC_DIAGNOSTIC for especificada juntamente com a sinalização SC_SINGLE , o dispositivo será colocado no modo Diagnostic .

subroutines de readx e writex

As subroutines readx e writex não são suportadas em dispositivos USB. Mesmo que sejam chamados, o parâmetro ext não é processado.

subroutine de ioctl

As operações de subroutine ioctl que são usadas para o driver de dispositivo usbcd são específicas para as seguintes categorias de dispositivos USB:
  • Operações comuns ioctl para todos os dispositivos USB
  • Disco rígido USB, pen drive e dispositivos RDX
  • USB CD-ROM e dispositivos ópticos de leitura / gravação

Operações comuns ioctl suportadas para todos os dispositivos USB

As seguintes operações ioctl estão disponíveis para disco rígido, pen drive, RDX, CD-ROM e dispositivos ópticos de leitura / gravação:

Operação Descrição
DKIORDSE Emite um comando de leitura para o dispositivo e obtém os dados de sentido do dispositivo alvo quando ocorre um erro. Se oDKIORDSE operação retorna um valor de-1 e se ostatus_validity campo está definido para oSC_SCSI_ERROR valor, dados de sentido válidos serão retornados. Caso contrário, dados de sentido alvo são omitidos.

A operação DKIORDSE é fornecida para uso diagnóstico. Ele permite o uso limitado do dispositivo de destino enquanto opera em um ambiente de sistema ativo. O parâmetro arg da operação DKIORDSE contém o endereço de uma estrutura sc_rdwrt . Essa estrutura é definida no arquivo /usr/include/sys/scsi.h .

A estrutura devinfo define o tamanho máximo de transferência para uma operação de leitura. Se você transferir mais que o limite máximo, a sub-rotina retornará um valor de-1 e define o errno variável global para um valor deEINVAL .

Nota: A operação CDIORDSE pode ser substituída para a operação DKIORDSE quando o comando read for emitido para obter dados de sentido de um dispositivo de CD-ROM. A operação DKIORDSE é a operação recomendada.
DKIOCMD Quando o dispositivo é aberto com sucesso no modo Normal ou Diagnostic , a operação DKIOCMD pode emitir qualquer comando Small Computer System Interface (SCSI) para o dispositivo especificado. O driver do dispositivo não registra nenhuma recuperação de erro ou falhas desta operação.

O byte de status SCSI e o status do adaptador bytes são retornados através do parâmetro arg que contém o endereço de uma estrutura sc_iocmd , que é definido no arquivo /usr/include/sys/scsi.h . Se oDKIOCMD operação falha, a sub-rotina retorna um valor de-1 e define o errno variável global para um valor diferente de zero. Neste caso, o responsável pela chamada deve avaliar os bytes de status retornado para determinar a causa de falha de operação e as ações de recuperação.

A estrutura devinfo define o tamanho máximo de transferência para o comando. Se você transferir mais que o valor máximo, a sub-rotina retornará um valor de-1 e define o errno variável global para um valor deEINVAL .

DKIOCMD (continuação) O código de exemplo a seguir emite a operação ioctl DKIOCMD para o dispositivo usbms0 para obter os dados de consulta padrão 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 Quando o dispositivo é aberto com sucesso no modo Normal ou Diagnostic , a operação DKIOLCMD pode emitir qualquer comando SCSI para o dispositivo especificado. O driver do dispositivo não registra nenhuma falha de recuperação de erro desta operação.

Esta operação ioctl é semelhante à operação DKIOCMD16 que é usada para emitir 16-byte comandos SCSI para o dispositivo de armazenamento em massa USB.

O byte de status SCSI e o status do adaptador bytes são retornados através do parâmetro arg que contém o endereço de uma estrutura sc_iocmd16cdb . Essa estrutura é definida no arquivo /usr/include/sys/scsi.h . Se oDKIOLCMD operação falha, a sub-rotina retorna um valor de-1 e define o errno variável global para um valor diferente de zero. Neste caso, o responsável pela chamada deve avaliar os bytes de status retornado para determinar a causa de falha de operação e as ações de recuperação.

Na conclusão da solicitação DKIOLCMD ioctl , o campo residual indica os dados de sobra que o dispositivo não satisfez totalmente a este pedido. Em uma conclusão bem-sucedida, o campo residual indica que o dispositivo não possui todos os dados solicitados ou o dispositivo possui menor quantidade de dados do que o solicitado. Em uma falha de solicitação, você deve verificar o campo status_validity para determinar se um problema de barramento SCSI válido existe. Neste caso, o campo residual indica o número de bytes que o dispositivo não conseguiu concluir para esta solicitação.

A estrutura devinfo define o tamanho máximo de transferência para o comando. Se você transferir mais que o valor máximo, a sub-rotina retornará um valor de-1 e define o errno variável global para um valor deEINVAL .

DKIOLCMD (continuação) O código de exemplo a seguir emite a operação ioctl DKIOLCMD para o dispositivo usbms0 para obter os dados de consulta padrão 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 Quando o dispositivo é aberto com sucesso, a operação DK_PASSTHRU pode emitir qualquer comando SCSI para o dispositivo especificado. O driver de dispositivo executa cobrança de erro limitada se esta operação falhar. A operação DK_PASSTHRU difere da operação DKIOCMD tal que ela não requer um comando openx com o argumento ext do campo SC_DIAGNOSTIC . Por causa disso, a operação DK_PASSTHRU pode ser emitida para dispositivos que estão em uso por outras operações.

O byte de status SCSI e o status do adaptador bytes são retornados através do parâmetro arg que contém o endereço de uma estrutura sc_passthru . Essa estrutura é definida no arquivo /usr/include/sys/scsi.h . Se oDK_PASSTHRU operação falha, a sub-rotina retorna um valor de-1 e define o errno variável global para um valor diferente de zero. Neste caso, o responsável pela chamada deve avaliar os bytes de status retornado para determinar a causa de falha de operação e as ações de recuperação.

Se umDK_PASSTHRU operação falha porque um campo nosc_passthru estrutura tem um valor inválido, a sub-rotina retorna um valor de-1 e definir o errno variável global paraEINVAL . O campo einval_arg é definido para o número do campo (começando com 1 para o campo da versão) do campo que tinha um valor inválido. Um valor de 0 para o campo einval_arg indica que nenhuma informação adicional sobre a falha está disponível.

O campo de versão da estrutura sc_passthru pode ser configurado com o valor de SCSI_VERSION_2 e você pode especificar os seguintes campos:
  • O campo variable_cdb_ptr é um ponteiro para um buffer que contém a variável cdb .
  • O campo variable_cdb_length determina o comprimento da variável cdb para a qual os variable_cdb_ptr pontos de campo.

Na conclusão da solicitação DK_PASSTHRU , o campo residual indica os dados de sobra que o dispositivo não satisfez totalmente a este pedido. Em uma conclusão bem-sucedida, o campo residual indica que o dispositivo não possui todos os dados solicitados ou o dispositivo possui menor quantidade de dados do que o solicitado. Em uma falha de solicitação, você deve verificar o campo status_validity para determinar se um problema de barramento SCSI válido existe. Neste caso, o campo residual indica o número de bytes que o dispositivo não conseguiu concluir para esta solicitação.

A estrutura devinfo define o tamanho máximo de transferência para o comando. Se for feita uma tentativa de transferir mais do que o tamanho máximo de transferência, a sub-rotina retornará um valor de-1 , define o errno variável global para um valor deEINVAL , e define oeinval_arg campo para um valor deSC_PASSTHRU_INV_D_LEN . Esses valores são definidos no arquivo /usr/include/sys/scsi.h .

Nota: Se você chamar a operação DK_PASSTHRU como um usuário não root, a operação falhará com o valor de erro EACCES em vez do valor EPERM .
DK_PASSTHRU (continuação) O código de exemplo a seguir emite a operação DK_PASSTHRU ioctl para o dispositivo usbms0 para obter os dados de consulta padrão SCSI:
    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 */
    }

operações ioctl para disco rígido USB, pen drive e dispositivos RDX

As seguintes operações ioctl estão disponíveis para disco rígido USB, pen drive e dispositivos RDX apenas:

Operação Descrição
IOCINFO Retorna a estrutura devinfo que é definida no arquivo /usr/include/sys/devinfo.h . A operação IOCINFO é a única operação definida para todos os drivers de dispositivos que utilizam a subroutine ioctl . Os valores a seguir são retornados:
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 Emite um comando SCSI evitar remoção de mídia (PMR) quando o dispositivo for aberto com sucesso. Este comando evita que a mídia seja ejetada até que o dispositivo seja fechado, desligado e reiniciado ou até que uma operação DKAMR seja emitida. O parâmetro arg para a operação DKAMR é nulo. Se a operação DKAMR for bem-sucedida, a subroutine devolve um valor de 0. Se o dispositivo for um disco rígido SCSI, oDKAMR operação falha, a sub-rotina retorna um valor de-1 , e define o errno variável global para um valor deEINVAL . Se oDKAMR operação falhar por qualquer outro motivo, a sub-rotina retornará um valor de-1 e define o errno variável global para um valor deEIO .
Nota: Esta função é fornecida para suportar os dispositivos USB RDX que suportam ejetar os cartuchos de mídia.
DKAMR Emite um comando de permitem remoção de mídia (AMR) quando o dispositivo é aberto com sucesso. A mídia pode então ser ejetada usando-se o botão de ejeção do driver ou a operação DKEJECT . O parâmetro arg para esta operação ioctl é nulo. Se a operação DKAMR for bem-sucedida, a subroutine devolve um valor de 0. Se o dispositivo for um disco rígido SCSI, a operação DKAMR falha. Além disso, a sub-rotina retorna um valor de-1 e define o errno variável global para um valor deEINVAL . Para qualquer outra causa de falha desta operação, a sub-rotina retorna um valor de-1 , e define o errno variável global para um valor deEIO .
Nota: Esta função é fornecida para suportar os dispositivos USB RDX que suportam ejetar os cartuchos de mídia.

operações ioctl para CD-ROM e dispositivos ópticos de leitura / gravação

As seguintes operações ioctl estão disponíveis para CD-ROM e dispositivos ópticos de leitura / gravação:

Operação Descrição
IOCINFO Retorna a estrutura devinfo que é definida no arquivo /usr/include/sys/devinfo.h . A operação IOCINFO é a única operação definida para todos os drivers de dispositivos que utilizam a subroutine ioctl . Os valores a seguir são retornados:
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 Emite um comando AT Attachment Packet Interface (ATAPI) para o dispositivo especificado quando o dispositivo é aberto com sucesso. A operação IDEPASSTHRU não requer um comando openx com o argumento ext do valor SC_DIAGNOSTIC . Portanto, uma operação IDEPASSTHRU pode ser emitida para dispositivos que estejam em uso por outras operações.

Os bytes de status do AT Attachment (ATA) e os bytes de erro ATA são retornados através do parâmetro arg . Este parâmetro contém o endereço de uma estrutura ide_ata_passthru que é definida no arquivo /usr/include/sys/ide.h . Se oIDEPASSTHRU operação falha, a sub-rotina retorna um valor de-1 e define o errno variável global para um valor diferente de zero. Neste caso, o ouvinte avalia os bytes de status retornado para determinar a causa da falha de operação e as ações de recuperação.

Se a operação IDEPASSTHRU falhar, o driver do dispositivo executa cobrança de erro limitada. Se esta operação falhar porque um campo noide_ata_passthru estrutura tem um valor inválido, a sub-rotina retorna um valor de-1 e define o errno variável global paraEINVAL .

Na conclusão bem-sucedida da solicitação IDEPASSTHRU , o campo residual indica que o dispositivo não possui todos os dados solicitados, ou o dispositivo tem menos do que a quantidade de dados que é solicitada. Se a solicitação IDEPASSTHRU falhar, o campo residual indica o número bytes que o dispositivo falhou ao concluir para esta solicitação.

IDEPASSTHRU (continuação)

O código de exemplo a seguir emite um comando de consulta SCSI que usa a operação 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 Problemas uma Small Computer System Interface (SCSI) impedem o comando de remoção de mídia quando o dispositivo é aberto com sucesso. Este comando evita que a mídia ejeta até que o dispositivo seja fechado, desligado e então ligado ou até que uma operação DKAMR seja emitida. O parâmetro arg para a operação DKPMR é nulo. Se a operação DKPMR for bem-sucedida, a subroutine devolve um valor de 0. Se o dispositivo for um disco rígido SCSI, oDKPMR operação falha, a sub-rotina retorna um valor de-1 , e define o errno variável global para um valor deEINVAL . Se oDKPMR operação falhar por qualquer outro motivo, a sub-rotina retornará um valor de-1 e define o errno variável global para um valor deEIO .
DKAMR Emite um comando de remoção de mídia de permitir quando o dispositivo é aberto com sucesso. A mídia pode ser ejetada usando-se o botão de ejeção de unidades ou a operação DKEJECT . O parâmetro arg para esta operação é nulo. Se a operação DKAMR for bem-sucedida, a subroutine devolve um valor de 0. Se o dispositivo for um disco rígido SCSI, oDKAMR a operação falha e a sub-rotina retorna um valor de-1 e define o errno variável global para um valor deEINVAL . Para qualquer outra causa de falha na operação, a sub-rotina retorna um valor de-1 e define o errno variável global para um valor deEIO .
DKEJECT Emite um comando de mídia ejeta para a unidade quando o dispositivo é aberto com sucesso. O parâmetro arg para esta operação é nulo. Se a operação DKEJECT for bem-sucedida, a subroutine devolve um valor de 0. Se o dispositivo for um disco rígido SCSI, oDKEJECT operação falha, a sub-rotina retorna um valor de-1 , e define o errno variável global para um valor deEINVAL . Para qualquer outra causa de falha na operação, a sub-rotina retorna um valor de-1 e define o errno variável para um valor deEIO .
DKAUDIO Emite um comando de áudio de peça para o dispositivo especificado e controla o volume nas portas de saída do dispositivo. Os comandos de áudio da peça podem jogar, pausar, retomar, parar, determinar o número de faixas e determinar o status de uma operação de áudio atual. A operação DKAUDIO toca áudio apenas através de portas de saída da unidade de CD-ROM. O parâmetro arg desta operação é o endereço de uma estrutura cd_audio_cmds que é definida no arquivo /usr/include/sys/scdisk.h . O modo de acesso exclusivo é necessário.

Se oDKAUDIO a operação é tentada quando o atributo de suporte de áudio do dispositivo está definido comoNo , a sub-rotina retorna um valor de-1 e define o errno variável global para um valor deEINVAL . Se oDKAUDIO operação falha, a sub-rotina retorna um valor de-1 e define o errno variável global para um valor diferente de zero. Neste caso, o responsável pela chamada deve avaliar os bytes de status retornado para determinar a causa de falhas de operação e ações de recuperação.

DK_CD_MODE Emite um dos seguintes comandos:
CD_GET_MODE
Retorna o modo de dados do CD-ROM atual no campo cd_mode_form da estrutura mode_form_op quando o dispositivo é aberto com sucesso.
CD_CHG_MODE
Altera o modo de dados do CD-ROM para o modo que é especificado no campo cd_mode_form da estrutura mode_form_op quando o dispositivo é aberto com sucesso no modo de acesso exclusivo.

Se um CD-ROM não estiver configurado para diferentes modos de dados usando os códigos de densidade de seleção de modo, e se você alterar o modo de dados do CD-ROM definindo o campo de ação dochange_mode_form estrutura para oCD_CHG_MODE comando, a sub-rotina retorna um valor de-1 e define o errno variável global para um valor deEINVAL . As tentativas de alterar o modo CD-ROM para qualquer um dos modos DVD também resultam em um valor de retorno de-1 e a errno variável global está definida comoEINVAL . Se oDK_CD_MODE operação para oCD_CHG_MODE comando é tentado quando o dispositivo não está no modo de acesso exclusivo, a sub-rotina retorna um valor de-1 e define o errno variável global para um valor deEACCES . Para qualquer outra causa de falha na operação, a sub-rotina retorna um valor de-1 e define o errno variável global para um valor deEIO .

Requisitos de hardware do dispositivo

Disco rígido USB, pen drive, RDX, CD-ROM e unidades ópticas de leitura / gravação possuem os seguintes requisitos de hardware:

  • Essas unidades devem suportar um tamanho de bloco de 512 bytes por bloco.
  • Se o senso de modo for suportado, o bit de write-protection (WP) também deve ser suportado para discos rígidos de memória de acesso sequencial (SAM) e unidades ópticas de leitura / gravação.
  • Discos rígidos USB, pen drives, RDX e unidades ópticas de leitura / gravação devem relatar a contagem de retentos de hardware em bytes dos dados de sentido de solicitação para erros recuperados. Se o disco rígido USB ou unidade óptica de leitura / gravação não suportar este recurso, o log de erros do sistema pode indicar falha de unidade prematura.
  • As unidades ópticas de CD-ROM e de leitura / gravação USB devem suportar o comando de leitura 10-byte SCSI.
  • Discos rígidos USB, pen drives, RDX e unidades ópticas de leitura / gravação devem suportar o comando SCSI de gravação e verificação e o comando de gravação SCSI 6-byte.
  • A unidade óptica de leitura / gravação deve configurar as opções de formato válidas (FOV) bit a 0 para o cabeçalho da lista de defeitos do comando unitário de formato SCSI para usar a operação de comando de formato. Se a unidade não suportar esse recurso, você pode gravar um aplicativo para a unidade para que ela formata a mídia usando a operação DKFORMAT .
  • Se uma unidade de CD-ROM USB usa o formato CD_ROM Data Mode 1, ele deve suportar um tamanho de bloco de 512 bytes por bloco.
  • Se uma unidade de CD-ROM USB usa o formato CD_ROM data Modo 2 Formulário 1, ele deve suportar um tamanho de bloco de 2048 bytes por bloco.
  • Se uma unidade de CD-ROM USB usa o formato CD_ROM data Modo 2 Formulário 2, ele deve suportar um tamanho de bloco de 2336 bytes por bloco.
  • Se uma unidade de CD-ROM USB usa o modo CD_DA, ele deve suportar um tamanho de bloco de 2352 bytes por bloco.
  • Para controlar o volume usando a operação DKAUDIO (play audio), o dispositivo deve suportar a página de dados do modo SCSI-2 0xE.
  • Para usar a operação DKAUDIO (play audio), o dispositivo deve suportar os seguintes comandos opcionais SCSI-2 :
    • ler sub-canal
    • pausa de pausa
    • play audio mail arquivo resumo (.msf)
    • jogar índice de faixa de áudio
    • tabela de leitura de conteúdos (TOC)
Nota: Somente o sistema de arquivos International Organization for Standardization (ISO) (somente leitura ISO 9660), Universal Disk Format (UDF) Versão 2.01ou anterior, é suportado em dispositivos USB para o sistema operacional AIX® . No entanto, é possível criar um backup de sistema ou archival de dados nas unidades usando os comandos mksysb, tar, cpio, backupou restore . Você também pode usar o comando dd para adicionar as imagens ISO às unidades.
Para utilizar os dispositivos USB flash drive, RDX, CD-ROM, DVD-RAM e Blu-ray, instale o seguinte pacote de dispositivos:
devices.usbif.08025002
O sistema operacional AIX não suporta recurso de plug-and-play para dispositivos USB. Para fazer um pen drive, RDX, CD-ROM, Blu-ray ou unidade de DVD-RAM disponível para os usuários AIX , um usuário root deve conectar a unidade a uma porta USB do sistema e executar o seguinte comando:
# cfgmgr -l usb0
Nota: Use cuidado ao remover as unidades flash de portas. Se as unidades não estiverem devidamente fechadas ou desmontadas antes de remover as unidades, os dados nas unidades podem ser corrompidos.
Depois de remover as unidades, as unidades permanecem no estado disponível no Object Data Manager (ODM) até que o usuário raiz execute o comando a seguir:
# rmdev -l usbmsn
ou
#rmdev -l cdn
Quando uma unidade está no estado disponível, é possível reconectar a unidade ao sistema, e a unidade pode ser remada ou reaberta. Se uma unidade é desconectada de uma porta USB do sistema enquanto ela ainda está aberta para um usuário, essa unidade não é reutilizável até que você feche e reabra-a.

O AIX Versão 6.1 com o Nível de Tecnologia 6100-06 reconhece e configura unidades Blu-ray conectadas USB como somente leitura. O sistema operacional AIX não suporta a operação de gravação em CD, DVD ou mídia Blu-ray que estão presentes na unidade USB Blu-ray. Apesar de a operação de gravação não ser impedida (se a unidade for capaz de gravação), nenhum suporte é fornecido para quaisquer problemas que sejam encontrados durante a operação de gravação.

A capacidade do sistema operacional AIX de operar na unidade flash do fabricante de equipamentos originais USB (OEM), Blu-ray e dispositivos ópticos é validada contra uma amostra de dispositivos OEM USB padrão do setor que são compatíveis com as normas USB. Você pode encontrar problemas com certos dispositivos USB que não são compatíveis e o sistema operacional AIX não oferece nenhum suporte para essas questões.