636 lines
22 KiB
C
636 lines
22 KiB
C
|
/*******************************************************************************
|
||
|
|
||
|
This software file (the "File") is distributed by Marvell International Ltd.
|
||
|
or its affiliate(s) under the terms of the GNU General Public License Version 2,
|
||
|
June 1991 (the "License"). You may use, redistribute and/or modify this File
|
||
|
in accordance with the terms and conditions of the License, a copy of which
|
||
|
is available along with the File in the license.txt file or by writing to the
|
||
|
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||
|
or on the worldwide web at http://www.gnu.org/licenses/gpl.txt.
|
||
|
|
||
|
THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
|
||
|
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
|
||
|
DISCLAIMED. The GPL License provides additional details about this warranty
|
||
|
disclaimer.
|
||
|
|
||
|
(C) Copyright 2004 - 2007 Marvell Semiconductor Israel Ltd. All Rights Reserved.
|
||
|
(C) Copyright 1999 - 2004 Chipidea Microelectronica, S.A. All Rights Reserved.
|
||
|
|
||
|
*******************************************************************************/
|
||
|
|
||
|
#include "usb/api/mvUsbDevApi.h"
|
||
|
#include "usb/device/mvUsbDevPrv.h"
|
||
|
|
||
|
|
||
|
/*FUNCTION*-------------------------------------------------------------
|
||
|
*
|
||
|
* Function Name : _usb_device_unstall_endpoint
|
||
|
* Returned Value : USB_OK or error code
|
||
|
* Comments :
|
||
|
* Unstalls the endpoint in specified direction
|
||
|
*
|
||
|
*END*-----------------------------------------------------------------*/
|
||
|
void _usb_device_unstall_endpoint
|
||
|
(
|
||
|
/* [IN] the USB_USB_dev_initialize state structure */
|
||
|
_usb_device_handle handle,
|
||
|
|
||
|
/* [IN] the Endpoint number */
|
||
|
uint_8 ep_num,
|
||
|
|
||
|
/* [IN] direction */
|
||
|
uint_8 direction
|
||
|
)
|
||
|
{ /* Body */
|
||
|
USB_DEV_STATE_STRUCT_PTR usb_dev_ptr;
|
||
|
int lockKey;
|
||
|
|
||
|
usb_dev_ptr = (USB_DEV_STATE_STRUCT_PTR)handle;
|
||
|
|
||
|
lockKey = USB_lock();
|
||
|
|
||
|
_usb_dci_vusb20_unstall_endpoint(handle, ep_num, direction);
|
||
|
|
||
|
USB_unlock(lockKey);
|
||
|
|
||
|
} /* EndBody */
|
||
|
|
||
|
/*FUNCTION*----------------------------------------------------------------
|
||
|
*
|
||
|
* Function Name : _usb_device_get_status
|
||
|
* Returned Value : USB_OK or error code
|
||
|
* Comments :
|
||
|
* Provides API to access the USB internal state.
|
||
|
*
|
||
|
*END*--------------------------------------------------------------------*/
|
||
|
uint_8 _usb_device_get_status
|
||
|
(
|
||
|
/* [IN] Handle to the USB device */
|
||
|
_usb_device_handle handle,
|
||
|
|
||
|
/* [IN] What to get the status of */
|
||
|
uint_8 component,
|
||
|
|
||
|
/* [OUT] The requested status */
|
||
|
uint_16_ptr status
|
||
|
)
|
||
|
{ /* Body */
|
||
|
USB_DEV_STATE_STRUCT_PTR usb_dev_ptr;
|
||
|
int lockKey;
|
||
|
|
||
|
usb_dev_ptr = (USB_DEV_STATE_STRUCT_PTR)handle;
|
||
|
|
||
|
lockKey = USB_lock();
|
||
|
|
||
|
switch (component)
|
||
|
{
|
||
|
case ARC_USB_STATUS_DEVICE_STATE:
|
||
|
*status = usb_dev_ptr->USB_STATE;
|
||
|
break;
|
||
|
|
||
|
case ARC_USB_STATUS_DEVICE:
|
||
|
*status = usb_dev_ptr->USB_DEVICE_STATE;
|
||
|
break;
|
||
|
|
||
|
case ARC_USB_STATUS_INTERFACE:
|
||
|
*status = 0;
|
||
|
break;
|
||
|
|
||
|
case ARC_USB_STATUS_ADDRESS:
|
||
|
*status = usb_dev_ptr->DEVICE_ADDRESS;
|
||
|
break;
|
||
|
|
||
|
case ARC_USB_STATUS_CURRENT_CONFIG:
|
||
|
*status = usb_dev_ptr->USB_CURR_CONFIG;
|
||
|
break;
|
||
|
|
||
|
case ARC_USB_STATUS_SOF_COUNT:
|
||
|
*status = usb_dev_ptr->USB_SOF_COUNT;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
USB_unlock(lockKey);
|
||
|
USB_printf("_usb_device_get_status, bad status\n");
|
||
|
return USBERR_BAD_STATUS;
|
||
|
|
||
|
} /* Endswitch */
|
||
|
USB_unlock(lockKey);
|
||
|
|
||
|
return USB_OK;
|
||
|
} /* EndBody */
|
||
|
|
||
|
/*FUNCTION*----------------------------------------------------------------
|
||
|
*
|
||
|
* Function Name : _usb_device_set_status
|
||
|
* Returned Value : USB_OK or error code
|
||
|
* Comments :
|
||
|
* Provides API to set internal state
|
||
|
*
|
||
|
*END*--------------------------------------------------------------------*/
|
||
|
uint_8 _usb_device_set_status
|
||
|
(
|
||
|
/* [IN] Handle to the usb device */
|
||
|
_usb_device_handle handle,
|
||
|
|
||
|
/* [IN] What to set the status of */
|
||
|
uint_8 component,
|
||
|
|
||
|
/* [IN] What to set the status to */
|
||
|
uint_16 setting
|
||
|
)
|
||
|
{ /* Body */
|
||
|
USB_DEV_STATE_STRUCT_PTR usb_dev_ptr;
|
||
|
int lockKey;
|
||
|
|
||
|
ARC_DEBUG_TRACE(ARC_DEBUG_FLAG_STATUS,
|
||
|
"set_status: component=0x%x, value=0x%x\n", component, setting);
|
||
|
|
||
|
usb_dev_ptr = (USB_DEV_STATE_STRUCT_PTR)handle;
|
||
|
lockKey = USB_lock();
|
||
|
|
||
|
switch (component)
|
||
|
{
|
||
|
case ARC_USB_STATUS_DEVICE_STATE:
|
||
|
usb_dev_ptr->USB_STATE = setting;
|
||
|
break;
|
||
|
|
||
|
case ARC_USB_STATUS_DEVICE:
|
||
|
usb_dev_ptr->USB_DEVICE_STATE = setting;
|
||
|
break;
|
||
|
|
||
|
case ARC_USB_STATUS_INTERFACE:
|
||
|
break;
|
||
|
|
||
|
case ARC_USB_STATUS_CURRENT_CONFIG:
|
||
|
usb_dev_ptr->USB_CURR_CONFIG = setting;
|
||
|
break;
|
||
|
|
||
|
case ARC_USB_STATUS_SOF_COUNT:
|
||
|
usb_dev_ptr->USB_SOF_COUNT = setting;
|
||
|
break;
|
||
|
|
||
|
case ARC_USB_FORCE_FULL_SPEED:
|
||
|
_usb_dci_vusb20_set_speed_full((pointer)usb_dev_ptr, setting);
|
||
|
break;
|
||
|
|
||
|
case ARC_USB_PHY_LOW_POWER_SUSPEND:
|
||
|
_usb_dci_vusb20_suspend_phy((pointer)usb_dev_ptr, setting);
|
||
|
break;
|
||
|
|
||
|
case ARC_USB_STATUS_ADDRESS:
|
||
|
usb_dev_ptr->DEVICE_ADDRESS = setting;
|
||
|
|
||
|
_usb_dci_vusb20_set_address((pointer)usb_dev_ptr, setting);
|
||
|
break;
|
||
|
|
||
|
case ARC_USB_STATUS_TEST_MODE:
|
||
|
_usb_dci_vusb20_set_test_mode(handle, setting);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
USB_unlock(lockKey);
|
||
|
USB_printf("_usb_device_set_status, bad status\n");
|
||
|
return USBERR_BAD_STATUS;
|
||
|
|
||
|
} /* Endswitch */
|
||
|
|
||
|
USB_unlock(lockKey);
|
||
|
|
||
|
return USB_OK;
|
||
|
} /* EndBody */
|
||
|
|
||
|
/*FUNCTION*-------------------------------------------------------------
|
||
|
*
|
||
|
* Function Name : _usb_device_stall_endpoint
|
||
|
* Returned Value : USB_OK or error code
|
||
|
* Comments :
|
||
|
* Stalls the endpoint.
|
||
|
*
|
||
|
*END*-----------------------------------------------------------------*/
|
||
|
void _usb_device_stall_endpoint
|
||
|
(
|
||
|
/* [IN] the USB_USB_dev_initialize state structure */
|
||
|
_usb_device_handle handle,
|
||
|
|
||
|
/* [IN] the Endpoint number */
|
||
|
uint_8 ep_num,
|
||
|
|
||
|
/* [IN] direction */
|
||
|
uint_8 direction
|
||
|
)
|
||
|
{ /* Body */
|
||
|
USB_DEV_STATE_STRUCT_PTR usb_dev_ptr;
|
||
|
int lockKey;
|
||
|
|
||
|
usb_dev_ptr = (USB_DEV_STATE_STRUCT_PTR)handle;
|
||
|
|
||
|
lockKey = USB_lock();
|
||
|
|
||
|
_usb_dci_vusb20_stall_endpoint(handle, ep_num, direction);
|
||
|
|
||
|
USB_unlock(lockKey);
|
||
|
|
||
|
} /* EndBody */
|
||
|
|
||
|
/*FUNCTION*-------------------------------------------------------------
|
||
|
*
|
||
|
* Function Name : _usb_device_is_endpoint_stalled
|
||
|
* Returned Value : USB_OK or error code
|
||
|
* Comments :
|
||
|
* Stalls the endpoint.
|
||
|
*
|
||
|
*END*-----------------------------------------------------------------*/
|
||
|
uint_8 _usb_device_is_endpoint_stalled
|
||
|
(
|
||
|
/* [IN] the USB_USB_dev_initialize state structure */
|
||
|
_usb_device_handle handle,
|
||
|
|
||
|
/* [IN] the Endpoint number */
|
||
|
uint_8 ep_num,
|
||
|
|
||
|
/* [IN] direction */
|
||
|
uint_8 direction
|
||
|
)
|
||
|
{ /* Body */
|
||
|
USB_DEV_STATE_STRUCT_PTR usb_dev_ptr;
|
||
|
uint_8 val;
|
||
|
int lockKey;
|
||
|
|
||
|
usb_dev_ptr = (USB_DEV_STATE_STRUCT_PTR)handle;
|
||
|
|
||
|
lockKey = USB_lock();
|
||
|
|
||
|
val = _usb_dci_vusb20_is_endpoint_stalled(handle, ep_num, direction);
|
||
|
|
||
|
USB_unlock(lockKey);
|
||
|
|
||
|
return val;
|
||
|
|
||
|
} /* EndBody */
|
||
|
|
||
|
|
||
|
/*FUNCTION*-------------------------------------------------------------
|
||
|
*
|
||
|
* Function Name : _usb_device_process_resume
|
||
|
* Returned Value : USB_OK or error code
|
||
|
* Comments :
|
||
|
* Process Resume event
|
||
|
*
|
||
|
*END*-----------------------------------------------------------------*/
|
||
|
void _usb_device_assert_resume
|
||
|
(
|
||
|
/* [IN] the USB_USB_dev_initialize state structure */
|
||
|
_usb_device_handle handle
|
||
|
)
|
||
|
{ /* Body */
|
||
|
USB_DEV_STATE_STRUCT_PTR usb_dev_ptr;
|
||
|
|
||
|
usb_dev_ptr = (USB_DEV_STATE_STRUCT_PTR)handle;
|
||
|
|
||
|
_usb_dci_vusb20_assert_resume(handle);
|
||
|
|
||
|
} /* EndBody */
|
||
|
|
||
|
|
||
|
/***************************/
|
||
|
/* ARC USB Debug functions */
|
||
|
/***************************/
|
||
|
void _usb_status(void* usbHandle)
|
||
|
{
|
||
|
USB_DEV_STATE_STRUCT* pUsbDev = (USB_DEV_STATE_STRUCT*)usbHandle;
|
||
|
|
||
|
if(pUsbDev == NULL)
|
||
|
{
|
||
|
USB_printf("USB Device core is not initialized\n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
USB_printf("\n\tUSB Status\n\n");
|
||
|
|
||
|
USB_printf("DEV_NUM=%d, DEV_ADDR=%d, CAP_REGS=0x%x, DEV_REGS=0x%x, MAX_EP=%d\n",
|
||
|
pUsbDev->DEV_NUM,
|
||
|
pUsbDev->DEVICE_ADDRESS,
|
||
|
(unsigned)pUsbDev->CAP_REGS_PTR,
|
||
|
(unsigned)pUsbDev->DEV_PTR,
|
||
|
pUsbDev->MAX_ENDPOINTS);
|
||
|
|
||
|
USB_printf("BUS_RESET=%s, STATE=0x%02x, DEV_STATE=0x%02x, SPEED=%d, ERRORS=%d, ERROR_STATE=0x%04x\n",
|
||
|
pUsbDev->BUS_RESETTING ? "Yes" : "No",
|
||
|
pUsbDev->USB_STATE,
|
||
|
pUsbDev->USB_DEVICE_STATE,
|
||
|
pUsbDev->SPEED,
|
||
|
pUsbDev->ERRORS,
|
||
|
pUsbDev->ERROR_STATE);
|
||
|
|
||
|
USB_printf("EP_QUEUE_HEAD: SIZE=%d, BASE=%p (0x%08x), ALIGNED=%p, SERVICE_HEAD=%p\n",
|
||
|
pUsbDev->EP_QUEUE_HEAD_SIZE,
|
||
|
pUsbDev->EP_QUEUE_HEAD_BASE,
|
||
|
pUsbDev->EP_QUEUE_HEAD_PHYS,
|
||
|
pUsbDev->EP_QUEUE_HEAD_PTR,
|
||
|
pUsbDev->SERVICE_HEAD_PTR);
|
||
|
|
||
|
USB_printf("XD: BASE=%p, HEAD=%p, TAIL=%p, ENTRIES=%d, SCRATCH=%p, TEMP=%p\n",
|
||
|
pUsbDev->XD_BASE,
|
||
|
pUsbDev->XD_HEAD,
|
||
|
pUsbDev->XD_TAIL,
|
||
|
pUsbDev->XD_ENTRIES,
|
||
|
pUsbDev->XD_SCRATCH_STRUCT_BASE,
|
||
|
pUsbDev->TEMP_XD_PTR);
|
||
|
|
||
|
USB_printf("DTD: SIZE=%d, BASE=%p (0x%08x), ALIGNED=%p, HEAD=0x%08x, TAIL=0x%08x, ENTRIES=%d, SCRATCH=%p\n",
|
||
|
pUsbDev->DTD_SIZE,
|
||
|
pUsbDev->DTD_BASE_PTR,
|
||
|
pUsbDev->DTD_BASE_PHYS,
|
||
|
pUsbDev->DTD_ALIGNED_BASE_PTR,
|
||
|
pUsbDev->DTD_HEAD,
|
||
|
pUsbDev->DTD_TAIL,
|
||
|
pUsbDev->DTD_ENTRIES,
|
||
|
pUsbDev->SCRATCH_STRUCT_BASE);
|
||
|
}
|
||
|
|
||
|
void _usb_stats(void* usbHandle)
|
||
|
{
|
||
|
USB_DEV_STATE_STRUCT* pUsbDev = (USB_DEV_STATE_STRUCT*)usbHandle;
|
||
|
USB_STATS* pUsbStats = &pUsbDev->STATS;
|
||
|
int i;
|
||
|
|
||
|
USB_printf("\n\tUSB Statistics\n\n");
|
||
|
|
||
|
USB_printf("isr=%u, empty_isr=%u, reset=%u, setup=%u, read_setup=%u\n",
|
||
|
pUsbStats->usb_isr_count, pUsbStats->usb_empty_isr_count,
|
||
|
pUsbStats->usb_reset_count, pUsbStats->usb_setup_count,
|
||
|
pUsbStats->usb_read_setup_count);
|
||
|
|
||
|
USB_printf("recv=%u, send=%u, add=%u (%u), cancel=%u\n",
|
||
|
pUsbStats->usb_recv_count, pUsbStats->usb_send_count,
|
||
|
pUsbStats->usb_add_count, pUsbStats->usb_add_not_empty_count,
|
||
|
pUsbStats->usb_cancel_count);
|
||
|
|
||
|
USB_printf("free_XD=%u, free_dTD=%u\n",
|
||
|
pUsbStats->free_XD_count, pUsbStats->free_dTD_count);
|
||
|
|
||
|
USB_printf("complete_isr=%u, complete=%u, empty_complete=%u, max_complete=%u\n",
|
||
|
pUsbStats->usb_complete_isr_count, pUsbStats->usb_complete_count,
|
||
|
pUsbStats->usb_empty_complete_count, pUsbStats->usb_complete_max_count);
|
||
|
|
||
|
USB_printf("port_change=%u, suspend=%u\n",
|
||
|
pUsbStats->usb_port_change_count, pUsbStats->usb_suspend_count);
|
||
|
for(i=0; i<(pUsbDev->MAX_ENDPOINTS); i++)
|
||
|
{
|
||
|
if( (pUsbStats->usb_complete_ep_count[i*2] == 0) &&
|
||
|
(pUsbStats->usb_complete_ep_count[i*2+1] == 0) )
|
||
|
continue;
|
||
|
|
||
|
USB_printf("EP #%d: RECV (OUT) = %3u, \tSEND (IN) = %u\n", i,
|
||
|
pUsbStats->usb_complete_ep_count[i*2],
|
||
|
pUsbStats->usb_complete_ep_count[i*2+1]);
|
||
|
}
|
||
|
USB_printf("\n");
|
||
|
}
|
||
|
|
||
|
void _usb_clear_stats(void* usbHandle)
|
||
|
{
|
||
|
USB_DEV_STATE_STRUCT* pUsbDev = (USB_DEV_STATE_STRUCT*)usbHandle;
|
||
|
|
||
|
USB_memzero(&pUsbDev->STATS, sizeof(pUsbDev->STATS));
|
||
|
}
|
||
|
|
||
|
void _usb_regs(void* usbHandle)
|
||
|
{
|
||
|
USB_DEV_STATE_STRUCT* pUsbDev = (USB_DEV_STATE_STRUCT*)usbHandle;
|
||
|
VUSB20_REG_STRUCT* cap_regs, *dev_regs;
|
||
|
int dev_num;
|
||
|
|
||
|
if(pUsbDev == NULL)
|
||
|
{
|
||
|
USB_printf("USB Device core is not initialized\n");
|
||
|
return;
|
||
|
}
|
||
|
USB_printf("\n\tUSB Capability Registers\n\n");
|
||
|
|
||
|
cap_regs = pUsbDev->CAP_REGS_PTR;
|
||
|
USB_printf("CAPLENGTH_HCIVER (0x%08x) = 0x%08x\n",
|
||
|
(unsigned)&cap_regs->REGISTERS.CAPABILITY_REGISTERS.CAPLENGTH_HCIVER,
|
||
|
(unsigned)USB_32BIT_LE(cap_regs->REGISTERS.CAPABILITY_REGISTERS.CAPLENGTH_HCIVER));
|
||
|
|
||
|
USB_printf("DCI_VERSION (0x%08x) = 0x%08x\n",
|
||
|
(unsigned)&cap_regs->REGISTERS.CAPABILITY_REGISTERS.DCI_VERSION,
|
||
|
(unsigned)USB_32BIT_LE(cap_regs->REGISTERS.CAPABILITY_REGISTERS.DCI_VERSION));
|
||
|
|
||
|
USB_printf("DCC_PARAMS (0x%08x) = 0x%08x\n",
|
||
|
(unsigned)&cap_regs->REGISTERS.CAPABILITY_REGISTERS.DCC_PARAMS,
|
||
|
(unsigned)USB_32BIT_LE(cap_regs->REGISTERS.CAPABILITY_REGISTERS.DCC_PARAMS));
|
||
|
|
||
|
dev_regs = pUsbDev->DEV_PTR;
|
||
|
dev_num = pUsbDev->DEV_NUM;
|
||
|
USB_printf("\n\tUSB Device Operational Registers\n\n");
|
||
|
|
||
|
USB_printf("USB_CMD (0x%08x) = 0x%08x\n",
|
||
|
(unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.USB_CMD,
|
||
|
(unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.USB_CMD));
|
||
|
|
||
|
USB_printf("USB_STS (0x%08x) = 0x%08x\n",
|
||
|
(unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.USB_STS,
|
||
|
(unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.USB_STS));
|
||
|
|
||
|
USB_printf("USB_INTR (0x%08x) = 0x%08x\n",
|
||
|
(unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.USB_INTR,
|
||
|
(unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.USB_INTR));
|
||
|
|
||
|
USB_printf("USB_FRINDEX (0x%08x) = 0x%08x\n",
|
||
|
(unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.USB_FRINDEX,
|
||
|
(unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.USB_FRINDEX));
|
||
|
|
||
|
/* Skip CTRLDSSEGMENT register */
|
||
|
USB_printf("DEVICE_ADDR (0x%08x) = 0x%08x\n",
|
||
|
(unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.DEVICE_ADDR,
|
||
|
(unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.DEVICE_ADDR));
|
||
|
|
||
|
USB_printf("EP_LIST_ADDR (0x%08x) = 0x%08x\n",
|
||
|
(unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.EP_LIST_ADDR,
|
||
|
(unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.EP_LIST_ADDR));
|
||
|
|
||
|
/* Skip CONFIG_FLAG register */
|
||
|
|
||
|
/* Skip PORTSCX[0..15] registers*/
|
||
|
USB_printf("PORTSCX[0] (0x%08x) = 0x%08x\n",
|
||
|
(unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.PORTSCX[0],
|
||
|
(unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.PORTSCX[0]));
|
||
|
|
||
|
/* Skip OTGSC register */
|
||
|
|
||
|
USB_printf("USB_MODE (0x%08x) = 0x%08x\n",
|
||
|
(unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.USB_MODE,
|
||
|
(unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.USB_MODE));
|
||
|
|
||
|
USB_printf("ENDPT_SETUP_STAT (0x%08x) = 0x%08x\n",
|
||
|
(unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPT_SETUP_STAT,
|
||
|
(unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPT_SETUP_STAT));
|
||
|
|
||
|
USB_printf("ENDPTPRIME (0x%08x) = 0x%08x\n",
|
||
|
(unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPTPRIME,
|
||
|
(unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPTPRIME));
|
||
|
|
||
|
USB_printf("ENDPTFLUSH (0x%08x) = 0x%08x\n",
|
||
|
(unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPTFLUSH,
|
||
|
(unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPTFLUSH));
|
||
|
|
||
|
USB_printf("ENDPTSTATUS (0x%08x) = 0x%08x\n",
|
||
|
(unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPTSTATUS,
|
||
|
(unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPTSTATUS));
|
||
|
|
||
|
USB_printf("ENDPTCOMPLETE (0x%08x) = 0x%08x\n",
|
||
|
(unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPTCOMPLETE,
|
||
|
(unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPTCOMPLETE));
|
||
|
}
|
||
|
|
||
|
|
||
|
void _usb_ep_status(void* usbHandle, int ep_num, int direction)
|
||
|
{
|
||
|
USB_DEV_STATE_STRUCT* pUsbDev = (USB_DEV_STATE_STRUCT*)usbHandle;
|
||
|
int i, ep_idx;
|
||
|
VUSB20_EP_QUEUE_HEAD_STRUCT_PTR ep_queue_head_ptr;
|
||
|
VUSB20_EP_TR_STRUCT_PTR dTD_ptr, head_dTD_ptr, tail_dTD_ptr, next_dTD_ptr;
|
||
|
XD_STRUCT_PTR xd_ptr, next_xd_ptr;
|
||
|
VUSB20_REG_STRUCT_PTR dev_regs;
|
||
|
|
||
|
if(pUsbDev == NULL)
|
||
|
{
|
||
|
USB_printf("USB Device core is not initialized\n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
USB_printf("\n\tUSB Endpoint #%d - %s status\n\n", ep_num,
|
||
|
(direction == ARC_USB_SEND) ? "SEND (IN)" : "RECV (OUT)" );
|
||
|
|
||
|
ep_idx = ep_num*2 + direction;
|
||
|
dev_regs = pUsbDev->DEV_PTR;
|
||
|
|
||
|
USB_printf("ENDPTCTRLX[%d] (0x%08x) = 0x%08x\n", ep_num,
|
||
|
(unsigned)&dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPTCTRLX[ep_num],
|
||
|
(unsigned)USB_32BIT_LE(dev_regs->REGISTERS.OPERATIONAL_DEVICE_REGISTERS.ENDPTCTRLX[ep_num]));
|
||
|
|
||
|
ep_queue_head_ptr = (VUSB20_EP_QUEUE_HEAD_STRUCT_PTR)pUsbDev->EP_QUEUE_HEAD_PTR + ep_idx;
|
||
|
|
||
|
head_dTD_ptr = pUsbDev->EP_DTD_HEADS[ep_idx];
|
||
|
tail_dTD_ptr = pUsbDev->EP_DTD_TAILS[ep_idx];
|
||
|
|
||
|
USB_printf("EP_QH=0x%08x: MAX_PKT=0x%x, SIZE_IOC_INT_STS=0x%x, CURR_DTD=0x%x, NEXT_DTD=0x%x\n",
|
||
|
(unsigned)ep_queue_head_ptr, (unsigned)USB_32BIT_LE(ep_queue_head_ptr->MAX_PKT_LENGTH),
|
||
|
(unsigned)USB_32BIT_LE(ep_queue_head_ptr->SIZE_IOC_INT_STS),
|
||
|
(unsigned)USB_32BIT_LE(ep_queue_head_ptr->CURR_DTD_PTR),
|
||
|
(unsigned)USB_32BIT_LE(ep_queue_head_ptr->NEXT_DTD_PTR));
|
||
|
|
||
|
USB_printf("\tBUF_0=0x%08x, BUF_1=0x%08x, BUF_2=0x%08x, BUF_3=0x%08x, BUF_4=0x%08x\n",
|
||
|
(unsigned)USB_32BIT_LE(ep_queue_head_ptr->BUFF_PTR0),
|
||
|
(unsigned)USB_32BIT_LE(ep_queue_head_ptr->BUFF_PTR1),
|
||
|
(unsigned)USB_32BIT_LE(ep_queue_head_ptr->BUFF_PTR2),
|
||
|
(unsigned)USB_32BIT_LE(ep_queue_head_ptr->BUFF_PTR3),
|
||
|
(unsigned)USB_32BIT_LE(ep_queue_head_ptr->BUFF_PTR4));
|
||
|
|
||
|
USB_printf("\tSETUP_BUFFER (%p): ", ep_queue_head_ptr->SETUP_BUFFER);
|
||
|
for(i=0; i<sizeof(ep_queue_head_ptr->SETUP_BUFFER); i++)
|
||
|
USB_printf("%02x", ep_queue_head_ptr->SETUP_BUFFER[i] & 0xFF);
|
||
|
USB_printf("\n");
|
||
|
|
||
|
USB_printf("\ndTD_HEAD=0x%08x, dTD_TAIL=0x%08x\n",
|
||
|
(unsigned)head_dTD_ptr, (unsigned)tail_dTD_ptr);
|
||
|
|
||
|
dTD_ptr = head_dTD_ptr;
|
||
|
i = 0;
|
||
|
while(dTD_ptr != NULL)
|
||
|
{
|
||
|
USB_printf("%d. dTD=0x%08x (0x%08x), SIZE_IOC_STS=0x%08x, BUF_0=0x%08x, NEXT=0x%08x\n",
|
||
|
i, (unsigned)dTD_ptr, USB_DTD_VIRT_TO_PHYS(pUsbDev, dTD_ptr),
|
||
|
(unsigned)USB_32BIT_LE(dTD_ptr->SIZE_IOC_STS),
|
||
|
(unsigned)USB_32BIT_LE(dTD_ptr->BUFF_PTR0),
|
||
|
(unsigned)USB_32BIT_LE(dTD_ptr->NEXT_TR_ELEM_PTR));
|
||
|
|
||
|
xd_ptr = dTD_ptr->SCRATCH_PTR->XD_FOR_THIS_DTD;
|
||
|
|
||
|
next_dTD_ptr = (VUSB20_EP_TR_STRUCT_PTR)USB_DTD_PHYS_TO_VIRT(pUsbDev,
|
||
|
(uint_32)(USB_32BIT_LE(dTD_ptr->NEXT_TR_ELEM_PTR) & VUSBHS_TD_ADDR_MASK));
|
||
|
if(next_dTD_ptr != NULL)
|
||
|
next_xd_ptr = next_dTD_ptr->SCRATCH_PTR->XD_FOR_THIS_DTD;
|
||
|
else
|
||
|
next_xd_ptr = NULL;
|
||
|
|
||
|
if(next_xd_ptr != xd_ptr)
|
||
|
{
|
||
|
USB_printf("\tXD=0x%08x, ADDR=0x%08x, SIZE=%u, STATUS=0x%02x\n",
|
||
|
(unsigned)xd_ptr, (unsigned)xd_ptr->WSTARTADDRESS,
|
||
|
(unsigned)xd_ptr->WTOTALLENGTH, xd_ptr->BSTATUS);
|
||
|
}
|
||
|
i++;
|
||
|
dTD_ptr = next_dTD_ptr;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/* DEBUG */
|
||
|
uint_32 usbDebugFlags = ARC_DEBUG_FLAG_STATS
|
||
|
| ARC_DEBUG_FLAG_INIT
|
||
|
| ARC_DEBUG_FLAG_ERROR
|
||
|
| ARC_DEBUG_FLAG_STALL
|
||
|
| ARC_DEBUG_FLAG_RESET;
|
||
|
/*| ARC_DEBUG_FLAG_TRANSFER;*/
|
||
|
|
||
|
void _usb_debug_set_flags(uint_32 flags)
|
||
|
{
|
||
|
usbDebugFlags = (flags);
|
||
|
}
|
||
|
|
||
|
uint_32 _usb_debug_get_flags(void)
|
||
|
{
|
||
|
return usbDebugFlags;
|
||
|
}
|
||
|
|
||
|
#if defined(MV_USB_TRACE_LOG)
|
||
|
|
||
|
uint_16 DEBUG_TRACE_ARRAY_COUNTER = 0;
|
||
|
char DEBUG_TRACE_ARRAY[TRACE_ARRAY_SIZE][MAX_STRING_SIZE];
|
||
|
|
||
|
void _usb_debug_init_trace_log(void)
|
||
|
{
|
||
|
USB_memzero(DEBUG_TRACE_ARRAY, TRACE_ARRAY_SIZE*MAX_STRING_SIZE);
|
||
|
DEBUG_TRACE_ARRAY_COUNTER =0;
|
||
|
}
|
||
|
|
||
|
void _usb_debug_print_trace_log(void)
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
USB_printf("USB Trace log: start=0x%x, end=0x%x, idx=%d, flags=0x%x\n\n",
|
||
|
&DEBUG_TRACE_ARRAY[0][0], &DEBUG_TRACE_ARRAY[TRACE_ARRAY_SIZE-1][0],
|
||
|
DEBUG_TRACE_ARRAY_COUNTER, usbDebugFlags);
|
||
|
|
||
|
for(i=DEBUG_TRACE_ARRAY_COUNTER; i<TRACE_ARRAY_SIZE; i++)
|
||
|
{
|
||
|
if(DEBUG_TRACE_ARRAY[i][0] == '\0')
|
||
|
continue;
|
||
|
|
||
|
USB_printf("%3d. %s", i, DEBUG_TRACE_ARRAY[i]);
|
||
|
}
|
||
|
for(i=0; i<DEBUG_TRACE_ARRAY_COUNTER; i++)
|
||
|
{
|
||
|
if(DEBUG_TRACE_ARRAY[i][0] == '\0')
|
||
|
continue;
|
||
|
USB_printf("%3d. %s", i, DEBUG_TRACE_ARRAY[i]);
|
||
|
}
|
||
|
_usb_debug_init_trace_log();
|
||
|
}
|
||
|
#else
|
||
|
void _usb_debug_init_trace_log(void)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void _usb_debug_print_trace_log(void)
|
||
|
{
|
||
|
USB_printf("USB trace log is not supported\n");
|
||
|
}
|
||
|
#endif /* MV_USB_TRACE_LOG */
|
||
|
|
||
|
|
||
|
|
||
|
|