USB 大容量ストレージ・クライアント・デバイス・ドライバー

目的

大容量ストレージおよびバルク・タイプのハード・ディスク、取り外し可能ディスク (RDX)、フラッシュ・ドライブ、CD-ROM、DVD-RAM、ブルーレイ読み取り専用、および読み取り/書き込み光ディスク・メモリー・デバイス用の USB プロトコルをサポートします。

構文

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

説明

標準的な USB ハード・ディスク、RDX、フラッシュ・ドライブ、CD-ROM、DVD-RAM、ブルーレイ読み取り専用、および読み取り/書き込み光ディスク操作は、 openclosereadwrite、および ioctl の各サブルーチンを使用して実装されます。

装置依存のサブルーチン

USB 大容量ストレージ・デバイス・ドライバーは、 opencloseioctl、および config の各サブルーチンのみをサポートします。

サブルーチンのオープンとクローズ

openx サブルーチンは、主に診断コマンドおよびユーティリティーによって使用されます。 サブルーチンを実行するには、適切な権限が必要です。 を実行するとopen必要な権限を持たないサブルーチンの場合、サブルーチンは値を返します。-1そして、エラーグローバル変数をEPERM

OpenX サブルーチンで指定された 内線 パラメーターは、ターゲット・デバイスに使用する操作を選択します。 /usr/include/sys/usb.h ファイルは、 ext パラメーターに指定できる値を定義します。

内線 パラメーターには、以下のフラグ値の任意の論理組み合わせを含めることができます。

項目 説明
SC_診断 選択したデバイスを Diagnostic モードにします。 このモードは単独でしか使用できません。つまり、一度に 1 つのプロセスのみがデバイスを開くことができます。 デバイスが Diagnostic モードの場合、USB デバイスは open または close の操作中に初期化され、エラー・ロギングは無効になります。 Diagnostic モードでは、 close および ioctl サブルーチン操作のみが受け入れられます。 その他のデバイス対応サブルーチンは、-1そして、エラーグローバル変数をEACCES

ターゲット装置が現在オープンされていない場合にのみ、装置を Diagnostic モードでオープンすることができます。 デバイスをDiagnosticターゲットデバイスがすでに開いている場合、サブルーチンは次の値を返します。-1そして、エラーグローバル変数をEACCES

シングル (SC_SINGLE) 選択したデバイスを Exclusive Access モードにします。 Exclusive Access モードでデバイスを開くことができるプロセスは一度に 1 つのみです。

デバイスを Exclusive Access モードで開くことができるのは、そのデバイスが現在オープンされていない場合のみです。 デバイスをExclusive Accessモードでデバイスがすでに開いている場合、サブルーチンは値を返します。-1そして、エラーグローバル変数をEBUSYSC_DIAGNOSTIC フラグを SC_SINGLE フラグと一緒に指定すると、デバイスは Diagnostic モードになります。

readx および writex サブルーチン

readx および writex サブルーチンは、USB デバイスではサポートされません。 呼び出されても、 ext パラメーターは処理されません。

ioctl サブルーチン

usbcd デバイス・ドライバーに使用される ioctl サブルーチン操作は、以下の USB デバイスのカテゴリーに固有のものです。
  • すべての USB デバイスに共通の ioctl 操作
  • USB ハード・ディスク、フラッシュ・ドライブ、および RDX デバイス
  • USB CD-ROM および読み取り/書き込み光ディスク装置

すべての USB デバイスでサポートされる一般的な ioctl 操作

以下の ioctl 操作は、ハード・ディスク、フラッシュ・ドライブ、RDX、CD-ROM、および読み取り/書き込み光ディスク装置に使用できます。

操作 説明
DKIORDSE (D) エラーが発生したときに、装置に対して読み取りコマンドを発行し、ターゲット装置のセンス・データを取得します。 もし、DKIORDSE操作は値を返します-1そして、もしstatus_validityフィールドはSC_SCSI_ERROR値の場合、有効なセンス データが返されます。 それ以外の場合は、ターゲット・センス・データは省略されます。

DKIORDSE 操作は、診断に使用するために提供されています。 これにより、アクティブ・システム環境での操作中にターゲット装置を限定的に使用することができます。 DKIORDSE 操作の arg パラメーターには、 sc_rdwrt 構造体のアドレスが含まれます。 この構造は、 /usr/include/sys/scsi.h ファイルで定義されます。

