USB インターフェイスを備えたハードウェアのファームウェアを使用しています。デバイスが USB ポートに接続されている場合、CDC と MSC の 2 つのクラスとして列挙されます。
MSC 部分の場合、デバイスを書き込み保護できるように、デバイスをユーザーが構成できます。そのため、ユーザーは、デバイスが読み取り専用か、読み取り/書き込み機能を持つかを選択できます。
2 つのインターフェイスでデバイスを列挙できる、事前に作成された USB ライブラリを使用しています。私が苦労している部分は、デバイスが読み取り専用であるかのようにファームウェアを動作させる方法です。
マイクロコントローラは STM32L4 シリーズです。ほとんどのコードは、STM32CubeMX ソフトウェアから生成されます。
調査の結果、SCSI Write10 と SCSI Request Sense コマンドを併用すると、MSC が書き込み保護されているかどうかを確認できることがわかりました。現在の実装は次のとおりです。
static int8_t SCSI_Write10 (USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *params)
{
USBD_CDC_MSC_HandleTypeDef *hmsc = pdev->pClassData;
uint32_t len;
if (hmsc->bot_state == USBD_BOT_IDLE) /* Idle */
{
/* case 8 : Hi <> Do */
if ((hmsc->cbw.bmFlags & 0x80U) == 0x80U)
{
SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB);
return -1;
}
/* Check whether Media is ready */
if(((USBD_CDC_StorageItfTypeDef *)pdev->pUserData)->IsReady(lun) !=0 )
{
SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT);
return -1;
}
/* Check If media is write-protected */
if(((USBD_CDC_StorageItfTypeDef *)pdev->pUserData)->IsWriteProtected(lun) !=0 )
{
SCSI_SenseCode(pdev, lun, NOT_READY, WRITE_PROTECTED);
return -1;
}
// Other code
}
IsWriteProtected()
デバイスが書き込み保護として構成されている場合に、ゼロ以外の値を正しく返すことをデバッグして確認しました。はSCSI_SenseCode()
循環リストにエラー コードをプッシュしています。Windows は Request Sense SCSI コマンドを送信してエラー コードを取得するはずですが、Windows がこのコマンドを送信していないことをブレークポイントで確認しました。
int8_t SCSI_ProcessCmd(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *cmd)
{
switch (cmd[0])
{
case SCSI_TEST_UNIT_READY:
SCSI_TestUnitReady(pdev, lun, cmd);
break;
case SCSI_REQUEST_SENSE:
SCSI_RequestSense (pdev, lun, cmd); // <<-- This is never reached
break;
case SCSI_INQUIRY:
SCSI_Inquiry(pdev, lun, cmd);
break;
....
デバイスを書き込み禁止に構成すると、PC でのディスク ドライブの列挙に非常に長い時間がかかり、ファイル エクスプローラーが非常に長い間ビジー状態になります。列挙の後、ディスク ドライブを開くことができます。ディスクに書き込もうとすると、Windows はディスク I/O が発生し、書き込みが失敗したことを報告します。ディスクが読み取り専用であると Windows が通知することを期待していました。
デバイスを書き込み可能に構成すると、通常のペン ドライブを接続した場合と同様に、ディスク ドライブの列挙に一定の時間がかかります。
- Windows が Request Sense SCSI コマンドを送信しなかったのはなぜですか?
- Write10 コマンドからの書き込み保護が原因で -1 が返されると、ディスク列挙に非常に長い時間がかかるのはなぜですか? 書き込み禁止の有無にかかわらず、ディスクをすばやく列挙する必要があります。