| /*******************************************************************************
|
|
|
| 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.
|
|
|
| *******************************************************************************/
|
|
|
| #ifndef __mvUsbDevPrv_h__ |
| #define __mvUsbDevPrv_h__ |
|
|
| #include "usb/common/mvUsbCore.h" |
| |
| |
| #define USB_TEST_MODE_TEST_PACKET_LENGTH (53) |
| |
| |
| #define USB_XD_QADD(head,tail,XD) \ |
| if ((head) == NULL) { \ |
| (head) = (XD); \ |
| } else { \ |
| (tail)->SCRATCH_PTR->PRIVATE = (XD); \ |
| } /* Endif */ \ |
| (tail) = (XD); \ |
| (XD)->SCRATCH_PTR->PRIVATE = NULL |
| |
| #define USB_XD_QGET(head,tail,XD) \ |
| (XD) = (head); \ |
| if (head) { \ |
| (head) = (XD_STRUCT_PTR)((head)->SCRATCH_PTR->PRIVATE); \ |
| if ((head) == NULL) { \ |
| (tail) = NULL; \ |
| } /* Endif */ \ |
| } /* Endif */ |
| |
| #define EHCI_DTD_QADD(head,tail,dTD) \ |
| if ((head) == NULL) { \ |
| (head) = (dTD); \ |
| } else { \ |
| (tail)->SCRATCH_PTR->PRIVATE = (void *) (dTD); \ |
| } /* Endif */ \ |
| (tail) = (dTD); \ |
| (dTD)->SCRATCH_PTR->PRIVATE = NULL |
| |
| #define EHCI_DTD_QGET(head,tail,dTD) \ |
| (dTD) = (head); \ |
| if (head) { \ |
| (head) = (head)->SCRATCH_PTR->PRIVATE; \ |
| if ((head) == NULL) { \ |
| (tail) = NULL; \ |
| } /* Endif */ \ |
| } /* Endif */ |
| |
| /*************************************** |
| ** |
| ** Data structures |
| ** |
| */ |
| |
| typedef struct |
| { |
| uint_32 usb_isr_count; |
| uint_32 usb_reset_count; |
| uint_32 usb_send_count; |
| uint_32 usb_recv_count; |
| uint_32 usb_setup_count; |
| uint_32 free_XD_count; |
| uint_32 free_dTD_count; |
| uint_32 usb_cancel_count; |
| uint_32 usb_add_count; |
| uint_32 usb_add_not_empty_count; |
| uint_32 usb_empty_isr_count; |
| uint_32 usb_empty_complete_count; |
| uint_32 usb_read_setup_count; |
| uint_32 usb_complete_isr_count; |
| uint_32 usb_complete_count; |
| uint_32 usb_complete_max_count; |
| uint_32 usb_port_change_count; |
| uint_32 usb_suspend_count; |
| uint_32 usb_complete_ep_count[ARC_USB_MAX_ENDPOINTS*2]; |
| |
| } USB_STATS; |
| |
| |
| |
| /* Callback function storage structure */ |
| typedef struct service_struct |
| { |
| uint_8 TYPE; |
| void (_CODE_PTR_ SERVICE)(pointer, uint_8, boolean, uint_8, uint_8_ptr, uint_32, uint_8); |
| struct service_struct _PTR_ NEXT; |
| |
| } SERVICE_STRUCT, _PTR_ SERVICE_STRUCT_PTR; |
| |
| typedef struct xd_struct |
| { |
| uint_8 EP_NUM; /* Endpoint number */ |
| uint_8 BDIRECTION; /* Direction : Send/Receive */ |
| uint_8 EP_TYPE; /* Type of the endpoint: Ctrl, Isoch, Bulk, Int */ |
| uint_8 BSTATUS; /* Current transfer status */ |
| uint_8_ptr WSTARTADDRESS; /* Address of first byte */ |
| uint_32 WTOTALLENGTH; /* Number of bytes to send/recv */ |
| uint_32 WSOFAR; /* Number of bytes recv'd so far */ |
| uint_16 WMAXPACKETSIZE; /* Max Packet size */ |
| boolean DONT_ZERO_TERMINATE; |
| uint_8 MAX_PKTS_PER_UFRAME; |
| SCRATCH_STRUCT *SCRATCH_PTR; |
| } XD_STRUCT, _PTR_ XD_STRUCT_PTR; |
| |
| /* The USB Device State Structure */ |
| typedef struct |
| { |
| boolean BUS_RESETTING; /* Device is |
| ** being reset */ |
| volatile VUSB20_REG_STRUCT_PTR CAP_REGS_PTR; /* Capabilities registers */ |
| |
| volatile VUSB20_REG_STRUCT_PTR DEV_PTR; /* Device Controller |
| ** Register base |
| ** address */ |
| |
| SERVICE_STRUCT_PTR SERVICE_HEAD_PTR; /* Head struct |
| ** address of |
| ** registered services |
| */ |
| XD_STRUCT_PTR TEMP_XD_PTR; /* Temp xd for ep init */ |
| XD_STRUCT_PTR XD_BASE; |
| XD_STRUCT_PTR XD_HEAD; /* Head Transaction |
| ** descriptors |
| */ |
| XD_STRUCT_PTR XD_TAIL; /* Tail Transaction |
| ** descriptors |
| */ |
| uint_32 XD_ENTRIES; |
| uint_8* EP_QUEUE_HEAD_BASE; |
| uint_32 EP_QUEUE_HEAD_PHYS; |
| uint_32 EP_QUEUE_HEAD_SIZE; |
| VUSB20_EP_QUEUE_HEAD_STRUCT_PTR EP_QUEUE_HEAD_PTR; /* Endpoint Queue head */ |
| |
| uint_8* DTD_BASE_PTR; /* Device transfer descriptor pool address */ |
| uint_32 DTD_BASE_PHYS; |
| uint_32 DTD_SIZE; |
| VUSB20_EP_TR_STRUCT_PTR DTD_ALIGNED_BASE_PTR;/* Aligned transfer descriptor pool address */ |
| |
| VUSB20_EP_TR_STRUCT_PTR DTD_HEAD; |
| VUSB20_EP_TR_STRUCT_PTR DTD_TAIL; |
| VUSB20_EP_TR_STRUCT_PTR EP_DTD_HEADS[ARC_USB_MAX_ENDPOINTS * 2]; |
| VUSB20_EP_TR_STRUCT_PTR EP_DTD_TAILS[ARC_USB_MAX_ENDPOINTS * 2]; |
| SCRATCH_STRUCT_PTR XD_SCRATCH_STRUCT_BASE; |
| |
| |
| SCRATCH_STRUCT_PTR SCRATCH_STRUCT_BASE; |
| |
| uint_16 USB_STATE; |
| uint_16 USB_DEVICE_STATE; |
| uint_16 USB_SOF_COUNT; |
| uint_16 DTD_ENTRIES; |
| uint_16 ERRORS;
|
| uint_16 ERROR_STATE; |
| uint_16 USB_DEV_STATE_B4_SUSPEND; |
| uint_8 DEV_NUM; /* USB device number |
| ** on the board |
| */ |
| uint_8 SPEED; /* Low Speed, |
| ** High Speed, |
| ** Full Speed |
| */ |
| uint_8 MAX_ENDPOINTS; /* Max endpoints |
| ** supported by this |
| ** device |
| */ |
| |
| uint_8 USB_CURR_CONFIG; |
| uint_8 DEVICE_ADDRESS; |
| uint_8 FORCE_FS; |
| USB_STATS STATS; |
| |
| uint_8* STATUS_UNAIGNED_PTR; |
| uint_16* STATUS_PTR; |
| |
| uint_8* TEST_PKT_UNAIGNED_PTR; |
| uint_8* TEST_PKT_PTR; |
| |
| } USB_DEV_STATE_STRUCT, _PTR_ USB_DEV_STATE_STRUCT_PTR; |
| |
| /* ONLY For data bases allocated by the driver (when PHYS and VIRT bases are known) */ |
| #define USB_EP_QH_VIRT_TO_PHYS(handle, virtAddr) \ |
| (((virtAddr) == NULL) ? 0 : ((handle)->EP_QUEUE_HEAD_PHYS + \ |
| ((uint_32)(virtAddr) - (uint_32)(handle)->EP_QUEUE_HEAD_BASE))) |
| |
| #define USB_DTD_VIRT_TO_PHYS(handle, virtAddr) \ |
| (((virtAddr) == NULL) ? 0 : ((handle)->DTD_BASE_PHYS + \ |
| ((uint_32)(virtAddr) - (uint_32)(handle)->DTD_BASE_PTR))) |
| |
| #define USB_DTD_PHYS_TO_VIRT(handle, physAddr) \ |
| (((physAddr) == 0) ? NULL : ((handle)->DTD_BASE_PTR + \ |
| ((physAddr) - (handle)->DTD_BASE_PHYS))) |
| |
| |
| /*************************************** |
| ** |
| ** Prototypes |
| ** |
| */ |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| extern uint_8 _usb_device_call_service(void* handle, uint_8, boolean, |
| boolean, uint_8_ptr, uint_32, uint_8); |
| |
| extern uint_8 _usb_dci_vusb20_init(uint_8, _usb_device_handle); |
| extern void _usb_device_free_XD(pointer); |
| extern void _usb_dci_vusb20_free_dTD(pointer); |
| extern uint_8 _usb_dci_vusb20_add_dTD(_usb_device_handle, XD_STRUCT_PTR); |
| extern uint_8 _usb_dci_vusb20_cancel_transfer(_usb_device_handle, uint_8, uint_8); |
| extern uint_8 _usb_dci_vusb20_get_transfer_status(_usb_device_handle, uint_8, uint_8); |
| extern XD_STRUCT_PTR _usb_dci_vusb20_get_transfer_details(_usb_device_handle, uint_8, uint_8); |
| extern void _usb_dci_vusb20_process_tr_complete(_usb_device_handle); |
| extern void _usb_dci_vusb20_process_reset(_usb_device_handle); |
| extern void _usb_dci_vusb20_process_tr_complete(_usb_device_handle); |
| extern void _usb_dci_vusb20_process_suspend(_usb_device_handle); |
| extern void _usb_dci_vusb20_process_SOF(_usb_device_handle); |
| extern void _usb_dci_vusb20_process_port_change(_usb_device_handle); |
| extern void _usb_dci_vusb20_process_error(_usb_device_handle); |
| extern void _usb_dci_vusb20_shutdown(_usb_device_handle); |
| extern void _usb_dci_vusb20_set_speed_full(_usb_device_handle, uint_8); |
| extern void _usb_dci_vusb20_suspend_phy(_usb_device_handle, uint_8); |
| extern void _usb_dci_vusb20_hnp_shutdown(void); |
| extern void _usb_dci_vusb20_set_address(_usb_device_handle, uint_8); |
| extern void _usb_dci_vusb20_get_setup_data(_usb_device_handle, uint_8, uint_8_ptr); |
| extern void _usb_dci_vusb20_assert_resume(_usb_device_handle); |
| extern uint_8 _usb_dci_vusb20_init_endpoint(_usb_device_handle, XD_STRUCT_PTR); |
| extern void _usb_dci_vusb20_stall_endpoint(_usb_device_handle, uint_8, uint_8); |
| extern void _usb_dci_vusb20_unstall_endpoint(_usb_device_handle, uint_8, uint_8);
|
| extern uint_8 _usb_dci_vusb20_is_endpoint_stalled(_usb_device_handle, uint_8, uint_8); |
| extern uint_8 _usb_dci_vusb20_deinit_endpoint(_usb_device_handle, uint_8, uint_8); |
| extern void _usb_dci_vusb20_chip_initialize(_usb_device_handle); |
| extern void _usb_dci_vusb20_stop(_usb_device_handle handle); |
| extern void _usb_dci_vusb20_start(_usb_device_handle handle); |
| |
| #if defined(USB_UNDERRUN_WA) |
| |
| extern uint_8* usbSramBase; |
| extern int usbSramSize; |
| |
| void _usb_reset_send_queue(void); |
| void usbSendComplete(void* handle, uint_8 type, boolean setup, uint_8 dir, |
| uint_8_ptr buffer, uint_32 length, uint_8 error); |
| #endif /* USB_UNDERRUN_WA */ |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif |