用途
支援「通用序列匯流排 (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、藍光唯讀及讀寫光碟機作業是使用 open
、 close
、 read
、 write
及 ioctl
子常式來實作。
裝置相依子常式
USB 大量儲存裝置驅動程式僅支援 open
、 close
、 ioctl
及 config
子常式。
開啟及關閉子常式
openx
子常式主要由診斷指令及公用程式使用。 需要適當的權限才能執行子常式。 如果您在沒有必要權限的情況下執行 open
子常式,則子常式會傳回值 -1 ,並將 errno 廣域變數設為值 EPERM
。
openx 子常式中指定的 分機 參數會選取要用於目標裝置的作業。 /usr/include/sys/usb.h 檔定義 ext 參數的可能值。
分機 參數可以包含下列旗標值的任何邏輯組合:
項目 |
說明 |
SC_DIAGENT |
將選取的裝置置於 Diagnostic 模式。 此模式是獨一無二的進入者,這表示一次只能有一個處理程序可以開啟裝置。 當裝置處於 Diagnostic 模式時,會在 open 或 close 作業期間起始設定 USB 裝置,並停用錯誤記載。 在 Diagnostic 模式中,只接受 close 和 ioctl 子常式作業。 所有其他裝置支援的子常式都會傳回值 -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 裝置不支援 readx
及 writex
子常式。 即使呼叫它們,也不會處理 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 |
以 Normal 或 Diagnostic 模式順利開啟裝置時, 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 |
以 Normal 或 Diagnostic 模式順利開啟裝置時, 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 廣域變數設為 EINVAL 。 einval_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版或更早版本。 不過,您可以使用 mksysb、 tar、 cpio、 backup或 restore 指令,在磁碟機上建立系統備份或資料保存。 您也可以使用 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 作業系統不提供這些問題的任何支援。