USB 大量儲存體用戶端裝置驅動程式

用途

支援「通用序列匯流排 (USB)」通訊協定,適用於大量儲存及大量類型硬碟、抽取式磁碟機 (RDX)、快閃記憶體隨身碟、CD-ROM、DVD-RAM、藍光唯讀及讀寫光學記憶體裝置。

語法

#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、藍光唯讀及讀寫光碟機作業是使用 openclosereadwriteioctl 子常式來實作。

裝置相依子常式

USB 大量儲存裝置驅動程式僅支援 opencloseioctlconfig 子常式。

開啟及關閉子常式

openx 子常式主要由診斷指令及公用程式使用。 需要適當的權限才能執行子常式。 如果您在沒有必要權限的情況下執行 open 子常式,則子常式會傳回值 -1 ,並將 errno 廣域變數設為值 EPERM

openx 子常式中指定的 分機 參數會選取要用於目標裝置的作業。 /usr/include/sys/usb.h 檔定義 ext 參數的可能值。

分機 參數可以包含下列旗標值的任何邏輯組合:

項目 說明
SC_DIAGENT 將選取的裝置置於 Diagnostic 模式。 此模式是獨一無二的進入者,這表示一次只能有一個處理程序可以開啟裝置。 當裝置處於 Diagnostic 模式時,會在 openclose 作業期間起始設定 USB 裝置,並停用錯誤記載。 在 Diagnostic 模式中,只接受 closeioctl 子常式作業。 所有其他裝置支援的子常式都會傳回值 -1 ,並將 errno 廣域變數設為值 EACCES

只有在目前未開啟目標裝置時,才能以 Diagnostic 模式開啟裝置。 如果您在目標裝置已開啟時以 Diagnostic 模式開啟裝置,則子常式會傳回值 -1 ,並將 errno 廣域變數設為值 EACCES

SC_SINGLE 將選取的裝置置於 Exclusive Access 模式。 一次只能有一個處理程序以 Exclusive Access 模式開啟裝置。

只有在裝置目前未開啟時,才能以 Exclusive Access 模式開啟裝置。 如果您以 Exclusive Access 模式開啟裝置,且裝置已開啟,則子常式會傳回值 -1 ,並將 errno 廣域變數設為值 EBUSY。 如果 SC_DIAGNOSTIC 旗標與 SC_SINGLE 旗標一起指定,則裝置會處於 Diagnostic 模式。

readx 和 writex 子常式

USB 裝置不支援 readxwritex 子常式。 即使呼叫它們,也不會處理 ext 參數。

ioctl 子常式

用於 usbcd 裝置驅動程式的 ioctl 子常式作業特定於下列種類的 USB 裝置:
  • 所有 USB 裝置的一般 ioctl 作業
  • USB 硬碟、快閃記憶體隨身碟及 RDX 裝置
  • USB CD-ROM 及讀寫光學裝置

所有 USB 裝置支援一般 ioctl 作業

下列 ioctl 作業適用於硬碟、快閃記憶體隨身碟、RDX、CD-ROM 及讀寫光學裝置:

Operation 說明
DKIORDSE 向裝置發出讀取指令,並在發生錯誤時取得目標裝置感應資料。 如果 DKIORDSE 作業傳回值 -1 ,且 status_validity 欄位設為 SC_SCSI_ERROR 值,則會傳回有效的感應資料。 否則,會省略目標感應資料。

提供 DKIORDSE 作業供診斷使用。 在作用中系統環境中運作時,它容許有限使用目標裝置。 DKIORDSE 作業的 arg 參數包含 sc_rdwrt 結構的位址。 此結構定義在 /usr/include/sys/scsi.h 檔案中。

devinfo 結構定義讀取作業的傳送大小上限。 如果傳送超過上限,則子常式會傳回值 -1 ,並將 errno 廣域變數設為值 EINVAL

附註: 當發出讀取指令以從 CD-ROM 裝置取得感應資料時, CDIORDSE 作業可以替代 DKIORDSE 作業。 DKIORDSE 作業是建議的作業。
DKIOCMD NormalDiagnostic 模式順利開啟裝置時, DKIOCMD 作業可以向指定的裝置發出任何「小型電腦系統介面 (SCSI)」指令。 裝置驅動程式不會記載此作業的任何錯誤回復或失敗。

SCSI 狀態位元組及配接卡狀態位元組會透過 arg 參數傳回,該參數包含 /usr/include/sys/scsi.h 檔案中定義的 sc_iocmd 結構位址。 如果 DKIOCMD 作業失敗,則子常式會傳回值 -1 ,並將 errno 廣域變數設為非零值。 在此情況下,呼叫者必須評估傳回的狀態位元組,以判定作業失敗的原因及回復動作。

devinfo 結構定義指令的傳送大小上限。 如果傳送超過最大值,則子常式會傳回值 -1 ,並將 errno 廣域變數設為值 EINVAL

DKIOCMD (續) 下列程式碼範例向 usbms0 裝置發出 DKIOCMD ioctl 作業,以取得 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 NormalDiagnostic 模式順利開啟裝置時, DKIOLCMD 作業可以對指定的裝置發出任何 SCSI 指令。 裝置驅動程式不會記載此作業的任何錯誤回復失敗。

ioctl 作業類似於用來對 USB 大量儲存裝置發出 16 位元組 SCSI 指令的 DKIOCMD16 作業。

SCSI 狀態位元組及配接卡狀態位元組會透過包含 sc_iocmd16cdb 結構位址的 arg 參數傳回。 此結構定義在 /usr/include/sys/scsi.h 檔案中。 如果 DKIOLCMD 作業失敗,則子常式會傳回值 -1 ,並將 errno 廣域變數設為非零值。 在此情況下,呼叫者必須評估傳回的狀態位元組,以判定作業失敗的原因及回復動作。

完成 DKIOLCMD ioctl 要求時,剩餘欄位會指出裝置對此要求未完全滿足的剩餘資料。 順利完成時,剩餘欄位會指出裝置沒有所有所要求的資料,或裝置的資料量少於所要求的資料量。 要求失敗時,您必須檢查 status_validity 欄位,以判斷是否存在有效的 SCSI 匯流排問題。 在此情況下,殘差欄位會指出裝置無法針對此要求完成的位元組數。

devinfo 結構定義指令的傳送大小上限。 如果傳送超過最大值,則子常式會傳回值 -1 ,並將 errno 廣域變數設為值 EINVAL

DKIOLCMD (續) 下列程式碼範例向 usbms0 裝置發出 DKIOLCMD ioctl 作業,以取得 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 順利開啟裝置之後, DK_PASSTHRU 作業可以對指定的裝置發出任何 SCSI 指令。 如果此作業失敗,則裝置驅動程式會執行有限的錯誤回復。 DK_PASSTHRU 作業不同於 DKIOCMD 作業,因此它不需要具有 SC_DIAGNOSTIC 欄位的 ext 引數的 openx 指令。 因此,可以對其他作業正在使用的裝置發出 DK_PASSTHRU 作業。

SCSI 狀態位元組及配接卡狀態位元組會透過包含 sc_passthru 結構位址的 arg 參數傳回。 此結構定義在 /usr/include/sys/scsi.h 檔案中。 如果 DK_PASSTHRU 作業失敗,則子常式會傳回值 -1 ,並將 errno 廣域變數設為非零值。 在此情況下,呼叫者必須評估傳回的狀態位元組,以判定作業失敗的原因及回復動作。

如果 DK_PASSTHRU 作業失敗,因為 sc_passthru 結構中的欄位具有無效值,則子常式會傳回值 -1 ,並將 errno 廣域變數設為 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 ,將 errno 廣域變數設為值 EINVAL,並將 einval_arg 欄位設為值 SC_PASSTHRU_INV_D_LEN。 這些值定義在 /usr/include/sys/scsi.h 檔案中。