devinfo 構造体は、読み取り操作の最大転送サイズを定義します。 最大限度を超えて転送した場合、サブルーチンは次の値を返します。-1そして、エラーグローバル変数をEINVAL

注: CD-ROM 装置からセンス・データを取得するために読み取りコマンドが発行された場合、 DKIORDSE 操作の代わりに CDIORDSE 操作を使用することができます。 DKIORDSE 操作が推奨される操作です。
DKIOCMD (D) デバイスが Normal モードまたは Diagnostic モードで正常にオープンされると、 DKIOCMD 操作は、指定されたデバイスに対して任意の Small Computer System Interface (SCSI) コマンドを発行できます。 デバイス・ドライバーは、この操作のエラー・リカバリーまたは障害をログに記録しません。

SCSI 状況バイトおよびアダプター状況バイトは、 /usr/include/sys/scsi.h ファイルに定義されている sc_iocmd 構造体のアドレスを含む arg パラメーターを介して戻されます。 もし、DKIOCMD操作が失敗した場合、サブルーチンは値を返します-1そして、エラーグローバル変数をゼロ以外の値に設定します。 この場合、呼び出し側は、戻された状況バイトを評価して、操作の失敗の原因とリカバリー・アクションを判別する必要があります。

devinfo 構造は、コマンドの最大転送サイズを定義します。 最大値を超えて転送した場合、サブルーチンは次の値を返します。-1そして、エラーグローバル変数をEINVAL

DKIOCMD (続き) 以下のコード例は、SCSI 標準照会データを取得するために、 usbms0 デバイスに対して DKIOCMD ioctl 操作を発行します。
    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 (D) デバイスが Normal モードまたは Diagnostic モードで正常にオープンされると、 DKIOLCMD 操作は、指定されたデバイスに対して任意の SCSI コマンドを発行できます。 デバイス・ドライバーは、この操作のエラー・リカバリー障害をログに記録しません。

この ioctl 操作は、USB 大容量ストレージ・デバイスに対して 16 バイトの SCSI コマンドを発行するために使用される DKIOCMD16 操作に似ています。

SCSI 状況バイトおよびアダプター状況バイトは、 sc_iocmd16cdb 構造体のアドレスを含む arg パラメーターを介して戻されます。 この構造は、 /usr/include/sys/scsi.h ファイルで定義されます。 もし、DKIOLCMD操作が失敗した場合、サブルーチンは値を返します-1そして、エラーグローバル変数をゼロ以外の値に設定します。 この場合、呼び出し側は、戻された状況バイトを評価して、操作の失敗の原因とリカバリー・アクションを判別する必要があります。

DKIOLCMD ioctl 要求が完了すると、残余フィールドは、装置がこの要求に対して完全には満たさなかった残りのデータを示します。 正常終了の場合、残余フィールドは、装置に要求されたすべてのデータがないか、装置のデータ量が要求された量より少ないことを示します。 要求が失敗した場合は、 status_validity フィールドを調べて、有効な SCSI バスの問題が存在するかどうかを判別する必要があります。 この場合、残留フィールドは、この要求に対して装置が完了できなかったバイト数を示します。

devinfo 構造は、コマンドの最大転送サイズを定義します。 最大値を超えて転送した場合、サブルーチンは次の値を返します。-1そして、エラーグローバル変数をEINVAL

DKIOLCMD (続き) 以下のコード例は、SCSI 標準照会データを取得するために、 usbms0 デバイスに対して DKIOLCMD ioctl 操作を発行します。
    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 (DK パス RU) デバイスが正常にオープンされると、 DK_PASSTHRU 操作は、指定されたデバイスに対して任意の SCSI コマンドを発行できます。 この操作が失敗すると、デバイス・ドライバーは限定されたエラー・リカバリーを実行します。 DK_PASSTHRU 操作は、 SC_DIAGNOSTIC フィールドの ext 引数を指定した openx コマンドを必要としないという点で、 DKIOCMD 操作とは異なります。 このため、他の操作によって使用されているデバイスに対して DK_PASSTHRU 操作を発行することができます。

