/** * @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])); }
/******************************************************************************* * 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); }
/******************************************************************************* * 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 }
/******************************************************************************* * 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 }
/******************************************************************************* * 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); }
/******************************************************************************* * 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); }