附註: 如果您以非 root 使用者身分呼叫 DK_PASSTHRU 作業,則作業會失敗,並產生 EACCES 錯誤值而非 EPERM 值。
DK_PASSTHRU (續) 下列程式碼範例向 usbms0 裝置發出 DK_PASSTHRU ioctl 作業,以取得 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 */
    }

USB 硬碟、快閃記憶體隨身碟及 RDX 裝置的 ioctl 作業

下列 ioctl 作業僅適用於 USB 硬碟、快閃記憶體隨身碟及 RDX 裝置:

Operation 說明
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 順利開啟裝置時,發出 SCSI 阻止媒體移除 (PMR) 指令。 此指令會防止媒體退出,直到裝置關閉、關閉電源並重新啟動,或直到發出 DKAMR 作業為止。 DKAMR 作業的 arg 參數是空值。 如果 DKAMR 作業成功,則子常式會傳回值 0。 如果裝置是 SCSI 硬碟,則 DKAMR 作業會失敗,子常式會傳回值 -1 ,並將 errno 廣域變數設為值 EINVAL。 如果 DKAMR 作業因任何其他原因而失敗,則子常式會傳回值 -1 ,並將 errno 廣域變數設為值 EIO
附註: 提供此功能是為了支援支援退出媒體卡匣的 USB RDX 裝置。
DKAMR 順利開啟裝置時,發出容許媒體移除 (AMR) 指令。 然後可以使用驅動程式的退出按鈕或 DKEJECT 作業來退出媒體。 此 ioctl 作業的 arg 參數是空值。 如果 DKAMR 作業成功,則子常式會傳回值 0。 如果裝置是 SCSI 硬碟,則 DKAMR 作業會失敗。 此外,子常式會傳回值 -1 ,並將 errno 廣域變數設為值 EINVAL。 對於此作業失敗的任何其他原因,子常式會傳回值 -1 ,並將 errno 廣域變數設為值 EIO
附註: 提供此功能是為了支援支援退出媒體卡匣的 USB RDX 裝置。

CD-ROM 及讀寫光學裝置的 ioctl 作業

下列 ioctl 作業可用於 CD-ROM 及讀寫光學裝置:

Operation 說明
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;
IDEPASSTHRU 順利開啟裝置時,對指定的裝置發出 AT 附件封包介面 (ATAPI) 指令。 IDEPASSTHRU 作業不需要具有 SC_DIAGNOSTIC 值的 ext 引數的 openx 指令。 因此,可以對其他作業正在使用的裝置發出 IDEPASSTHRU 作業。

AT Attachment (ATA) 狀態位元組及 ATA 錯誤位元組會透過 arg 參數傳回。 此參數包含 /usr/include/sys/ide.h 檔案中所定義 ide_ata_passthru 結構的位址。 如果 IDEPASSTHRU 作業失敗,則子常式會傳回值 -1 ,並將 errno 廣域變數設為非零值。 在此情況下,呼叫程式會評估傳回的狀態位元組,以判斷作業失敗的原因及回復動作。