SCSI 状況バイトおよびアダプター状況バイトは、 sc_passthru 構造体のアドレスを含む arg パラメーターを介して戻されます。 この構造は、 /usr/include/sys/scsi.h ファイルで定義されます。 もし、DK_PASSTHRU操作が失敗した場合、サブルーチンは値を返します-1そして、エラーグローバル変数をゼロ以外の値に設定します。 この場合、呼び出し側は、戻された状況バイトを評価して、操作の失敗の原因とリカバリー・アクションを判別する必要があります。

もしDK_PASSTHRU操作は失敗しました。sc_passthru構造体に無効な値がある場合、サブルーチンは値を返します。-1そして、エラーグローバル変数にEINVALeinval_arg フィールドは、無効な値を持つフィールドのフィールド番号 (バージョン・フィールドの場合は 1 から始まる) に設定されます。 einval_arg フィールドの値が 0 の場合は、障害に関する追加情報が入手できないことを示します。

sc_passthru 構造のバージョン・フィールドは、 SCSI_VERSION_2 の値に設定でき、以下のフィールドを指定できます。
  • variable_cdb_ptr フィールドは、 cdb 変数を含むバッファーを指すポインターです。
  • variable_cdb_length フィールドは、 variable_cdb_ptr フィールドが指す cdb 変数の長さを決定します。

DK_PASSTHRU 要求が完了すると、残余フィールドは、装置がこの要求に対して完全には満たさなかった残りのデータを示します。 正常終了の場合、残余フィールドは、装置に要求されたすべてのデータがないか、装置のデータ量が要求された量より少ないことを示します。 要求が失敗した場合は、 status_validity フィールドを調べて、有効な SCSI バスの問題が存在するかどうかを判別する必要があります。 この場合、残留フィールドは、この要求に対して装置が完了できなかったバイト数を示します。

devinfo 構造は、コマンドの最大転送サイズを定義します。 最大転送サイズを超えて転送しようとすると、サブルーチンは次の値を返します。-1は、エラーグローバル変数をEINVALを設定し、einval_argフィールドの値をSC_PASSTHRU_INV_D_LEN。 これらの値は、 /usr/include/sys/scsi.h ファイルで定義されます。

注: DK_PASSTHRU 操作を非 root ユーザーとして呼び出すと、操作は EPERM 値ではなく EACCES エラー値で失敗します。
DK_PASSTHRU (続き) 以下のコード例は、SCSI 標準照会データを取得するために、 usbms0 デバイスに対して DK_PASSTHRU ioctl 操作を発行します。
    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 */
    }

USB ハード・ディスク、フラッシュ・ドライブ、および RDX デバイスの ioctl 操作

以下の ioctl 操作は、USB ハード・ディスク、フラッシュ・ドライブ、および RDX デバイスに対してのみ使用可能です。

操作 説明
IOCINFO /usr/include/sys/devinfo.h ファイルに定義されている devinfo 構造体を返します。 IOCINFO 命令は、 ioctl サブルーチンを使用するすべてのデバイス・ドライバーに対して定義される唯一の命令です。 返される値は次のとおりです。
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 (D) デバイスが正常にオープンされたときに、SCSI メディア除去防止 (PMR) コマンドを発行します。 このコマンドは、装置がクローズされるか、電源をオフにして再始動されるか、または DKAMR 操作が発行されるまで、メディアが排出されないようにします。 DKAMR 操作の arg パラメーターがヌルです。 DKAMR 命令が正常に実行されると、サブルーチンは値 0 を戻します。 デバイスがSCSIハードディスクの場合、DKAMR操作が失敗した場合、サブルーチンは値を返します-1を設定し、エラーグローバル変数をEINVAL。 もし、DKAMRその他の理由で操作が失敗した場合、サブルーチンは値を返します。-1そして、エラーグローバル変数をEIO
注: この機能は、メディア・カートリッジの排出をサポートする USB RDX デバイスをサポートするために提供されています。
DKAMR (D) 装置が正常にオープンされた時に, 媒体除去可能 (AMR) コマンドを出します。 その後、ドライバーの排出ボタンまたは DKEJECT 操作のいずれかを使用して、メディアを排出できます。 この ioctl 操作の arg パラメーターがヌルです。 DKAMR 命令が正常に実行されると、サブルーチンは値 0 を戻します。 デバイスが SCSI ハード・ディスクの場合、 DKAMR 操作は失敗します。 さらに、サブルーチンは次の値を返します。-1そして、エラーグローバル変数をEINVAL。 この操作が失敗したその他の原因の場合、サブルーチンは次の値を返します。-1を設定し、エラーグローバル変数をEIO
注: この機能は、メディア・カートリッジの排出をサポートする USB RDX デバイスをサポートするために提供されています。

