/*FUNCTION*------------------------------------------------------------- * * Function Name : _usb_device_shutdown * Returned Value : USB_OK or error code * Comments : * Shutdown an initialized USB device * *END*-----------------------------------------------------------------*/ void _usb_device_shutdown(_usb_device_handle handle) { /* Body */ USB_DEV_STATE_STRUCT_PTR usb_dev_ptr; SERVICE_STRUCT_PTR service_ptr; int ep; ARC_DEBUG_TRACE(ARC_DEBUG_FLAG_CTRL, "shutdown\n"); usb_dev_ptr = (USB_DEV_STATE_STRUCT_PTR)handle; for(ep=0; ep<(usb_dev_ptr->MAX_ENDPOINTS); ep++) { /* Cancel all transfers on all endpoints */ while(_usb_device_get_transfer_status(handle, ep, ARC_USB_RECV) != ARC_USB_STATUS_IDLE) { _usb_device_cancel_transfer(handle, ep, ARC_USB_RECV); } while(_usb_device_get_transfer_status(handle, ep, ARC_USB_SEND) != ARC_USB_STATUS_IDLE) { _usb_device_cancel_transfer(handle, ep, ARC_USB_SEND); } } _usb_dci_vusb20_shutdown(usb_dev_ptr); /* Free all the Callback function structure memory */ for( service_ptr = usb_dev_ptr->SERVICE_HEAD_PTR; service_ptr; service_ptr = service_ptr->NEXT) { USB_printf("_usb_device_shutdown: free service_ptr = 0x%x\n", service_ptr); USB_memfree(service_ptr); } usb_dev_ptr->SERVICE_HEAD_PTR = NULL; _usb_device_cleanup(usb_dev_ptr); } /* EndBody */
/**************************************************************************//*! * * @name msc_write_command * * @brief command requests that the Device write the data transferred by the * Host Computer to the medium. * * @param controller_ID: To identify the controller * @param cbw_ptr : pointer to Command Block Wrapper sent by host * @param csw_residue_ptr: pointer to dCSWDataResidue of Command Status Wrapper * @param csw_status_ptr : pointer to bCSWStatus of Command Status Wrapper * * @return error * *****************************************************************************/ uint_8 msc_write_command ( uint_8 controller_ID, PTR_CBW cbw_ptr, uint_32* csw_residue_ptr, uint_8* csw_status_ptr ) { uint_32 lba = 0; uint_32 num_lba_rx = 0; uint_8 error = USBERR_RX_FAILED; /* initialize sense code values */ g_msc_scsi.request_sense.sense_key = NO_SENSE; g_msc_scsi.request_sense.add_sense_code = NO_SENSE; g_msc_scsi.request_sense.add_sense_code_qual = NO_SENSE; lba = ((uint_32)cbw_ptr->command_block[2] << 24); lba |= ((uint_32)cbw_ptr->command_block[3] << 16); lba |= ((uint_32)cbw_ptr->command_block[4] << 8); lba |= ((uint_32)cbw_ptr->command_block[5]); if(cbw_ptr->command_block[0] == WRITE_10_COMMAND) { num_lba_rx = (uint_16)((uint_16)cbw_ptr->command_block[7] << 8); num_lba_rx |= (uint_16)cbw_ptr->command_block[8]; } else if(cbw_ptr->command_block[0] == WRITE_12_COMMAND) { num_lba_rx = ((uint_32)cbw_ptr->command_block[6] << 24); num_lba_rx |= ((uint_32)cbw_ptr->command_block[7] << 16); num_lba_rx |= ((uint_32)cbw_ptr->command_block[8] << 8); num_lba_rx |= ((uint_32)cbw_ptr->command_block[9]); } g_msc_scsi.thirteen_case_struct.controller_ID = controller_ID; g_msc_scsi.thirteen_case_struct.host_expected_data_len = cbw_ptr->data_length; g_msc_scsi.thirteen_case_struct.host_expected_direction = (uint_8)(cbw_ptr->flag >> USB_CBW_DIRECTION_SHIFT); g_msc_scsi.thirteen_case_struct.device_expected_direction = USB_RECV; g_msc_scsi.thirteen_case_struct.csw_status_ptr = csw_status_ptr; g_msc_scsi.thirteen_case_struct.csw_residue_ptr = csw_residue_ptr; g_msc_scsi.thirteen_case_struct.buffer_ptr = NULL; if(_usb_device_get_transfer_status(&controller_ID, BULK_OUT_ENDPOINT, USB_RECV) != USB_STATUS_IDLE) { (void)_usb_device_cancel_transfer(&controller_ID,BULK_OUT_ENDPOINT, USB_RECV); } g_msc_scsi.thirteen_case_struct.device_expected_data_len = g_msc_scsi.device_info.length_of_each_lba_of_device * num_lba_rx; g_msc_scsi.thirteen_case_struct.lba_txrx_select = TRUE; g_msc_scsi.thirteen_case_struct.lba_info.starting_lba = lba; g_msc_scsi.thirteen_case_struct.lba_info.lba_transfer_num = num_lba_rx; error = msc_thirteen_cases_check(&(g_msc_scsi.thirteen_case_struct)); return error; }