/*FUNCTION*------------------------------------------------------------- * * Function Name : _usb_device_recv_data * Returned Value : USB_OK or error code * Comments : * Receives data on a specified endpoint. * *END*-----------------------------------------------------------------*/ uint_8 _usb_device_recv_data ( /* [IN] the USB_USB_dev_initialize state structure */ _usb_device_handle handle, /* [IN] the Endpoint number */ uint_8 ep_num, /* [IN] buffer to receive data */ uchar_ptr buff_ptr, /* [IN] length of the transfer */ uint_32 size ) { /* Body */ #ifdef _DEVICE_DEBUG_ DEBUG_LOG_TRACE("_usb_device_recv_data"); #endif uint_8 error = USB_OK; XD_STRUCT_PTR xd_ptr; USB_DEV_STATE_STRUCT_PTR usb_dev_ptr; usb_dev_ptr = (USB_DEV_STATE_STRUCT_PTR)handle; USB_lock(); if (!usb_dev_ptr->XD_ENTRIES) { USB_unlock(); #ifdef _DEVICE_DEBUG_ DEBUG_LOG_TRACE("_usb_device_recv_data, transfer in progress"); #endif return USB_STATUS_TRANSFER_IN_PROGRESS; } /* Endif */ /* Get a transfer descriptor for the specified endpoint ** and direction */ USB_XD_QGET(usb_dev_ptr->XD_HEAD, usb_dev_ptr->XD_TAIL, xd_ptr); usb_dev_ptr->XD_ENTRIES--; /* Initialize the new transfer descriptor */ xd_ptr->EP_NUM = ep_num; xd_ptr->BDIRECTION = USB_RECV; xd_ptr->WTOTALLENGTH = size; xd_ptr->WSOFAR = 0; xd_ptr->WSTARTADDRESS = buff_ptr; xd_ptr->BSTATUS = USB_STATUS_TRANSFER_ACCEPTED; error = _usb_dci_vusb20_recv_data(handle, xd_ptr); USB_unlock(); if (error) { #ifdef _DEVICE_DEBUG_ DEBUG_LOG_TRACE("_usb_device_recv_data, receive failed"); #endif return USBERR_RX_FAILED; } /* Endif */ return error; } /* EndBody */
/*FUNCTION*------------------------------------------------------------- * * Function Name : _usb_device_recv_data * Returned Value : USB_OK or error code * Comments : * Receives data on a specified endpoint. * *END*-----------------------------------------------------------------*/ uint8_t _usb_device_recv_data( /* [IN] the USB_USB_dev_initialize state structure */ _usb_device_handle handle, /* [IN] the Endpoint number */ uint8_t ep_num, /* [IN] buffer to receive data */ uint8_t * buff_ptr, /* [IN] length of the transfer */ uint32_t size) { /* Body */ uint8_t error = USB_OK; XD_STRUCT_PTR xd_ptr; USB_DEV_STATE_STRUCT_PTR usb_dev_ptr; TOMBSTONE_USB_DEVICE_DEBUG(0x40210000); #ifdef _DEVICE_DEBUG_ DEBUG_LOG_TRACE("_usb_device_recv_data"); #endif usb_dev_ptr = (USB_DEV_STATE_STRUCT_PTR) handle; #ifdef ENABLE_DCACHE /******************************************************** If system has a data cache, it is assumed that buffer passed to this routine will be aligned on a cache line boundry. The following code will invalidate the buffer before passing it to hardware driver. ********************************************************/ USB_dcache_invalidate_mlines((void *)buff_ptr, size); #endif USB_device_lock(); if (!usb_dev_ptr->XD_ENTRIES) { TOMBSTONE_USB_DEVICE_DEBUG(0x40210001); USB_device_unlock(); #ifdef _DEVICE_DEBUG_ DEBUG_LOG_TRACE("_usb_device_recv_data, transfer in progress"); #endif TOMBSTONE_USB_DEVICE_DEBUG(0x40210002); return USB_STATUS_TRANSFER_IN_PROGRESS; } /* Endif */ /* Get a transfer descriptor for the specified endpoint ** and direction */ USB_XD_QGET(usb_dev_ptr->XD_HEAD, usb_dev_ptr->XD_TAIL, xd_ptr); usb_dev_ptr->XD_ENTRIES--; /* Initialize the new transfer descriptor */ xd_ptr->EP_NUM = ep_num; xd_ptr->BDIRECTION = USB_RECV; xd_ptr->WTOTALLENGTH = size; xd_ptr->WSOFAR = 0; xd_ptr->WSTARTADDRESS = buff_ptr; xd_ptr->BSTATUS = USB_STATUS_TRANSFER_ACCEPTED; TOMBSTONE_USB_DEVICE_DEBUG(0x40210003); error = _usb_dci_vusb20_recv_data(handle, xd_ptr); TOMBSTONE_USB_DEVICE_DEBUG(0x40210004); USB_device_unlock(); if (error) { TOMBSTONE_USB_DEVICE_DEBUG(0x40210005); #ifdef _DEVICE_DEBUG_ DEBUG_LOG_TRACE("_usb_device_recv_data, receive failed"); #endif return USBERR_RX_FAILED; } /* Endif */ TOMBSTONE_USB_DEVICE_DEBUG(0x40210099); return error; } /* EndBody */