CD-ROM および読み取り/書き込み光ディスク装置の ioctl 操作

CD-ROM および読み取り/書き込み光ディスク装置には、以下の ioctl 操作を使用できます。

操作 説明
IOCINFO /usr/include/sys/devinfo.h ファイルに定義されている devinfo 構造体を返します。 IOCINFO 命令は、 ioctl サブルーチンを使用するすべてのデバイス・ドライバーに対して定義される唯一の命令です。 返される値は次のとおりです。
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;
IDEパス・ RU (IDEPASSTHRU) 装置が正常にオープンされたときに、指定された装置に対して AT 接続パケット・インターフェース (ATAPI) コマンドを発行します。 IDEPASSTHRU 操作では、 SC_DIAGNOSTIC 値の ext 引数を指定した openx コマンドは必要ありません。 したがって、他の操作によって使用されているデバイスに対して IDEPASSTHRU 操作を発行することができます。

AT Attachment (ATA) 状況バイトおよび ATA エラー・バイトは、 arg パラメーターを介して戻されます。 このパラメーターには、 /usr/include/sys/ide.h ファイルに定義されている ide_ata_passthru 構造体のアドレスが含まれます。 もし、IDEPASSTHRU操作が失敗した場合、サブルーチンは値を返します-1そして、エラーグローバル変数をゼロ以外の値に設定します。 この場合、呼び出し元は、戻された状況バイトを評価して、操作の失敗の原因とリカバリー・アクションを判別します。

IDEPASSTHRU 操作が失敗した場合、デバイス・ドライバーは限定されたエラー・リカバリーを実行します。 この操作が失敗した場合、ide_ata_passthru構造体に無効な値がある場合、サブルーチンは値を返します。-1そして、エラーグローバル変数にEINVAL

IDEPASSTHRU 要求が正常に完了すると、残余フィールドは、要求されたすべてのデータが装置に入っていないか、または装置のデータ量が要求された量より少ないことを示します。 IDEPASSTHRU 要求が失敗した場合、残りのフィールドは、この要求に対して装置が完了できなかったバイト数を示します。

IDEPASSTHRU (続き)

以下のコード例は、 IDEPASSTHRU 操作を使用する SCSI 照会コマンドを発行します。

    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 (D) デバイスが正常にオープンされたときに、Small Computer System Interface (SCSI) 抑止メディア除去コマンドを発行します。 このコマンドは、デバイスがクローズされるか、電源がオフにされてから電源がオンにされるまで、または DKAMR 操作が発行されるまで、メディアが排出されないようにします。 DKPMR 操作の arg パラメーターがヌルです。 DKPMR 命令が正常に実行されると、サブルーチンは値 0 を戻します。 デバイスがSCSIハードディスクの場合、DKPMR操作が失敗した場合、サブルーチンは値を返します-1を設定し、エラーグローバル変数をEINVAL。 もし、DKPMRその他の理由で操作が失敗した場合、サブルーチンは値を返します。-1そして、エラーグローバル変数をEIO