如果 IDEPASSTHRU 作業失敗,裝置驅動程式會執行有限的錯誤回復。 如果此作業失敗,因為 ide_ata_passthru 結構中的欄位具有無效值,則子常式會傳回值 -1 ,並將 errno 廣域變數設為 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 順利開啟裝置時,發出「小型電腦系統介面 (SCSI)」阻止媒體移除指令。 此指令會防止媒體退出,直到裝置關閉、關閉電源,然後開啟電源,或直到發出 DKAMR 作業為止。 DKPMR 作業的 arg 參數是空值。 如果 DKPMR 作業成功,則子常式會傳回值 0。 如果裝置是 SCSI 硬碟,則 DKPMR 作業會失敗,子常式會傳回值 -1 ,並將 errno 廣域變數設為值 EINVAL。 如果 DKPMR 作業因任何其他原因而失敗,則子常式會傳回值 -1 ,並將 errno 廣域變數設為值 EIO
DKAMR 當順利開啟裝置時,發出容許媒體移除指令。 可以使用磁帶機退出按鈕或 DKEJECT 作業來退出媒體。 此作業的 arg 參數是空值。 如果 DKAMR 作業成功,則子常式會傳回值 0。 如果裝置是 SCSI 硬碟,則 DKAMR 作業會失敗,且子常式會傳回值 -1 ,並將 errno 廣域變數設為值 EINVAL。 對於任何其他作業失敗原因,子常式會傳回值 -1 ,並將 errno 廣域變數設為值 EIO
DKEJECT 當順利開啟裝置時,向磁帶機發出退出媒體指令。 此作業的 arg 參數是空值。 如果 DKEJECT 作業成功,則子常式會傳回值 0。 如果裝置是 SCSI 硬碟,則 DKEJECT 作業會失敗,子常式會傳回值 -1 ,並將 errno 廣域變數設為值 EINVAL。 對於任何其他作業失敗原因,子常式會傳回值 -1 ,並將 errno 變數設為值 EIO
DKAUDIT 向指定裝置發出播放音訊指令,並控制裝置輸出埠上的音量。 播放音訊指令可以播放、暫停、回復、停止、決定磁軌數目,以及決定現行音訊作業的狀態。 DKAUDIO 作業只會透過 CD-ROM 光碟機的輸出埠來播放音訊。 此作業的 arg 參數是 /usr/include/sys/scdisk.h 檔案中所定義 cd_audio_cmds 結構的位址。 需要專用存取模式。

如果在裝置的音訊支援屬性設為 No時嘗試 DKAUDIO 作業,則子常式會傳回值 -1 ,並將 errno 廣域變數設為值 EINVAL。 如果 DKAUDIO 作業失敗,則子常式會傳回值 -1 ,並將 errno 廣域變數設為非零值。 在此情況下,呼叫者必須評估傳回的狀態位元組,以判定作業失敗及回復動作的原因。

DK_CD_MODE 發出下列其中一個指令:
CD_GET_MODE
順利開啟裝置時,在 mode_form_op 結構的 cd_mode_form 欄位中傳回現行 CD-ROM 資料模式。
CD_CHG_MODE
以專用存取模式順利開啟裝置時,將 CD-ROM 資料模式變更為 mode_form_op 結構的 cd_mode_form 欄位中指定的模式。

如果未使用模式選取密度碼針對不同資料模式配置 CD-ROM ,且您將 change_mode_form 結構的動作欄位設為 CD_CHG_MODE 指令來變更 CD-ROM 資料模式,則子常式會傳回值 -1 ,並將 errno 廣域變數設為值 EINVAL。 嘗試將 CD-ROM 模式變更為任何 DVD 模式也會導致回覆值 -1 ,且 errno 廣域變數會設為 EINVAL。 當裝置不是處於專用存取模式時,如果嘗試 CD_CHG_MODE 指令的 DK_CD_MODE 作業,則子常式會傳回值 -1 ,並將 errno 廣域變數設為值 EACCES。 對於任何其他作業失敗原因,子常式會傳回值 -1 ,並將 errno 廣域變數設為值 EIO

裝置硬體需求

