Exemple #1
0
/**
  * @brief  DFU_Req_GETSTATUS
  *         Handles the DFU GETSTATUS request.
  * @param  pdev: instance
  * @retval status
  */
static void DFU_Req_GETSTATUS(void *pdev)
{
  switch (DeviceState)
  {
  case   STATE_dfuDNLOAD_SYNC:
    if (wlength != 0)
    {
      DeviceState = STATE_dfuDNBUSY;
      DeviceStatus[4] = DeviceState;
      if ((wBlockNum == 0) && (MAL_Buffer[0] == CMD_ERASE))
      {
        MAL_GetStatus(usbd_dfu_AltSet, Pointer, 0, DeviceStatus);
      }
      else
      {
        MAL_GetStatus(usbd_dfu_AltSet, Pointer, 1, DeviceStatus);
      }
    }
    else  /* (wlength==0)*/
    {
      DeviceState = STATE_dfuDNLOAD_IDLE;
      DeviceStatus[4] = DeviceState;
    }
    break;

  case   STATE_dfuMANIFEST_SYNC :
    if (Manifest_State == Manifest_In_Progress)
    {
        // continue to disconnect USB and eventually reset asynchornously to ensure
        // the response to this message is returned correctly.
        DeviceState = STATE_dfuMANIFEST;
    // get a nice output from dfu-util - original code entered STATE_dfuMANIFEST
    // but this leaves a message Transitioning to dfuMANIFEST state as the last line, which just lingers with no clear indication of what to do next.

      DeviceStatus[4] = STATE_dfuDNLOAD_IDLE;
      //break;
    }
    else if ((Manifest_State == Manifest_complete) && \
      ((usbd_dfu_CfgDesc[(11 + (9 * USBD_DFU_INT_NUM))]) & 0x04))
    {
      DeviceState = STATE_dfuIDLE;
      DeviceStatus[4] = DeviceState;
      //break;
    }
    break;
      case STATE_dfuMANIFEST:
      {
        DeviceState = STATE_dfuIDLE;
        DeviceStatus[4] = DeviceState;
      }

  default :
    break;
  }

  /* Send the status data over EP0 */
  USBD_CtlSendData (pdev,
                    (uint8_t *)(&(DeviceStatus[0])),
                    6);
}
/**
  * @brief  DFU_Req_GETSTATUS
  *         Handles the DFU GETSTATUS request.
  * @param  pdev: instance
  * @retval status
  */