DKAMR (D) 装置が正常にオープンされた時に, 媒体除去許可コマンドを出します。 メディアは、ドライブ・イジェクト・ボタンまたは DKEJECT 操作のいずれかを使用してイジェクトすることができます。 この操作の arg パラメーターがヌルです。 DKAMR 命令が正常に実行されると、サブルーチンは値 0 を戻します。 デバイスがSCSIハードディスクの場合、DKAMR操作は失敗し、サブルーチンは値を返します。-1そして、エラーグローバル変数をEINVAL。 その他の原因で操作が失敗した場合、サブルーチンは次の値を返します。-1そして、エラーグローバル変数をEIO
DKEJECT (デッキ) 装置が正常にオープンされたときに、ドライブにイジェクト・メディア・コマンドを発行します。 この操作の arg パラメーターがヌルです。 DKEJECT 命令が正常に実行されると、サブルーチンは値 0 を戻します。 デバイスがSCSIハードディスクの場合、DKEJECT操作が失敗した場合、サブルーチンは値を返します-1を設定し、エラーグローバル変数をEINVAL。 その他の原因で操作が失敗した場合、サブルーチンは次の値を返します。-1そして、エラー変数をEIO
DKAUDIO (D) 指定されたデバイスに対して音声再生コマンドを発行し、デバイスの出力ポート上のボリュームを制御します。 音声再生コマンドは、再生、一時停止、再開、停止、トラック数の判別、および現在の音声操作の状況の判別を行うことができます。 DKAUDIO 操作は、CD-ROM ドライブの出力ポートを介してのみ音声を再生します。 この操作の arg パラメーターは、 /usr/include/sys/scdisk.h ファイルに定義されている cd_audio_cmds 構造体のアドレスです。 排他的アクセス・モードが必要です。

もし、DKAUDIOデバイスのオーディオサポート属性が設定されている場合に操作が試行されますNoサブルーチンは値を返します-1そして、エラーグローバル変数をEINVAL。 もし、DKAUDIO操作が失敗した場合、サブルーチンは値を返します-1そして、エラーグローバル変数をゼロ以外の値に設定します。 この場合、呼び出し側は、戻された状況バイトを評価して、操作の失敗の原因とリカバリー・アクションを判別する必要があります。

DK CD_ モード 以下のいずれかのコマンドを発行します。
CD_GET_MODE
装置が正常にオープンされたときに、 mode_form_op 構造体の cd_mode_form フィールドに現行の CD-ROM データ・モードを戻します。
CD_CHG_MODE
装置が排他的アクセス・モードで正常にオープンされると、CD-ROM データ・モードを mode_form_op 構造体の cd_mode_form フィールドに指定されているモードに変更します。

CD-ROMがモード選択密度コードを使用して異なるデータモード用に設定されていない場合、およびCD-ROMデータモードをアクションフィールドで設定して変更した場合、change_mode_form構造にCD_CHG_MODEコマンドを実行すると、サブルーチンは-1そして、エラーグローバル変数をEINVAL。 CD-ROMモードをDVDモードに変更しようとすると、戻り値は-1そしてそのエラーグローバル変数は次のように設定されますEINVAL。 もし、DK_CD_MODEの操作CD_CHG_MODEデバイスが排他アクセスモードではないときにコマンドが試行されると、サブルーチンは次の値を返します。-1そして、エラーグローバル変数をEACCES。 その他の原因で操作が失敗した場合、サブルーチンは次の値を返します。-1そして、エラーグローバル変数をEIO

デバイスのハードウェア要件

USB ハード・ディスク、フラッシュ・ドライブ、RDX、CD-ROM、および読み取り/書き込み光ディスクには、以下のハードウェア要件があります。

  • これらのドライブは、ブロック当たり 512 バイトのブロック・サイズをサポートする必要があります。
  • モード・センスがサポートされている場合は、順次アクセス・メモリー (SAM) ハード・ディスクおよび読み取り/書き込み光ディスクに対して書き込み保護 (WP) ビットもサポートされている必要があります。
  • USB ハード・ディスク、フラッシュ・ドライブ、RDX、および読み取り/書き込み光ディスク・ドライブは、リカバリーされたエラーの要求センス・データのハードウェア再試行カウントをバイト単位で報告する必要があります。 USB ハード・ディスクまたは読み取り/書き込み光ディスクがこの機能をサポートしていない場合、システム・エラー・ログに、早期のドライブ障害が示されている可能性があります。
  • USB CD-ROM および読み取り/書き込み光ディスク・ドライブは、10 バイトの SCSI 読み取りコマンドをサポートする必要があります。
  • USB ハード・ディスク、フラッシュ・ドライブ、RDX、および読み取り/書き込み光ディスク・ドライブは、SCSI write and verify コマンドおよび 6 バイト SCSI write コマンドをサポートする必要があります。
  • 読み取り/書き込み光ディスク・ドライブは、フォーマット・コマンド操作を使用するために、SCSI フォーマット・ユニット・コマンドの障害リスト・ヘッダーのフォーマット・オプション有効 (FOV) ビットを 0 に設定する必要があります。 ドライブがこの機能をサポートしていない場合は、 DKFORMAT 操作を使用してドライブがメディアをフォーマットするように、ドライブ用のアプリケーションを作成することができます。
  • USB CD-ROM ドライブが CD_ROM データ・モード 1 フォーマットを使用する場合、ブロック当たり 512 バイトのブロック・サイズをサポートする必要があります。
  • USB CD-ROM ドライブが CD_ROM データ・モード 2 フォーム 1 フォーマットを使用する場合、ブロック当たり 2048 バイトのブロック・サイズをサポートする必要があります。
  • USB CD-ROM ドライブが CD_ROM データ・モード 2 フォーム 2 フォーマットを使用する場合、ブロック当たり 2336 バイトのブロック・サイズをサポートする必要があります。
  • USB CD-ROM ドライブが CD_DA モードを使用する場合、ブロック当たり 2352 バイトのブロック・サイズをサポートする必要があります。
  • DKAUDIO (音声再生) 操作を使用してボリュームを制御するには、デバイスが SCSI-2 モード・データ・ページ 0xEをサポートしている必要があります。
  • DKAUDIO (音声再生) 操作を使用するには、デバイスが以下の SCSI-2 オプション・コマンドをサポートしている必要があります。
    • サブチャネル読み取り
    • 再開の休止
    • オーディオ・メール要約ファイルの再生 (.msf)
    • 音声トラック索引の再生
    • 目次 (TOC) の読み取り
