⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scsi.c

📁 NXP LPC系列AMR7的开发程序源码(LCD
💻 C
📖 第 1 页 / 共 3 页
字号:
}

/*************************************************************************
 * Function Name: ScsiMediaRemovalImp
 * Parameters:  none
 *
 * Return: none
 *
 * Description: PREVENT ALLOW MEDIUM REMOVAL command implement
 *
 *************************************************************************/
inline
void ScsiMediaRemovalImp(void)
{
pSpc3MediaRemoval_t pMediaRemoval = (pSpc3MediaRemoval_t)Cbw.CBWCB;
  if (Cbw.dCBWDataTransferLength == 0)
  {
    if ((pMediaRemoval->Prevent == 0) || (pMediaRemoval->Prevent == 1))
    {
      // Clear condition code info
      ScsiCmdStatus(ScsiCommandNoKey);
      BotSendStatus();
    }
    else
    {
      ScsiCmdStatus(ScsiInvalidCbd);
      BotSendStatus();
    }
    return;
  }
  else
  {
    ScsiCmdStatus(ScsiFatalError);
  }
  UsbBotRstInterface();
}

/*************************************************************************
 * Function Name: ScsiReadCapacity10Imp
 * Parameters:  none
 *
 * Return: none
 *
 * Description: READ CAPACITY (10) command implement
 *
 *************************************************************************/
inline
void ScsiReadCapacity10Imp (void)
{
  if ((Cbw.bmCBWFlags.Dir == BotDataFormDevToHost) &&
      (Cbw.dCBWDataTransferLength >= sizeof(Sbc2ReadCapacity10Response_t)))
  {
    ScsiDrv[Lun].Message[0] = LunReadCapacity10ReqMsg;
    pScsiMessage[Lun] = ScsiDrv[Lun].Message;
    // Clear condition code info
    ScsiDrv[Lun].Status = ScsiCommandNoKey;
    return;
  }
  else
  {
    ScsiCmdStatus(ScsiFatalError);
  }
  BotStatus.BotStatus = TRUE;
  BotInEpStall();
}

/*************************************************************************
 * Function Name: ScsiReadCapacityData
 * Parameters:  Int32U LogBlockAdd, Int32U BlockSize
 *
 * Return: none
 *
 * Description: Prepare Read capacity data for sending
 *
 *************************************************************************/
void ScsiReadCapacityData (Int32U LogBlockAdd, Int32U BlockSize)
{
pSbc2ReadCapacity10Response_t pReadCapacity = (pSbc2ReadCapacity10Response_t)&Cbw;

  // clear buffer
  memset(pReadCapacity,0,sizeof(Sbc2ReadCapacity10Response_t));

  pReadCapacity->LogicalBlockAddress[0] = (LogBlockAdd >> 24) & 0xFF;
  pReadCapacity->LogicalBlockAddress[1] = (LogBlockAdd >> 16) & 0xFF;
  pReadCapacity->LogicalBlockAddress[2] = (LogBlockAdd >> 8 ) & 0xFF;
  pReadCapacity->LogicalBlockAddress[3] = (LogBlockAdd >> 0 ) & 0xFF;

  pReadCapacity->BlockLength[0]         = (BlockSize   >> 24) & 0xFF;
  pReadCapacity->BlockLength[1]         = (BlockSize   >> 16) & 0xFF;
  pReadCapacity->BlockLength[2]         = (BlockSize   >> 8 ) & 0xFF;
  pReadCapacity->BlockLength[3]         = (BlockSize   >> 0 ) & 0xFF;

  BotSendDataInit((Int8U *)pReadCapacity,
                  MIN(Csw.dCSWDataResidue,sizeof(Sbc2ReadCapacity10Response_t)),
                  TRUE);
}

/*************************************************************************
 * Function Name: ScsiRead10Imp
 * Parameters:  none
 *
 * Return: none
 *
 * Description: READ (10) command implement
 *
 *************************************************************************/