USB 硬碟、快閃記憶體隨身碟、RDX、CD-ROM 及讀寫光碟機具有下列硬體需求:

  • 這些磁碟機必須支援每個區塊 512 位元組的區塊大小。
  • 如果支援模式感應,則循序存取記憶體 (SAM) 硬碟及讀寫光碟機也必須支援寫入保護 (WP) 位元。
  • 針對已回復的錯誤, USB 硬碟、快閃記憶體隨身碟、RDX 及讀寫光碟機必須報告要求感應資料的硬體重試計數 (以位元組為單位)。 如果 USB 硬碟或讀寫光碟機不支援此特性,系統錯誤日誌可能會指出過早發生磁碟機故障。
  • USB CD-ROM 及讀寫光碟機必須支援 10 位元組 SCSI 讀取指令。
  • USB 硬碟、快閃記憶體隨身碟、RDX 及讀寫光碟機必須支援 SCSI 寫入及驗證指令,以及 6 位元組 SCSI 寫入指令。
  • 對於 SCSI 格式單元指令的問題報告清單標頭,讀取/寫入光碟機必須將格式選項有效 (FOV) 位元設為 0 ,才能使用格式指令作業。 如果磁帶機不支援此特性,您可以撰寫磁帶機的應用程式,以便它使用 DKFORMAT 作業來格式化媒體。
  • 如果 USB CD-ROM 光碟機使用 CD_ROM 資料模式 1 格式,它必須支援每個區塊 512 位元組的區塊大小。
  • 如果 USB CD-ROM 光碟機使用 CD_ROM 資料模式 2 Form 1 格式,它必須支援每個區塊 2048 位元組的區塊大小。
  • 如果 USB CD-ROM 光碟機使用 CD_ROM 資料模式 2 Form 2 格式,它必須支援每個區塊 2336 位元組的區塊大小。
  • 如果 USB CD-ROM 光碟機使用 CD_DA 模式,它必須支援每個區塊 2352 位元組的區塊大小。
  • 若要使用 DKAUDIO (播放音訊) 作業來控制磁區,裝置必須支援 SCSI-2 模式資料頁面 0xE
  • 若要使用 DKAUDIO (播放音訊) 作業,裝置必須支援下列 SCSI-2 選用指令:
    • 讀取子通道
    • 暫停回復
    • 播放音訊郵件摘要檔案 (.msf)
    • 播放音軌索引
    • 讀取目錄 (read table of contents , TOC)
附註: 在 AIX® 作業系統的 USB 裝置上,僅支援國際標準化組織 (ISO) 檔案系統 (唯讀 ISO 9660)、「通用磁碟格式 (UDF)」檔案系統 2.01版或更早版本。 不過,您可以使用 mksysbtarcpiobackuprestore 指令,在磁碟機上建立系統備份或資料保存。 您也可以使用 dd 指令,將 ISO 映像檔新增至磁碟機。
若要使用 USB 快閃記憶體隨身碟、RDX、CD-ROM、DVD-RAM 及藍光唯讀裝置,請安裝下列裝置套件:
devices.usbif.08025002
AIX 作業系統不支援 USB 裝置的隨插即用特性。 若要讓快閃記憶體隨身碟、RDX、CD-ROM、藍光或 DVD-RAM 光碟機可供 AIX 使用者使用, root 使用者必須將磁碟機連接至系統 USB 埠,並執行下列指令:
# cfgmgr -l usb0
附註: 當您從埠移除快閃記憶體隨身碟時請小心。 如果在移除磁碟機之前未適當地關閉或卸載磁碟機,則磁碟機上的資料可能會毀損。
移除磁碟機之後,這些磁碟機在「物件資料管理程式」(ODM) 中仍保持可用狀態,直到 root 使用者執行下列指令為止:
# rmdev -l usbmsn
#rmdev -l cdn
當磁碟機處於可用狀態時,您可以將磁碟機重新連接至系統,並且可以重新裝載或重新開啟磁碟機。 如果磁碟機在仍對使用者開啟時從系統 USB 埠中斷連線,則在您關閉並重新開啟之前,該磁碟機無法重複使用。

AIX 6.1 (含 6100-06 技術層次) 可將 USB 連接的藍光磁碟機辨識並配置成唯讀。 AIX 作業系統不支援對 USB 藍光光碟機中的 CD、DVD 或藍光媒體進行寫入作業。 雖然無法防止寫入作業 (如果磁碟機是可寫入的) ,但對於寫入作業期間所遇到的任何問題,都不會提供支援。

針對符合 USB 標準的業界標準 OEM USB 裝置範例,驗證 AIX 作業系統在 USB 原始設備製造商 (OEM) 快閃記憶體隨身碟、藍光及光學裝置上運作的功能。 您可能會遇到不符合標準的特定 USB 裝置問題,且 AIX 作業系統不提供這些問題的任何支援。