/*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 */
Пример #2
0
/**************************************************************************//*!
 *
 * @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;    
}