inline
void ScsiRead10Imp (void)
{
pSbc2Read10_t pRead = (pSbc2Read10_t)Cbw.CBWCB;
  if (Cbw.bmCBWFlags.Dir == BotDataFormDevToHost)
  {
    if(ScsiDrv[Lun].UnitSSStatus == UnitEjected)
    {
      ScsiCmdStatus(ScsiMediaNotPresent);
    }
    else
    {
      // Clear condition code info
      ScsiDrv[Lun].Status = ScsiCommandNoKey;
      ScsiDrv[Lun].Message[2] = ((Int32U)pRead->TransferLength[0] << 8) + pRead->TransferLength[1];
      if(ScsiDrv[Lun].Message[2] != 0)
      {
        ScsiDrv[Lun].Message[0] = LunRead10ReqMsg;
        ScsiDrv[Lun].Message[1] = ((Int32U)pRead->LogicalBockAddress[0] << 24) +\
                                  ((Int32U)pRead->LogicalBockAddress[1] << 16) +\
                                  ((Int32U)pRead->LogicalBockAddress[2] << 8 ) +\
                                  pRead->LogicalBockAddress[3];
        pScsiMessage[Lun] = ScsiDrv[Lun].Message;
      }
      else
      {
        BotSendStatus();
      }
      return;
    }
  }
  else
  {
    ScsiCmdStatus(ScsiFatalError);
  }
  BotStatus.BotStatus = TRUE;
  BotInEpStall();
}

/*************************************************************************
 * Function Name: ScsiReadData
 * Parameters: const pInt8U pData, Int32U Size, Boolean DataComplete
 *
 * Return: none
 *
 * Description: Prepare Read data for sending
 *
 *************************************************************************/
void ScsiReadData(const pInt8U pData, Int32U Size, Boolean DataComplete)
{
  BotSendDataInit(pData,Size,DataComplete);
}

/*************************************************************************
 * Function Name: ScsiWrite10Imp
 * Parameters:  none
 *
 * Return: none
 *
 * Description: Write (10) command implement
 *
 *************************************************************************/
inline
void ScsiWrite10Imp (void)
{
pSbc2Write10_t pWrite = (pSbc2Write10_t)Cbw.CBWCB;
  if (Cbw.bmCBWFlags.Dir == BotDataFormHostToDev)
  {
    if(ScsiDrv[Lun].UnitSSStatus == UnitEjected)
    {
      ScsiCmdStatus(ScsiMediaNotPresent);
    }
    else
    {
      // Clear condition code info
      ScsiDrv[Lun].Status = ScsiCommandNoKey;
      ScsiDrv[Lun].Message[2] = ((Int32U)pWrite->TransferLength[0] << 8) + pWrite->TransferLength[1];
      if(ScsiDrv[Lun].Message[2] != 0)
      {
        ScsiDrv[Lun].Message[0] = LunWrite10ReqMsg;
        ScsiDrv[Lun].Message[1] = ((Int32U)pWrite->LogicalBockAddress[0] << 24) +\
                                  ((Int32U)pWrite->LogicalBockAddress[1] << 16) +\
                                  ((Int32U)pWrite->LogicalBockAddress[2] << 8 ) +\
                                  pWrite->LogicalBockAddress[3];
        pScsiMessage[Lun] = ScsiDrv[Lun].Message;
        BotState = BotEpDataOut;
        return;
      }
      else
      {
        BotSendStatus();
      }
      return;
    }
  }
  else
  {
    ScsiCmdStatus(ScsiFatalError);
  }
  BotSendStatus();
  BotOutEpStall();
}

/*************************************************************************
 * Function Name: ScsiWriteData
 * Parameters:  pInt8U pData, Int32U Size, Boolean DataComplete
 *
 * Return: none
 *
 * Description: Prepare Write data for receiving
 *
 *************************************************************************/
void ScsiWriteData(pInt8U pData, Int32U Size, Boolean DataComplete)
{
  if(DataComplete)
  {
    BotSendStatus();
  }
  else
  {
    BotReceiveDataInit(pData,Size,DataComplete);
  }
}

/*************************************************************************
 * Function Name: ScsiVerify10Imp
 * Parameters:  none
 *
 * Return: none
 *
 * Description: Verify (10) command implement
 *
 *************************************************************************/
void ScsiVerify10Imp (void)
{
pSbc2Verify10_t pVerify = (pSbc2Verify10_t)Cbw.CBWCB;
  if (Cbw.bmCBWFlags.Dir == BotDataFormHostToDev)
  {
    if(ScsiDrv[Lun].UnitSSStatus == UnitEjected)
    {
      ScsiCmdStatus(ScsiMediaNotPresent);
    }
    else
    {
      // Clear condition code info
      ScsiDrv[Lun].Status = ScsiCommandNoKey;
      ScsiDrv[Lun].Message[2] = ((Int32U)pVerify->TransferLength[0] << 8) + pVerify->TransferLength[1];
      if(ScsiDrv[Lun].Message[2] != 0)
      {
        ScsiDrv[Lun].Message[1] = ((Int32U)pVerify->LogicalBockAddress[0] << 24) +\
                                  ((Int32U)pVerify->LogicalBockAddress[1] << 16) +\
                                  ((Int32U)pVerify->LogicalBockAddress[2] << 8 ) +\
                                  pVerify->LogicalBockAddress[3];
        ScsiDrv[Lun].Message[0] = (pVerify->BYTCHK)?LunVerify10BytChkReqMsg:LunVerify10ReqMsg;
        pScsiMessage[Lun] = ScsiDrv[Lun].Message;
        BotState = BotEpDataOut;
        return;
      }
      else
      {
        BotSendStatus();
      }
      return;
    }
  }
  else
  {
    ScsiCmdStatus(ScsiFatalError);
  }
  BotSendStatus();
  BotOutEpStall();
}