static void DFU_Req_GETSTATUS(void *pdev)
{
  switch (DeviceState)
  {
  case   STATE_dfuDNLOAD_SYNC:
    if (wlength != 0)
    {
      DeviceState = STATE_dfuDNBUSY;
      DeviceStatus[4] = DeviceState;
      if ((wBlockNum == 0) && (MAL_Buffer[0] == CMD_ERASE))
      {
        MAL_GetStatus(Pointer, 0, DeviceStatus);
      }
      else
      {
        MAL_GetStatus(Pointer, 1, DeviceStatus);
      }
    }
    else  /* (wlength==0)*/
    {
      DeviceState = STATE_dfuDNLOAD_IDLE;
      DeviceStatus[4] = DeviceState;
      DeviceStatus[1] = 0;
      DeviceStatus[2] = 0;
      DeviceStatus[3] = 0;
    }
    break;
    
  case   STATE_dfuMANIFEST_SYNC :
    if (Manifest_State == Manifest_In_Progress)
    {
      DeviceState = STATE_dfuMANIFEST;
      DeviceStatus[4] = DeviceState;
      DeviceStatus[1] = 1;             /*bwPollTimeout = 1ms*/
      DeviceStatus[2] = 0;
      DeviceStatus[3] = 0;
      //break;
    }
    else if ((Manifest_State == Manifest_complete) && \
      ((usbd_dfu_CfgDesc[(11 + (9 * USBD_ITF_MAX_NUM))]) & 0x04))
    {
      DeviceState = STATE_dfuIDLE;
      DeviceStatus[4] = DeviceState;
      DeviceStatus[1] = 0;
      DeviceStatus[2] = 0;
      DeviceStatus[3] = 0;
      //break;
    }
    break;
    
  default :
    break;
  }
  
  /* Send the status data over EP0 */
  USBD_CtlSendData (pdev,
                    (uint8_t *)(&(DeviceStatus[0])),
                    6);
}
/*******************************************************************************
* Function Name  : GETSTATUS.
* Description    : Get Status request routine.
* Input          : Length.
* Output         : None.
* Return         : Pointer to data.
*******************************************************************************/
uint8_t *GETSTATUS(uint16_t Length)
{
  switch (DeviceState) {
  case   STATE_dfuDNLOAD_SYNC:
    if (wlength != 0) {
      DeviceState = STATE_dfuDNBUSY;
      DeviceStatus[4] = DeviceState;
      if ((wBlockNum == 0) && (MAL_Buffer[0] == CMD_ERASE)) {
        MAL_GetStatus(Pointer, 0, DeviceStatus);
      } else {
        MAL_GetStatus(Pointer, 1, DeviceStatus);
      }
    } else { /* (wlength==0)*/
      DeviceState = STATE_dfuDNLOAD_IDLE;
      DeviceStatus[4] = DeviceState;
      DeviceStatus[1] = 0;
      DeviceStatus[2] = 0;
      DeviceStatus[3] = 0;

    }
    break;
  case   STATE_dfuMANIFEST_SYNC :
    if (Manifest_State == Manifest_In_Progress) {
      DeviceState = STATE_dfuMANIFEST;
      DeviceStatus[4] = DeviceState;
      DeviceStatus[1] = 1;             /*bwPollTimeout = 1ms*/
      DeviceStatus[2] = 0;
      DeviceStatus[3] = 0;
      //break;
    } else if (Manifest_State == Manifest_complete && dfuConfig_Descriptor.Descriptor[20]
               & 0x04) {
      DeviceState = STATE_dfuIDLE;
      DeviceStatus[4] = DeviceState;
      DeviceStatus[1] = 0;
      DeviceStatus[2] = 0;
      DeviceStatus[3] = 0;
      //break;
    }
    break;
  default :
    break;
  }

  if (Length == 0) {
    pInformation->Ctrl_Info.Usb_wLength = 6 ;
    return NULL;
  } else
    return (&(DeviceStatus[0]));
}
Exemple #4
0
/*******************************************************************************
* Function Name  : SCSI_Format_Cmd
* Description    : Format Commands routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void SCSI_Format_Cmd(uint8_t lun)
{
  if (MAL_GetStatus(lun))
  {
    Set_Scsi_Sense_Data(CBW.bLUN, NOT_READY, MEDIUM_NOT_PRESENT);
    Set_CSW (CSW_CMD_FAILED, SEND_CSW_ENABLE);
    Bot_Abort(DIR_IN);
    return;
  }
}
/*******************************************************************************
* Function Name  : SCSI_ReadFormatCapacity_Cmd
* Description    : SCSI ReadFormatCapacity Command routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void SCSI_ReadFormatCapacity_Cmd(void)
{

  MAL_GetStatus();
  ReadFormatCapacity_Data[4] = (u8)(Mass_Block_Count >> 24);
  ReadFormatCapacity_Data[5] = (u8)(Mass_Block_Count >> 16);
  ReadFormatCapacity_Data[6] = (u8)(Mass_Block_Count >>  8);
  ReadFormatCapacity_Data[7] = (u8)(Mass_Block_Count);

  ReadFormatCapacity_Data[9] = (u8)(Mass_Block_Size >>  16);
  ReadFormatCapacity_Data[10] = (u8)(Mass_Block_Size >>  8);
  ReadFormatCapacity_Data[11] = (u8)(Mass_Block_Size);
  Transfer_Data_Request(ReadFormatCapacity_Data, READ_FORMAT_CAPACITY_DATA_LEN);
}
Exemple #6
0
/*******************************************************************************
* Function Name  : SCSI_Valid_Cmd
* Description    : Valid Commands routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void SCSI_TestUnitReady_Cmd(u8 lun)
{
  if (MAL_GetStatus(lun))
  {
    Set_Scsi_Sense_Data(CBW.bLUN, NOT_READY, MEDIUM_NOT_PRESENT);
    Set_CSW (CSW_CMD_FAILED, SEND_CSW_ENABLE);
    Bot_Abort(DIR_IN);
    return;
  }
  else
  {
    Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE);
  }
}
/*******************************************************************************
* Function Name  : SCSI_ReadCapacity10_Cmd
* Description    : SCSI ReadCapacity10 Command routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void SCSI_ReadCapacity10_Cmd(void)
{

  MAL_GetStatus();
  ReadCapacity10_Data[0] = (u8)((Mass_Block_Count - 1) >> 24);
  ReadCapacity10_Data[1] = (u8)((Mass_Block_Count - 1) >> 16);
  ReadCapacity10_Data[2] = (u8)((Mass_Block_Count - 1) >>  8);
  ReadCapacity10_Data[3] = (u8)(Mass_Block_Count - 1);

  ReadCapacity10_Data[4] = (u8)(Mass_Block_Size >>  24);
  ReadCapacity10_Data[5] = (u8)(Mass_Block_Size >>  16);
  ReadCapacity10_Data[6] = (u8)(Mass_Block_Size >>  8);
  ReadCapacity10_Data[7] = (u8)(Mass_Block_Size);
  Transfer_Data_Request(ReadCapacity10_Data, READ_CAPACITY10_DATA_LEN);
}
/*******************************************************************************
* Function Name  : SCSI_Format_Cmd
* Description    : Format Commands routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void SCSI_Format_Cmd(uint8_t lun)
{
  if (MAL_GetStatus(lun))
  {
    Set_Scsi_Sense_Data(CBW.bLUN, NOT_READY, MEDIUM_NOT_PRESENT);
    Set_CSW (CSW_CMD_FAILED, SEND_CSW_ENABLE);
    Bot_Abort(DIR_IN);
    return;
  }
#ifdef USE_STM3210E_EVAL
  else
  {
    NAND_Format();
    Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE);
  }
#endif
}
Exemple #9
0
/*******************************************************************************
* Function Name  : SCSI_Format_Cmd
* Description    : Format Commands routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void SCSI_Format_Cmd(uint8_t lun)
{
  if (MAL_GetStatus(lun))
  { //This is STs code - spec says this always has to be supported, even with SD cards
    //Set_Scsi_Sense_Data(CBW.bLUN, NOT_READY, MEDIUM_NOT_PRESENT);
    //Set_CSW (CSW_CMD_FAILED, SEND_CSW_ENABLE);
    //Bot_Abort(DIR_IN);
    Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE);
    return;
  }
#ifdef USE_STM3210E_EVAL
  else
  {
    NAND_Format();
    Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE);
  }
#endif
}
Exemple #10
0
/*******************************************************************************
* Function Name  : SCSI_ReadFormatCapacity_Cmd
* Description    : SCSI ReadFormatCapacity Command routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void SCSI_ReadFormatCapacity_Cmd(uint8_t lun)
{
  if (MAL_GetStatus(lun) != 0 )
  {
    Set_Scsi_Sense_Data(CBW.bLUN, NOT_READY, MEDIUM_NOT_PRESENT);
    Set_CSW (CSW_CMD_FAILED, SEND_CSW_ENABLE);
    Bot_Abort(DIR_IN);
    return;
  }
  ReadFormatCapacity_Data[4] = (uint8_t)(Mass_Block_Count[lun] >> 24);
  ReadFormatCapacity_Data[5] = (uint8_t)(Mass_Block_Count[lun] >> 16);
  ReadFormatCapacity_Data[6] = (uint8_t)(Mass_Block_Count[lun] >>  8);
  ReadFormatCapacity_Data[7] = (uint8_t)(Mass_Block_Count[lun]);

  ReadFormatCapacity_Data[9] = (uint8_t)(Mass_Block_Size[lun] >>  16);
  ReadFormatCapacity_Data[10] = (uint8_t)(Mass_Block_Size[lun] >>  8);
  ReadFormatCapacity_Data[11] = (uint8_t)(Mass_Block_Size[lun]);
  Transfer_Data_Request(ReadFormatCapacity_Data, READ_FORMAT_CAPACITY_DATA_LEN);
}
Exemple #11
0
/*******************************************************************************
* Function Name  : SCSI_ReadCapacity10_Cmd
* Description    : SCSI ReadCapacity10 Command routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void SCSI_ReadCapacity10_Cmd(u8 lun)
{

  if (MAL_GetStatus(lun))
  {
    Set_Scsi_Sense_Data(CBW.bLUN, NOT_READY, MEDIUM_NOT_PRESENT);
    Set_CSW (CSW_CMD_FAILED, SEND_CSW_ENABLE);
    Bot_Abort(DIR_IN);
    return;
  }

  ReadCapacity10_Data[0] = (u8)(Mass_Block_Count[lun] - 1 >> 24);
  ReadCapacity10_Data[1] = (u8)(Mass_Block_Count[lun] - 1 >> 16);
  ReadCapacity10_Data[2] = (u8)(Mass_Block_Count[lun] - 1 >>  8);
  ReadCapacity10_Data[3] = (u8)(Mass_Block_Count[lun] - 1);

  ReadCapacity10_Data[4] = (u8)(Mass_Block_Size[lun] >>  24);
  ReadCapacity10_Data[5] = (u8)(Mass_Block_Size[lun] >>  16);
  ReadCapacity10_Data[6] = (u8)(Mass_Block_Size[lun] >>  8);
  ReadCapacity10_Data[7] = (u8)(Mass_Block_Size[lun]);
  Transfer_Data_Request(ReadCapacity10_Data, READ_CAPACITY10_DATA_LEN);
}
/*******************************************************************************
* Function Name  : SCSI_Format_Cmd
* Description    : Format Commands routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void SCSI_Format_Cmd(void)
{
  MAL_GetStatus();
}
/*******************************************************************************
* Function Name  : SCSI_Valid_Cmd
* Description    : Valid Commands routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void SCSI_TestUnitReady_Cmd(void)
{
  MAL_GetStatus();
  Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE);
}