注: AIX® オペレーティング・システムの USB デバイスでは、国際標準化機構 (ISO) ファイル・システム (読み取り専用 ISO 9660)、ユニバーサル・ディスク・フォーマット (UDF) ファイル・システムのバージョン 2.01以前のみがサポートされます。 ただし、 mksysbtarcpiobackup、または restore コマンドを使用して、ドライブ上にシステム・バックアップまたはデータ・アーカイブを作成することができます。 また、dd コマンドを使用すると、ISO イメージをドライブに追加することができます。
USB フラッシュ・ドライブ、RDX、CD-ROM、DVD-RAM、およびブルーレイ読み取り専用デバイスを使用するには、以下のデバイス・パッケージをインストールします。
devices.usbif.08025002
AIX オペレーティング・システムは、USB デバイスのプラグ・アンド・プレイ機能をサポートしていません。 AIX ユーザーがフラッシュ・ドライブ、RDX、CD-ROM、Blu-ray、または DVD-RAM ドライブを使用できるようにするには、root ユーザーがドライブをシステム USB ポートに接続し、以下のコマンドを実行する必要があります。
# cfgmgr -l usb0
注: フラッシュ・ドライブをポートから取り外す場合は注意してください。 ドライブを取り外す前にドライブが適切に閉じられていないか、アンマウントされていない場合、ドライブ上のデータが破損する可能性があります。
ドライブを取り外すと、root ユーザーが以下のコマンドを実行するまで、ドライブはオブジェクト・データ・マネージャー (ODM) で使用可能状態のままになります。
# rmdev -l usbmsn
または
#rmdev -l cdn
ドライブが使用可能状態になると、ドライブをシステムに再接続し、ドライブを再マウントまたは再オープンすることができます。 ドライブがユーザーに対して開いたままの状態でシステム USB ポートから切断された場合、そのドライブは、クローズして再オープンするまで再使用できません。

AIX バージョン 6.1 (6100-06 テクノロジー・レベル) は、USB 接続のブルーレイ・ドライブを読み取り専用として認識して構成します。 AIX オペレーティング・システムは、USB ブルーレイ・ドライブにある CD、DVD、またはブルーレイ・メディアへの書き込み操作をサポートしません。 書き込み操作は防止されませんが (ドライブが書き込み可能な場合)、書き込み操作中に発生した問題に対するサポートは提供されません。

AIX オペレーティング・システムが USB 相手先商標製造 (OEM) フラッシュ・ドライブ、ブルーレイ、および光ディスク・デバイスを操作する機能は、USB 規格に準拠した業界標準 OEM USB デバイスのサンプルに照らして検証されます。 準拠していない特定の USB デバイスで問題が発生し、 AIX オペレーティング・システムがそれらの問題に対するサポートを提供しない場合があります。