/*************************************************************************
 * Function Name: ScsiReadFormatCapcityImp
 * Parameters:  none
 *
 * Return: none
 *
 * Description: READ FORMAT CAPACITIES implement
 *
 *************************************************************************/
void ScsiReadFormatCapcityImp (void)
{
  if (Cbw.bmCBWFlags.Dir == BotDataFormDevToHost)
  {
    // Clear condition code info
    ScsiDrv[Lun].Status = ScsiCommandNoKey;
    ScsiDrv[Lun].Message[0] = LunReadFormatCapacityReqMsg;
    pScsiMessage[Lun] = ScsiDrv[Lun].Message;
    return;
  }
  else
  {
    ScsiCmdStatus(ScsiFatalError);
  }
  BotStatus.BotStatus = TRUE;
  BotInEpStall();
}

/*************************************************************************
 * Function Name: ScsiReadFormatCapcityData
 * Parameters:  pInt8U pData, Int32U Size
 *
 * Return: none
 *
 * Description: Prepare Data of READ FORMAT CAPACITIES command request
 *
 *************************************************************************/
void ScsiReadFormatCapcityData (pInt8U pData, Int32U Size)

{
pMmc3ReadFormatCapacity_t pFormatCapacity = (pMmc3ReadFormatCapacity_t)Cbw.CBWCB;
Int32U AllocationLength = (pFormatCapacity->AllocationLenght[0]<<8) +\
                           pFormatCapacity->AllocationLenght[1];
  BotSendDataInit(pData,MIN(Size,AllocationLength),TRUE);
}

/*************************************************************************
 * Function Name: ScsiCmdStatus
 * Parameters:  ScsiStatusCode_t Status
 *
 * Return: none
 *
 * Description: Prepare Status data for sending
 *
 *************************************************************************/
void ScsiCmdStatus (ScsiStatusCode_t Status)
{
  ScsiDrv[Lun].Status = Status;
  switch (Status)
  {
  case ScsiCommandNoKey:
    break;
  case ScsiMediamNotReady:
  case ScsiInvalidCbd:
  case ScsiUnknowCommand:
  case ScsiMediaNotPresent:
  case ScsiMediaChanged:
  case ScsiMiscompare:
    BotStatus.CmdFault = TRUE;
    break;
  default:
    BotStatus.PhaseError = TRUE;
  }
}

/*************************************************************************
 * Function Name: ScsiCmdError
 * Parameters:  Int32U Status, Int32U Stall
 *
 * Return: none
 *
 * Description: Prepare Error data for sending
 *
 *************************************************************************/
void ScsiCmdError (Int32U Status, Int32U Stall)
{
  if(Stall & ScsiStallIn)
  {
    BotStatus.BotStatus = TRUE;
    BotInEpStall();
  }
  if (Stall & ScsiStallOut)
  {
    BotOutEpStall();
  }
  ScsiCmdStatus((ScsiStatusCode_t)Status);
  if(!(Stall & ScsiStallIn))
  {
    BotSendStatus();
  }
}

/*************************************************************************
 * Function Name: ScsiMediaStartStopImp
 * Parameters: none
 *
 * Return: none
 *
 * Description: START STOP UNIT command implement
 *
 *************************************************************************/
inline
void ScsiMediaStartStopImp (void)
{
pSpc3UnitStartStop_t pMediaStartStop = (pSpc3UnitStartStop_t)Cbw.CBWCB;
  if (Cbw.dCBWDataTransferLength == 0)
  {
    if (pMediaStartStop->PC == 0)
    {
      if(pMediaStartStop->LOEJ)
      {
        if(pMediaStartStop->START)
        {
          ScsiDrv[Lun].UnitSSStatus = UnitStarted;
        }
        else
        {
          ScsiDrv[Lun].UnitSSStatus = UnitEjected;
        }
      }
      // Clear condition code info
      ScsiCmdStatus(ScsiCommandNoKey);
      BotSendStatus();
    }
    else
    {
      ScsiCmdStatus(ScsiInvalidCbd);
      BotSendStatus();
    }
    return;
  }
  else
  {
    ScsiCmdStatus(ScsiFatalError);
  }
  UsbBotRstInterface();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -