1744 lines
92 KiB
C
1744 lines
92 KiB
C
/*
|
|
*********************************************************************************************************
|
|
* uC/USB-Host
|
|
* The Embedded USB Host Stack
|
|
*
|
|
* Copyright 2004-2021 Silicon Laboratories Inc. www.silabs.com
|
|
*
|
|
* SPDX-License-Identifier: APACHE-2.0
|
|
*
|
|
* This software is subject to an open source license and is distributed by
|
|
* Silicon Laboratories Inc. pursuant to the terms of the Apache License,
|
|
* Version 2.0 available at www.apache.org/licenses/LICENSE-2.0.
|
|
*
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* NOTICE
|
|
*
|
|
* Semidrive modified this file to adapt it for ssdk platform.
|
|
* The modifications are only intended for use with Semidrive chips.
|
|
* Copyright of all the modifications belongs to Semidrive Semiconductor.
|
|
*
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
*
|
|
* USB HOST CORE OPERATIONS
|
|
*
|
|
* Filename : usbh_core.h
|
|
* Version : V3.42.01
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* MODULE
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#ifndef USBH_CORE_MODULE_PRESENT
|
|
#define USBH_CORE_MODULE_PRESENT
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* INCLUDE FILES
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#include <cpu.h>
|
|
#include <lib_def.h>
|
|
#include <lib_mem.h>
|
|
#include <usbh_cfg.h>
|
|
#include "usbh_err.h"
|
|
#include "usbh_os.h"
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* EXTERNS
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#ifdef USBH_CORE_MODULE
|
|
#define USBH_CORE_EXT
|
|
#else
|
|
#define USBH_CORE_EXT extern
|
|
#endif
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* DEFINES
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_VERSION 34201u
|
|
|
|
#define USBH_LEN_DESC_HDR 0x02u
|
|
#define USBH_LEN_DESC_DEV 0x12u
|
|
#define USBH_LEN_DESC_DEV_QUAL 0x0Au
|
|
#define USBH_LEN_DESC_CFG 0x09u
|
|
#define USBH_LEN_DESC_OTHERSPD_CFG 0x09u
|
|
#define USBH_LEN_DESC_IF_ASSOCIATION 0x08u
|
|
#define USBH_LEN_DESC_IF 0x09u
|
|
#define USBH_LEN_DESC_EP 0x07u
|
|
#define USBH_LEN_DESC_OTG 0x03u
|
|
#define USBH_LEN_SETUP_PKT 0x08u
|
|
|
|
#define USBH_HUB_TIMEOUT 5000u
|
|
#define USBH_HUB_DLY_DEV_RESET 100u
|
|
#define USBH_HUB_MAX_DESC_LEN 72u
|
|
|
|
#define USBH_HUB_LEN_HUB_DESC 0x48u
|
|
#define USBH_HUB_LEN_HUB_STATUS 0x04u
|
|
#define USBH_HUB_LEN_HUB_PORT_STATUS 0x04u
|
|
|
|
#define USBH_HC_NBR_NONE 0xFFu
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* REQUEST CHARACTERISTICS
|
|
*
|
|
* Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 9.3, Table 9-2.
|
|
*
|
|
* (2) The 'bmRequestType' field of a setup request is a bit-mapped datum with three subfields :
|
|
*
|
|
* (a) Bit 7 : Data transfer direction.
|
|
* (b) Bits 6-5: Type.
|
|
* (c) Bits 4-0: Recipient.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_REQ_DIR_MASK 0x80u
|
|
#define USBH_REQ_DIR_HOST_TO_DEV 0x00u
|
|
#define USBH_REQ_DIR_DEV_TO_HOST 0x80u
|
|
|
|
#define USBH_REQ_TYPE_STD 0x00u
|
|
#define USBH_REQ_TYPE_CLASS 0x20u
|
|
#define USBH_REQ_TYPE_VENDOR 0x40u
|
|
#define USBH_REQ_TYPE_RSVD 0x60u
|
|
|
|
#define USBH_REQ_RECIPIENT_DEV 0x00u
|
|
#define USBH_REQ_RECIPIENT_IF 0x01u
|
|
#define USBH_REQ_RECIPIENT_EP 0x02u
|
|
#define USBH_REQ_RECIPIENT_OTHER 0x03u
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* STANDARD REQUESTS
|
|
*
|
|
* Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 9.4, Table 9-4.
|
|
*
|
|
* (2) The 'bRequest' field of a standard setup request may contain one of these values.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_REQ_GET_STATUS 0x00u
|
|
#define USBH_REQ_CLR_FEATURE 0x01u
|
|
#define USBH_REQ_SET_FEATURE 0x03u
|
|
#define USBH_REQ_SET_ADDR 0x05u
|
|
#define USBH_REQ_GET_DESC 0x06u
|
|
#define USBH_REQ_SET_DESC 0x07u
|
|
#define USBH_REQ_GET_CFG 0x08u
|
|
#define USBH_REQ_SET_CFG 0x09u
|
|
#define USBH_REQ_GET_IF 0x0Au
|
|
#define USBH_REQ_SET_IF 0x0Bu
|
|
#define USBH_REQ_SYNCH_FRAME 0x0Cu
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* DESCRIPTOR TYPES
|
|
*
|
|
* Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 9.4, Table 9-5, and
|
|
* Section 9.4.3.
|
|
*
|
|
* (2) For a 'get descriptor' setup request, the low byte of the 'wValue' field may contain
|
|
* one of these values.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_DESC_TYPE_DEV 1u
|
|
#define USBH_DESC_TYPE_CFG 2u
|
|
#define USBH_DESC_TYPE_STR 3u
|
|
#define USBH_DESC_TYPE_IF 4u
|
|
#define USBH_DESC_TYPE_EP 5u
|
|
#define USBH_DESC_TYPE_DEV_QUALIFIER 6u
|
|
#define USBH_DESC_TYPE_OTHER_SPD_CONFIG 7u
|
|
#define USBH_DESC_TYPE_IF_PWR 8u
|
|
#define USBH_DESC_TYPE_OTG 9u
|
|
#define USBH_DESC_TYPE_IAD 11u
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* FEATURE SELECTORS
|
|
*
|
|
* Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 9.4, Table 9-6, and
|
|
* Section 9.4.1.
|
|
*
|
|
* (2) For a 'clear feature' setup request, the 'wValue' field may contain one of these values.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_FEATURE_SEL_EP_HALT 0u
|
|
#define USBH_FEATURE_SEL_DEV_REMOTE_WAKEUP 1u
|
|
#define USBH_FEATURE_SEL_TEST_MODE 2u
|
|
#define USBH_FEATURE_SEL_B_HNP_EN 3u
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* ENDPOINT TYPES (bmAttributes)
|
|
*
|
|
* Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 9.6.6, Table 9-13
|
|
*
|
|
* (2) In an endpoint descriptor, the 'bmAttributes' value is one of these values.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_EP_TYPE_MASK 0x03u
|
|
#define USBH_EP_TYPE_CTRL 0x00u
|
|
#define USBH_EP_TYPE_ISOC 0x01u
|
|
#define USBH_EP_TYPE_BULK 0x02u
|
|
#define USBH_EP_TYPE_INTR 0x03u
|
|
/* Synchronization Type (Bits(3..2)). */
|
|
#define USBH_EP_TYPE_SYNC_NONE 0x00u
|
|
#define USBH_EP_TYPE_SYNC_ASYNC 0x01u
|
|
#define USBH_EP_TYPE_SYNC_ADAPTIVE 0x02u
|
|
#define USBH_EP_TYPE_SYNC_SYNC 0x03u
|
|
/* Usage Type (Bits(5..4)). */
|
|
#define USBH_EP_TYPE_USAGE_DATA 0x00u
|
|
#define USBH_EP_TYPE_USAGE_FEEDBACK 0x01u
|
|
#define USBH_EP_TYPE_USAGE_IMPLICIT_FEEDACK_DATA 0x02u
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* ENDPOINT DIRECTION
|
|
*
|
|
* Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 9.6.6, Table 9-13
|
|
*
|
|
* (2) In an endpoint descriptor, the upper bit of 'bEndpointAddress' indicates direction.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_EP_DIR_MASK 0x80u
|
|
#define USBH_EP_DIR_OUT 0x00u
|
|
#define USBH_EP_DIR_IN 0x80u
|
|
#define USBH_EP_DIR_NONE 0x01u
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* MAX ENDPOINT SIZE (wMaxPacketSize)
|
|
*
|
|
* Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 5.5 to 5.8
|
|
* The values come from:
|
|
* + CONTROL : Section 5.5.3
|
|
* + ISOCHRONOUS: Section 5.6.3
|
|
* + INTERRUPT : Section 5.7.3
|
|
* + BULK : Section 5.8.3
|
|
*
|
|
* (2) See 'Universal Serial Bus Specification Revision 2.0', Section 9.6.6
|
|
* Bits 12..11 from wMaxPacketSize indicates the number of transaction per microframe.
|
|
* Valid for high-speed isochronous and interrupt endpoint only.
|
|
*********************************************************************************************************
|
|
*/
|
|
/* See Note #1 */
|
|
#define USBH_MAX_EP_SIZE_TYPE_CTRL_LS 8u
|
|
#define USBH_MAX_EP_SIZE_TYPE_CTRL_FS 64u
|
|
#define USBH_MAX_EP_SIZE_TYPE_CTRL_HS 64u
|
|
#define USBH_MAX_EP_SIZE_TYPE_BULK_FS 64u
|
|
#define USBH_MAX_EP_SIZE_TYPE_BULK_HS 512u
|
|
#define USBH_MAX_EP_SIZE_TYPE_INTR_LS 8u
|
|
#define USBH_MAX_EP_SIZE_TYPE_INTR_FS 64u
|
|
#define USBH_MAX_EP_SIZE_TYPE_INTR_HS 1024u
|
|
#define USBH_MAX_EP_SIZE_TYPE_ISOC_FS 1023u
|
|
#define USBH_MAX_EP_SIZE_TYPE_ISOC_HS 1024u
|
|
/* See Note #2 */
|
|
#define USBH_NBR_TRANSACTION_PER_UFRAME (DEF_BIT_12 | DEF_BIT_11)
|
|
#define USBH_1_TRANSACTION_PER_UFRAME 0u
|
|
#define USBH_2_TRANSACTION_PER_UFRAME 1u
|
|
#define USBH_3_TRANSACTION_PER_UFRAME 2u
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* CONFIGURATION ATTRIBUTES
|
|
*
|
|
* Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 9.6.3, Table 9-10
|
|
*
|
|
* (2) In a configuration descriptor, the 'bmAttributes' value is a bitmap composed of these values.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_CFG_DESC_SELF_POWERED 0xC0u
|
|
#define USBH_CFG_DESC_BUS_POWERED 0x80u
|
|
#define USBH_CFG_DESC_REMOTE_WAKEUP 0x20u
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* LANGUAGE IDENTIFIERS
|
|
*
|
|
* Note(s) : (1) See http://www.usb.org/developers/docs/USB_LANGIDs.pdf
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_LANG_ID_ARABIC_SAUDIARABIA 0x0401u
|
|
#define USBH_LANG_ID_CHINESE_TAIWAN 0x0404u
|
|
#define USBH_LANG_ID_ENGLISH_UNITEDSTATES 0x0409u
|
|
#define USBH_LANG_ID_ENGLISH_UNITEDKINGDOM 0x0809u
|
|
#define USBH_LANG_ID_FRENCH_STANDARD 0x040Cu
|
|
#define USBH_LANG_ID_GERMAN_STANDARD 0x0407u
|
|
#define USBH_LANG_ID_GREEK 0x0408u
|
|
#define USBH_LANG_ID_ITALIAN_STANDARD 0x0410u
|
|
#define USBH_LANG_ID_PORTUGUESE_STANDARD 0x0816u
|
|
#define USBH_LANG_ID_SANSKRIT 0x044Fu
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* CLASS CODES
|
|
*
|
|
* Note(s) : (1) See 'Universal Class Codes', www.usb.org/developers/defined_class.
|
|
*
|
|
* (2) Except as noted, these should be used ONLY in interface descriptors.
|
|
*
|
|
* (a) Can only be used in device descriptor.
|
|
*
|
|
* (b) Can be used in either device or interface descriptor.
|
|
*
|
|
* (4) Subclass & protocol codes are defined in the relevant class drivers.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_CLASS_CODE_USE_IF_DESC 0x00u /* See Notes #2a. */
|
|
#define USBH_CLASS_CODE_AUDIO 0x01u
|
|
#define USBH_CLASS_CODE_CDC_CTRL 0x02u /* See Notes #2b. */
|
|
#define USBH_CLASS_CODE_HID 0x03u
|
|
#define USBH_CLASS_CODE_PHYSICAL 0x05u
|
|
#define USBH_CLASS_CODE_IMAGE 0x06u
|
|
#define USBH_CLASS_CODE_PRINTER 0x07u
|
|
#define USBH_CLASS_CODE_MASS_STORAGE 0x08u
|
|
#define USBH_CLASS_CODE_HUB 0x09u /* See Notes #2a. */
|
|
#define USBH_CLASS_CODE_CDC_DATA 0x0Au
|
|
#define USBH_CLASS_CODE_SMART_CARD 0x0Bu
|
|
#define USBH_CLASS_CODE_CONTENT_SECURITY 0x0Du
|
|
#define USBH_CLASS_CODE_VIDEO 0x0Eu
|
|
#define USBH_CLASS_CODE_PERSONAL_HEALTHCARE 0x0Fu
|
|
#define USBH_CLASS_CODE_DIAGNOSTIC_DEV 0xDCu /* See Notes #2b */
|
|
#define USBH_CLASS_CODE_WIRELESS_CTRLR 0xE0u
|
|
#define USBH_CLASS_CODE_MISCELLANEOUS 0xEFu /* See Notes #2b. */
|
|
#define USBH_CLASS_CODE_APP_SPECIFIC 0xFEu
|
|
#define USBH_CLASS_CODE_VENDOR_SPECIFIC 0xFFu /* See Notes #2b. */
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* SUBCLASS CODES
|
|
*
|
|
* Note(s) : (1) See 'Universal Class Codes', www.usb.org/developers/defined_class.
|
|
*
|
|
* (2) Except as noted, these should be used ONLY in interface descriptors.
|
|
*
|
|
* (a) Can only be used in device descriptor.
|
|
*
|
|
* (b) Can be used in either device or interface descriptor.
|
|
*
|
|
* (4) Subclass & protocol codes are defined in the relevant class drivers.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_SUBCLASS_CODE_USE_IF_DESC 0x00u /* See Notes #2a. */
|
|
#define USBH_SUBCLASS_CODE_USE_COMMON_CLASS 0x02u /* See Notes #2a. */
|
|
#define USBH_SUBCLASS_CODE_VENDOR_SPECIFIC 0xFFu /* See Notes #2b. */
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* PROTOCOL CODES
|
|
*
|
|
* Note(s) : (1) See 'Universal Class Codes', www.usb.org/developers/defined_class.
|
|
*
|
|
* (2) Except as noted, these should be used ONLY in interface descriptors.
|
|
*
|
|
* (a) Can only be used in device descriptor.
|
|
*
|
|
* (b) See "USB Interface Association Descriptor Device Class Code and
|
|
* Use Model" Document at www.usb.org/developers/whitepapers/iadclasscode_r10.pdf.
|
|
*
|
|
* (c) Can be used in either device or interface descriptor.
|
|
*
|
|
* (4) Subclass & protocol codes are defined in the relevant class drivers.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_PROTOCOL_CODE_USE_IF_DESC 0x00u /* See Notes #2a. */
|
|
#define USBH_PROTOCOL_CODE_USE_IAD 0x01u /* See Notes #2b. */
|
|
#define USBH_PROTOCOL_CODE_VENDOR_SPECIFIC 0xFFu /* See Notes #2c. */
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* USB SPECIFICATION RELEASE NUMBER
|
|
*
|
|
* Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 9.6.1, Table 9-8.
|
|
*
|
|
* (2) The field "bcdUSB" is part of the device descriptor and indicates the release number of the
|
|
* USB specification to which the device complies.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_SPEC_RELEASE_NBR_1_0 0x0100u
|
|
#define USBH_SPEC_RELEASE_NBR_1_1 0x0110u
|
|
#define USBH_SPEC_RELEASE_NBR_2_0 0x0200u
|
|
|
|
|
|
/*
|
|
********************************************************************************************************
|
|
* OTG HNP AND SRP
|
|
********************************************************************************************************
|
|
*/
|
|
|
|
#define USBO_OTG_DESC_HNP 0x01u /* Device is HNP capable */
|
|
#define USBO_OTG_DESC_SRP 0x02u /* Device is SRP capable */
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* DEFAULT LANGUAGE ID
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_STRING_DESC_LANGID 0x00u
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HOST STATE
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_HOST_STATE_NONE 0u
|
|
#define USBH_HOST_STATE_READY 1u
|
|
#define USBH_HOST_STATE_SUSPENDED 2u
|
|
#define USBH_HOST_STATE_RESUMED 3u
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* URB STATE
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_URB_STATE_NONE 0u
|
|
#define USBH_URB_STATE_SCHEDULED 1u
|
|
#define USBH_URB_STATE_QUEUED 2u
|
|
#define USBH_URB_STATE_ABORTED 3u
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* USB TOKEN
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_TOKEN_SETUP 0u
|
|
#define USBH_TOKEN_OUT 1u
|
|
#define USBH_TOKEN_IN 2u
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* USB DEV + RH DEV
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_MAX_NBR_DEVS USBH_CFG_MAX_NBR_DEVS + USBH_CFG_MAX_NBR_HC
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HUB STANDARD REQUESTS
|
|
*
|
|
* Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 11.24.2, Table 11-16.
|
|
*
|
|
* (2) The 'bRequest' field of a class-specific setup request may contain one of these values.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_HUB_REQ_GET_STATUS 0x00u
|
|
#define USBH_HUB_REQ_CLR_FEATURE 0x01u
|
|
#define USBH_HUB_REQ_SET_FEATURE 0x03u
|
|
#define USBH_HUB_REQ_GET_DESC 0x06u
|
|
#define USBH_HUB_REQ_SET_DESC 0x07u
|
|
#define USBH_HUB_REQ_CLR_TT_BUF 0x08u
|
|
#define USBH_HUB_REQ_RESET_TT 0x09u
|
|
#define USBH_HUB_REQ_GET_TT_STATE 0x0Au
|
|
#define USBH_HUB_REQ_STOP_TT 0x0Bu
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HUB DESCRIPTOR TYPES
|
|
*
|
|
* Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 11.23.2, Table 11-13.
|
|
*
|
|
* (2) For a 'get descriptor' setup request, the low byte of the 'wValue' field may contain
|
|
* one of these values.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_HUB_DESC_TYPE_HUB 0x29u
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HUB FEATURE SELECTORS
|
|
*
|
|
* Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 11.24.2, Table 11-17.
|
|
*
|
|
* (2) For a 'clear feature' setup request, the 'wValue' field may contain one of these values.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_HUB_FEATURE_SEL_C_HUB_LOCAL_PWR 0u
|
|
#define USBH_HUB_FEATURE_SEL_C_HUB_OVER_CUR 1u
|
|
|
|
#define USBH_HUB_FEATURE_SEL_PORT_CONN 0u
|
|
#define USBH_HUB_FEATURE_SEL_PORT_EN 1u
|
|
#define USBH_HUB_FEATURE_SEL_PORT_SUSPEND 2u
|
|
#define USBH_HUB_FEATURE_SEL_PORT_OVER_CUR 3u
|
|
#define USBH_HUB_FEATURE_SEL_PORT_RESET 4u
|
|
#define USBH_HUB_FEATURE_SEL_PORT_PWR 8u
|
|
#define USBH_HUB_FEATURE_SEL_PORT_LOW_SPD 9u
|
|
#define USBH_HUB_FEATURE_SEL_C_PORT_CONN 16u
|
|
#define USBH_HUB_FEATURE_SEL_C_PORT_EN 17u
|
|
#define USBH_HUB_FEATURE_SEL_C_PORT_SUSPEND 18u
|
|
#define USBH_HUB_FEATURE_SEL_C_PORT_OVER_CUR 19u
|
|
#define USBH_HUB_FEATURE_SEL_C_PORT_RESET 20u
|
|
#define USBH_HUB_FEATURE_SEL_PORT_TEST 21u
|
|
#define USBH_HUB_FEATURE_SEL_PORT_INDICATOR 22u
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HUB PORT STATUS BITS
|
|
*
|
|
* Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 11.24.2.7.1, Table 11-21.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_HUB_STATUS_PORT_CONN 0x0001u
|
|
#define USBH_HUB_STATUS_PORT_EN 0x0002u
|
|
#define USBH_HUB_STATUS_PORT_SUSPEND 0x0004u
|
|
#define USBH_HUB_STATUS_PORT_OVER_CUR 0x0008u
|
|
#define USBH_HUB_STATUS_PORT_RESET 0x0010u
|
|
#define USBH_HUB_STATUS_PORT_PWR 0x0100u
|
|
#define USBH_HUB_STATUS_PORT_LOW_SPD 0x0200u
|
|
#define USBH_HUB_STATUS_PORT_FULL_SPD 0x0000u
|
|
#define USBH_HUB_STATUS_PORT_HIGH_SPD 0x0400u
|
|
#define USBH_HUB_STATUS_PORT_TEST 0x0800u
|
|
#define USBH_HUB_STATUS_PORT_INDICATOR 0x1000u
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HUB PORT STATUS CHANGE BITS
|
|
*
|
|
* Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 11.24.2.7.2, Table 11-22.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_HUB_STATUS_C_PORT_CONN 0x0001u
|
|
#define USBH_HUB_STATUS_C_PORT_EN 0x0002u
|
|
#define USBH_HUB_STATUS_C_PORT_SUSPEND 0x0004u
|
|
#define USBH_HUB_STATUS_C_PORT_OVER_CUR 0x0008u
|
|
#define USBH_HUB_STATUS_C_PORT_RESET 0x0010u
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* DATA TYPES
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
typedef CPU_INT08U USBH_EP_TYPE;
|
|
typedef CPU_INT08U USBH_EP_DIR;
|
|
typedef CPU_INT08U USBH_HOST_STATE;
|
|
typedef CPU_INT08U USBH_DEV_STATE;
|
|
typedef CPU_INT08U USBH_CLASS_DEV_STATE;
|
|
typedef CPU_INT08U USBH_EP_STATE;
|
|
typedef CPU_INT08U USBH_TOKEN;
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* FORWARD DECLARATIONS
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
typedef struct usbh_host USBH_HOST;
|
|
typedef struct usbh_hub_dev USBH_HUB_DEV;
|
|
typedef struct usbh_dev USBH_DEV;
|
|
typedef struct usbh_cfg USBH_CFG;
|
|
typedef struct usbh_if USBH_IF;
|
|
typedef struct usbh_ep USBH_EP;
|
|
typedef struct usbh_urb USBH_URB;
|
|
|
|
typedef const struct usbh_class_drv USBH_CLASS_DRV;
|
|
typedef struct usbh_class_drv_reg USBH_CLASS_DRV_REG;
|
|
|
|
typedef struct usbh_hc USBH_HC;
|
|
typedef struct usbh_hc_drv USBH_HC_DRV;
|
|
typedef const struct usbh_hc_cfg USBH_HC_CFG;
|
|
typedef const struct usbh_hc_drv_api USBH_HC_DRV_API;
|
|
typedef const struct usbh_hc_bsp_api USBH_HC_BSP_API;
|
|
typedef const struct usbh_hc_rh_api USBH_HC_RH_API;
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* DEVICE SPEED
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
typedef enum usbh_dev_spd {
|
|
USBH_DEV_SPD_NONE = 0,
|
|
USBH_DEV_SPD_LOW = 1,
|
|
USBH_DEV_SPD_FULL = 2,
|
|
USBH_DEV_SPD_HIGH = 3
|
|
} USBH_DEV_SPD;
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HUB PORT STATUS DATA TYPE
|
|
*
|
|
* Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 11.24.2.7.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
typedef struct usbh_hub_port_status {
|
|
CPU_INT16U wPortStatus;
|
|
CPU_INT16U wPortChange;
|
|
} USBH_HUB_PORT_STATUS;
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* USB HOST CONTROLLER DRIVER API
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
struct usbh_hc_drv_api {
|
|
void (*Init) (USBH_HC_DRV *p_hc_drv, /* Initialize HC. */
|
|
USBH_ERR *p_err);
|
|
|
|
void (*Start) (USBH_HC_DRV *p_hc_drv, /* Start HC. */
|
|
USBH_ERR *p_err);
|
|
|
|
void (*Stop) (USBH_HC_DRV *p_hc_drv, /* Stop HC. */
|
|
USBH_ERR *p_err);
|
|
|
|
USBH_DEV_SPD (*SpdGet) (USBH_HC_DRV *p_hc_drv, /* Get HC speed. */
|
|
USBH_ERR *p_err);
|
|
|
|
void (*Suspend) (USBH_HC_DRV *p_hc_drv, /* Suspend HC. */
|
|
USBH_ERR *p_err);
|
|
|
|
void (*Resume) (USBH_HC_DRV *p_hc_drv, /* Resume HC. */
|
|
USBH_ERR *p_err);
|
|
|
|
CPU_INT32U (*FrmNbrGet) (USBH_HC_DRV *p_hc_drv, /* Get HC frame number. */
|
|
USBH_ERR *p_err);
|
|
|
|
void (*EP_Open) (USBH_HC_DRV *p_hc_drv, /* Open endpoint. */
|
|
USBH_EP *p_ep,
|
|
USBH_ERR *p_err);
|
|
|
|
void (*EP_Close) (USBH_HC_DRV *p_hc_drv, /* Close endpoint. */
|
|
USBH_EP *p_ep,
|
|
USBH_ERR *p_err);
|
|
|
|
void (*EP_Abort) (USBH_HC_DRV *p_hc_drv, /* Abort all pending URB on an endpoint. */
|
|
USBH_EP *p_ep,
|
|
USBH_ERR *p_err);
|
|
|
|
CPU_BOOLEAN (*EP_IsHalt) (USBH_HC_DRV *p_hc_drv, /* Get endpoint halt status. */
|
|
USBH_EP *p_ep,
|
|
USBH_ERR *p_err);
|
|
|
|
void (*URB_Submit) (USBH_HC_DRV *p_hc_drv, /* Submit a URB. */
|
|
USBH_URB *p_urb,
|
|
USBH_ERR *p_err);
|
|
|
|
void (*URB_Complete)(USBH_HC_DRV *p_hc_drv, /* Complete a URB. */
|
|
USBH_URB *p_urb,
|
|
USBH_ERR *p_err);
|
|
|
|
void (*URB_Abort) (USBH_HC_DRV *p_hc_drv, /* Abort a URB. */
|
|
USBH_URB *p_urb,
|
|
USBH_ERR *p_err);
|
|
};
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* USB HOST CONTROLLER ROOT HUB DRIVER API
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
struct usbh_hc_rh_api {
|
|
/* Get port status. */
|
|
CPU_BOOLEAN (*PortStatusGet) (USBH_HC_DRV *p_hc_drv,
|
|
CPU_INT08U port_nbr,
|
|
USBH_HUB_PORT_STATUS *p_port_status);
|
|
|
|
/* Get RH descriptor. */
|
|
CPU_BOOLEAN (*HubDescGet) (USBH_HC_DRV *p_hc_drv,
|
|
void *p_buf,
|
|
CPU_INT08U buf_len);
|
|
|
|
/* Set port enable. */
|
|
CPU_BOOLEAN (*PortEnSet) (USBH_HC_DRV *p_hc_drv,
|
|
CPU_INT08U port_nbr);
|
|
|
|
/* Clear port enable. */
|
|
CPU_BOOLEAN (*PortEnClr) (USBH_HC_DRV *p_hc_drv,
|
|
CPU_INT08U port_nbr);
|
|
|
|
/* Clear port enable change. */
|
|
CPU_BOOLEAN (*PortEnChngClr) (USBH_HC_DRV *p_hc_drv,
|
|
CPU_INT08U port_nbr);
|
|
|
|
/* Set port power. */
|
|
CPU_BOOLEAN (*PortPwrSet) (USBH_HC_DRV *p_hc_drv,
|
|
CPU_INT08U port_nbr);
|
|
|
|
/* Clear port power. */
|
|
CPU_BOOLEAN (*PortPwrClr) (USBH_HC_DRV *p_hc_drv,
|
|
CPU_INT08U port_nbr);
|
|
|
|
/* Set port reset. */
|
|
CPU_BOOLEAN (*PortResetSet) (USBH_HC_DRV *p_hc_drv,
|
|
CPU_INT08U port_nbr);
|
|
|
|
/* Clear port reset change. */
|
|
CPU_BOOLEAN (*PortResetChngClr)(USBH_HC_DRV *p_hc_drv,
|
|
CPU_INT08U port_nbr);
|
|
|
|
/* Clear port suspend. */
|
|
CPU_BOOLEAN (*PortSuspendClr) (USBH_HC_DRV *p_hc_drv,
|
|
CPU_INT08U port_nbr);
|
|
|
|
/* Clear port connection change. */
|
|
CPU_BOOLEAN (*PortConnChngClr) (USBH_HC_DRV *p_hc_drv,
|
|
CPU_INT08U port_nbr);
|
|
|
|
/* Enable RH interrupt. */
|
|
CPU_BOOLEAN (*IntEn) (USBH_HC_DRV *p_hc_drv);
|
|
|
|
/* Disable RH interrupt. */
|
|
CPU_BOOLEAN (*IntDis) (USBH_HC_DRV *p_hc_drv);
|
|
};
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* USB HOST CONTROLLER BSP API
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
struct usbh_hc_bsp_api {
|
|
void (*Init) (USBH_HC_DRV *p_hc_drv, /* Init BSP. */
|
|
USBH_ERR *p_err);
|
|
|
|
void (*ISR_Reg) (CPU_FNCT_PTR isr_fnct, /* Register ISR. */
|
|
USBH_ERR *p_err);
|
|
|
|
void (*ISR_Unreg) (USBH_ERR *p_err); /* Unregister ISR. */
|
|
};
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HUB DESCRIPTOR
|
|
*
|
|
* Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 11.23.2.1.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
typedef struct usbh_hub_desc {
|
|
CPU_INT08U bDescLength;
|
|
CPU_INT08U bDescriptorType;
|
|
CPU_INT08U bNbrPorts;
|
|
CPU_INT16U wHubCharacteristics;
|
|
CPU_INT08U bPwrOn2PwrGood;
|
|
CPU_INT08U bHubContrCurrent;
|
|
CPU_INT08U DeviceRemovable;
|
|
CPU_INT32U PortPwrCtrlMask[USBH_CFG_MAX_HUB_PORTS];
|
|
} USBH_HUB_DESC;
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HUB STATUS
|
|
*
|
|
* Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 11.24.2.6.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
typedef struct usbh_hub_status {
|
|
CPU_INT16U wHubStatus;
|
|
CPU_INT16U wHubChange;
|
|
} USBH_HUB_STATUS;
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
- SETUP REQUEST
|
|
-
|
|
- Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 9.3, Table 9-2.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
typedef struct usbh_setup_req {
|
|
CPU_INT08U bmRequestType;
|
|
CPU_INT08U bRequest;
|
|
CPU_INT16U wValue;
|
|
CPU_INT16U wIndex;
|
|
CPU_INT16U wLength;
|
|
} USBH_SETUP_REQ;
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* DESCRIPTOR HEADER
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
typedef struct usbh_desc_hdr {
|
|
CPU_INT08U bLength;
|
|
CPU_INT08U bDescriptorType;
|
|
} USBH_DESC_HDR;
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* DEVICE DESCRIPTOR
|
|
*
|
|
* Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 9.6.1, Table 9-8.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
typedef struct usbh_dev_desc {
|
|
CPU_INT08U bLength;
|
|
CPU_INT08U bDescriptorType;
|
|
CPU_INT16U bcdUSB;
|
|
CPU_INT08U bDeviceClass;
|
|
CPU_INT08U bDeviceSubClass;
|
|
CPU_INT08U bDeviceProtocol;
|
|
CPU_INT08U bMaxPacketSize0;
|
|
CPU_INT16U idVendor;
|
|
CPU_INT16U idProduct;
|
|
CPU_INT16U bcdDevice;
|
|
CPU_INT08U iManufacturer;
|
|
CPU_INT08U iProduct;
|
|
CPU_INT08U iSerialNumber;
|
|
CPU_INT08U bNbrConfigurations;
|
|
} USBH_DEV_DESC;
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* DEVICE QUALIFIER DESCRIPTOR
|
|
*
|
|
* Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 9.6.2, Table 9-9.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
typedef struct usbh_dev_qualifier_desc {
|
|
CPU_INT08U bLength;
|
|
CPU_INT08U bDescriptorType;
|
|
CPU_INT16U bcdUSB;
|
|
CPU_INT08U bDeviceClass;
|
|
CPU_INT08U bDeviceSubClass;
|
|
CPU_INT08U bDeviceProtocol;
|
|
CPU_INT08U bMaxPacketSize0;
|
|
CPU_INT08U bNbrConfigurations;
|
|
CPU_INT08U bReserved;
|
|
} USBH_DEV_QUALIFIER_DESC;
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* CONFIGURATION DESCRIPTOR
|
|
*
|
|
* Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 9.6.3, Table 9-10.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
typedef struct usbh_cfg_desc {
|
|
CPU_INT08U bLength;
|
|
CPU_INT08U bDescriptorType;
|
|
CPU_INT16U wTotalLength;
|
|
CPU_INT08U bNbrInterfaces;
|
|
CPU_INT08U bConfigurationValue;
|
|
CPU_INT08U iConfiguration;
|
|
CPU_INT08U bmAttributes;
|
|
CPU_INT08U bMaxPower;
|
|
} USBH_CFG_DESC;
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* OTHER SPEED CONFIGURATION DESCRIPTOR
|
|
*
|
|
* Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 9.6.4, Table 9-11.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
typedef struct usbh_other_spd_cfg_desc {
|
|
CPU_INT08U bLength;
|
|
CPU_INT08U bDescriptorType;
|
|
CPU_INT16U wTotalLength;
|
|
CPU_INT08U bNbrInterfaces;
|
|
CPU_INT08U bConfigurationValue;
|
|
CPU_INT08U iConfiguration;
|
|
CPU_INT08U bmAttributes;
|
|
CPU_INT08U bMaxPower;
|
|
} USBH_OTHER_SPD_CFG_DESC;
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* INTERFACE DESCRIPTOR
|
|
*
|
|
* Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 9.6.5, Table 9-12.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
typedef struct usbh_if_desc {
|
|
CPU_INT08U bLength;
|
|
CPU_INT08U bDescriptorType;
|
|
CPU_INT08U bInterfaceNumber;
|
|
CPU_INT08U bAlternateSetting;
|
|
CPU_INT08U bNbrEndpoints;
|
|
CPU_INT08U bInterfaceClass;
|
|
CPU_INT08U bInterfaceSubClass;
|
|
CPU_INT08U bInterfaceProtocol;
|
|
CPU_INT08U iInterface;
|
|
} USBH_IF_DESC;
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* INTERFACE ASSOCIATION DESCRIPTOR
|
|
*
|
|
* Note(s) : (1) See 'www.usb.org/developers/doc/InterfaceAssociationDescriptor_ecn.pdf', Section 9.X.Y, Table 9-Z.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
typedef struct usbh_if_association_desc {
|
|
CPU_INT08U bLength;
|
|
CPU_INT08U bDescriptorType;
|
|
CPU_INT08U bFirstInterface;
|
|
CPU_INT08U bInterfaceCount;
|
|
CPU_INT08U bFunctionClass;
|
|
CPU_INT08U bFunctionSubClass;
|
|
CPU_INT08U bFunctionProtocol;
|
|
CPU_INT08U iFunction;
|
|
} USBH_IF_ASSOCIATION_DESC;
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* ENDPOINT DESCRIPTOR
|
|
*
|
|
* Note(s) : (1) See 'Universal Serial Bus Specification Revision 2.0', Section 9.6.6, Table 9-14.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
typedef struct usbh_ep_desc {
|
|
CPU_INT08U bLength;
|
|
CPU_INT08U bDescriptorType;
|
|
CPU_INT08U bEndpointAddress;
|
|
CPU_INT08U bmAttributes;
|
|
CPU_INT16U wMaxPacketSize;
|
|
CPU_INT08U bInterval;
|
|
CPU_INT08U bRefresh;
|
|
CPU_INT08U bSynchAddress;
|
|
} USBH_EP_DESC;
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* OTG DESCRIPTOR
|
|
*
|
|
* Note(s) : (1) See 'On-The-Go Specification Revision 1.3', Section 6.4, Table 6-1.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
typedef struct usbh_otg_desc {
|
|
CPU_INT08U bLength;
|
|
CPU_INT08U bDescriptorType;
|
|
CPU_INT08U bmAttributes;
|
|
} USBH_OTG_DESC;
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* ISOCHRONOUS DESCRIPTOR
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
typedef struct usbh_isoc_desc {
|
|
CPU_INT08U *BufPtr;
|
|
CPU_INT32U BufLen;
|
|
CPU_INT32U StartFrm;
|
|
CPU_INT32U NbrFrm;
|
|
CPU_INT16U *FrmLen;
|
|
USBH_ERR *FrmErr;
|
|
} USBH_ISOC_DESC;
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* USB REQUEST BLOCK (URB) INFORMATION
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
struct usbh_urb {
|
|
CPU_REG08 State; /* State of URB. */
|
|
USBH_EP *EP_Ptr; /* EP the urb belongs to. */
|
|
volatile USBH_ERR Err; /* The status of URB completion. */
|
|
|
|
void *UserBufPtr; /* Ptr to buf supplied by app. */
|
|
CPU_INT32U UserBufLen; /* Buf len in bytes. */
|
|
void *DMA_BufPtr; /* DMA buf ptr used by DMA HW. */
|
|
CPU_INT32U DMA_BufLen; /* DMA buf len. */
|
|
CPU_INT32U XferLen; /* Actual len xfer'd by ctrlr. */
|
|
|
|
USBH_ISOC_DESC *IsocDescPtr; /* Isoc xfer desc. */
|
|
|
|
void *FnctPtr; /* Fnct ptr, called when I/O is completed. */
|
|
void *FnctArgPtr; /* Fnct context. */
|
|
|
|
void *ArgPtr; /* HCD private data. */
|
|
|
|
USBH_TOKEN Token; /* Token (SETUP, IN, or OUT). */
|
|
|
|
CPU_BOOLEAN URB_DoneSignal;
|
|
USBH_URB *AsyncURB_NxtPtr; /* Ptr to next URB (if any). */
|
|
USBH_URB *NxtPtr; /* Used for URB chained list in async task. */
|
|
|
|
USBH_HSEM Sem; /* Sem to wait on I/O completion. */
|
|
};
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* ENDPOINT INFORMATION
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
struct usbh_ep {
|
|
USBH_DEV_SPD DevSpd; /* USB dev spd. */
|
|
CPU_INT08U DevAddr; /* USB dev addr. */
|
|
USBH_DEV *DevPtr; /* Ptr to USB dev struct. */
|
|
USBH_EP_DESC Desc; /* EP desc. */
|
|
CPU_INT16U Interval; /* EP interval. */
|
|
CPU_INT32U HC_RefFrame; /* Initial HC ref frame nbr. */
|
|
void *ArgPtr; /* HCD private data. */
|
|
USBH_URB URB; /* URB used for data xfer on this endpoint. */
|
|
USBH_HMUTEX Mutex; /* Mutex for I/O access serialization on this EP. */
|
|
CPU_BOOLEAN IsOpen; /* EP state. */
|
|
CPU_INT32U XferNbrInProgress; /* Nbr of URB(s) in progress. Used for async omm. */
|
|
CPU_INT08U DataPID; /* EP Data Toggle PID tracker. */
|
|
};
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* INTERFACE INFORMATION
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
struct usbh_if {
|
|
USBH_DEV *DevPtr; /* Ptr to USB dev. */
|
|
CPU_INT08U AltIxSel; /* Selected alternate setting ix. */
|
|
void *ClassDevPtr; /* Ptr to class dev created by class drv. */
|
|
USBH_CLASS_DRV_REG *ClassDrvRegPtr; /* Ptr to class drv registered for this IF. */
|
|
CPU_INT08U *IF_DataPtr; /* Buf pointer containing IF data. */
|
|
CPU_INT16U IF_DataLen; /* Buf len. */
|
|
};
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* CONFIGURATION INFORMATION
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
struct usbh_cfg {
|
|
/* Buf containing cfg desc data. */
|
|
CPU_INT08U CfgData[LEN_CACHE_ALIGN(USBH_CFG_MAX_CFG_DATA_LEN)] __CACHE_ALIGN;
|
|
CPU_INT16U CfgDataLen; /* Cfg desc data len. */
|
|
USBH_IF IF_List[USBH_CFG_MAX_NBR_IFS]; /* Device IFs. */
|
|
};
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* DEVICE INFORMATION
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
struct usbh_dev {
|
|
USBH_HC *HC_Ptr; /* Ptr to HC struct. */
|
|
CPU_INT08U DevAddr; /* USB dev addr assigned by host. */
|
|
USBH_DEV_SPD DevSpd; /* Dev spd (low, full or high). */
|
|
USBH_EP DfltEP; /* Dflt ctrl EP. */
|
|
USBH_HMUTEX DfltEP_Mutex; /* Dev dflt EP mutex. */
|
|
CPU_INT16U LangID; /* Language ID used by the str desc. */
|
|
void *ClassDevPtr; /* Ptr to class dev created by class drv. */
|
|
USBH_CLASS_DRV_REG *ClassDrvRegPtr; /* Ptr to class drv managing this dev. */
|
|
CPU_INT08U DevDesc[USBH_LEN_DESC_DEV]; /* Dev desc. */
|
|
USBH_CFG CfgList[USBH_CFG_MAX_NBR_CFGS]; /* Dev cfg. */
|
|
CPU_INT08U SelCfg; /* Selected dev cfg nbr. */
|
|
USBH_DEV *HubDevPtr; /* Ptr to up stream hub dev struct. */
|
|
CPU_INT32U PortNbr; /* Port nbr to which this dev is connected. */
|
|
CPU_BOOLEAN IsRootHub; /* Indicate if this is a RH dev. */
|
|
USBH_HUB_DEV *HubHS_Ptr; /* Ptr to prev HS Hub. */
|
|
};
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HUB DEVICE
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
struct usbh_hub_dev {
|
|
USBH_EP IntrEP; /* Intr EP to recv events from hub. */
|
|
USBH_HUB_DESC Desc; /* Hub desc. */
|
|
USBH_DEV *DevPtrList[USBH_CFG_MAX_HUB_PORTS]; /* Ptrs to USB devs connected to this hub. */
|
|
USBH_DEV *DevPtr; /* USB dev ptr of the hub IF. */
|
|
USBH_IF *IF_Ptr; /* HUB IF ptr. */
|
|
/* Buf to recv hub events. */
|
|
CPU_INT08U HubIntrBuf[LEN_CACHE_ALIGN(64)] __CACHE_ALIGN;
|
|
CPU_INT32U ErrCnt;
|
|
CPU_INT08U State;
|
|
CPU_INT08U RefCnt;
|
|
USBH_HUB_DEV *NxtPtr;
|
|
CPU_INT08U ConnCnt; /* Re-connection counter */
|
|
};
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HOST CONTROLLER DRIVER INFORMATION
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
struct usbh_hc_drv {
|
|
CPU_INT08U Nbr; /* HC nbr. */
|
|
void *DataPtr; /* Drv's data. */
|
|
USBH_DEV *RH_DevPtr; /* Ptr to RH dev struct. */
|
|
USBH_HC_CFG *HC_CfgPtr; /* Ptr to HC config struct. */
|
|
USBH_HC_DRV_API *API_Ptr; /* Ptr to HC drv API struct. */
|
|
USBH_HC_RH_API *RH_API_Ptr; /* Ptr to RH drv API struct. */
|
|
USBH_HC_BSP_API *BSP_API_Ptr; /* Ptr to HC BSP API struct. */
|
|
};
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HOST CONTROLLER CONFIGURATION
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
struct usbh_hc_cfg {
|
|
CPU_ADDR BaseAddr; /* HC reg's base addr. */
|
|
CPU_ADDR DedicatedMemAddr; /* Start addr of HC's dedicated mem. */
|
|
CPU_INT32U DedicatedMemSize; /* Size of HC's dedicated mem. */
|
|
CPU_BOOLEAN DataBufFromSysMemEn; /* Indicate if HC can access sys mem. */
|
|
CPU_INT32U DataBufMaxLen; /* Max len of data buf. */
|
|
CPU_INT32U MaxNbrEP_BulkOpen; /* Max nbr of opened bulk EP. */
|
|
CPU_INT32U MaxNbrEP_IntrOpen; /* Max nbr of opened intr EP. */
|
|
CPU_INT32U MaxNbrEP_IsocOpen; /* Max nbr of opened isoc EP. */
|
|
};
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HOST CONTROLLER INFORMATION DATA TYPE
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
struct usbh_hc {
|
|
USBH_HC_DRV HC_Drv; /* Host Controller driver (HCD) info. */
|
|
USBH_HOST *HostPtr; /* Host structure. */
|
|
USBH_HUB_DEV *RH_ClassDevPtr; /* Root Hub class device pointer. */
|
|
USBH_HMUTEX HCD_Mutex; /* Mutex to sync access to HCD. */
|
|
CPU_BOOLEAN IsVirRootHub; /* Indicate if RH is virtual. */
|
|
};
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HOST INFORMATION DATA TYPE
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
struct usbh_host {
|
|
USBH_HOST_STATE State; /* State of USB host stack. */
|
|
|
|
USBH_DEV DevList[USBH_MAX_NBR_DEVS]; /* List of USB dev connected. */
|
|
MEM_POOL DevPool; /* Pool for mem mgmt of USB devs. */
|
|
MEM_POOL IsocDescPool;
|
|
USBH_ISOC_DESC IsocDesc[USBH_CFG_MAX_ISOC_DESC];
|
|
MEM_POOL AsyncURB_Pool; /* Pool of extra URB when using async comm. */
|
|
|
|
USBH_HC HC_Tbl[USBH_CFG_MAX_NBR_HC]; /* Array of HC structs. */
|
|
CPU_INT08U HC_NbrNext;
|
|
|
|
USBH_HTASK HAsyncTask; /* Async task handle. */
|
|
USBH_HTASK HHubTask; /* Hub event task handle. */
|
|
};
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* KERNEL TASK INFORMATION
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
typedef const struct usbh_kernel_task_info {
|
|
CPU_INT32U Prio;
|
|
void *StackPtr;
|
|
CPU_INT32U StackSize;
|
|
} USBH_KERNEL_TASK_INFO;
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* XFER COMPLETE NOTIFICATION FNCT
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
typedef void (*USBH_ISOC_CMPL_FNCT)(USBH_EP *p_ep,
|
|
CPU_INT08U *p_buf,
|
|
CPU_INT32U buf_len,
|
|
CPU_INT32U cur_xfer_len,
|
|
CPU_INT32U start_frm,
|
|
CPU_INT32U nbr_frm,
|
|
CPU_INT16U *p_frm_len,
|
|
USBH_ERR *p_frm_err,
|
|
void *p_arg,
|
|
USBH_ERR err);
|
|
|
|
typedef void (*USBH_XFER_CMPL_FNCT)(USBH_EP *p_ep,
|
|
void *p_buf,
|
|
CPU_INT32U buf_len,
|
|
CPU_INT32U xfer_len,
|
|
void *p_arg,
|
|
USBH_ERR err);
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* GLOBAL VARIABLES
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* MACROS
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* USB STANDARD FUNCTION MACROS
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define USBH_CLR_FEATURE(p_dev, rcpt, feature, value, index, p_err) USBH_CtrlTx((p_dev), \
|
|
(USBH_REQ_CLR_FEATURE), \
|
|
(rcpt), \
|
|
(value), \
|
|
(index), \
|
|
(void *)0, \
|
|
0u, \
|
|
(USBH_CFG_STD_REQ_TIMEOUT), \
|
|
(p_err))
|
|
|
|
#define USBH_SET_FEATURE(p_dev, rcpt, feature, value, index, p_err) USBH_CtrlTx((p_dev), \
|
|
(USBH_REQ_SET_FEATURE), \
|
|
(rcpt), \
|
|
(value), \
|
|
(index), \
|
|
(void *)0, \
|
|
0u, \
|
|
(USBH_CFG_STD_REQ_TIMEOUT), \
|
|
(p_err))
|
|
|
|
#define USBH_GET_CFG(p_dev, data, p_err) USBH_CtrlRx((p_dev), \
|
|
(USBH_REQ_GET_CFG), \
|
|
(USBH_REQ_DIR_DEV_TO_HOST | USBH_REQ_RECIPIENT_DEV), \
|
|
0u, \
|
|
0u, \
|
|
(data), \
|
|
1u, \
|
|
(USBH_CFG_STD_REQ_TIMEOUT), \
|
|
(p_err))
|
|
|
|
#define USBH_GET_DESC(p_dev, desc_type, desc_ix, data, length, p_err) USBH_CtrlRx((p_dev), \
|
|
(USBH_REQ_GET_DESC), \
|
|
(USBH_REQ_DIR_DEV_TO_HOST | USBH_REQ_RECIPIENT_DEV), \
|
|
(desc_type << 8) | (desc_ix), \
|
|
0u, \
|
|
(data), \
|
|
(length), \
|
|
(USBH_CFG_STD_REQ_TIMEOUT), \
|
|
(p_err))
|
|
|
|
#define USBH_GET_IF(ep, if_nbr, data, p_err) USBH_CtrlRx((p_dev), \
|
|
(USBH_REQ_GET_IF), \
|
|
(USBH_REQ_DIR_DEV_TO_HOST | USBH_REQ_RECIPIENT_IF), \
|
|
0u, \
|
|
(if_nbr), \
|
|
(data), \
|
|
1u, \
|
|
(USBH_CFG_STD_REQ_TIMEOUT), \
|
|
(p_err))
|
|
|
|
#define USBH_GET_STATUS(p_dev, rcpt, index, data, p_err) USBH_CtrlRx((p_dev), \
|
|
(USBH_REQ_GET_STATUS), \
|
|
(USBH_REQ_DIR_DEV_TO_HOST) | (rcpt), \
|
|
0u, \
|
|
(index), \
|
|
(data), \
|
|
2u, \
|
|
(USBH_CFG_STD_REQ_TIMEOUT), \
|
|
(p_err))
|
|
|
|
#define USBH_SET_ADDR(p_dev, new_usb_addr, p_err) USBH_CtrlTx((p_dev), \
|
|
(USBH_REQ_SET_ADDR), \
|
|
(USBH_REQ_DIR_HOST_TO_DEV | USBH_REQ_RECIPIENT_DEV), \
|
|
new_usb_addr, \
|
|
0u, \
|
|
(void *)0, \
|
|
0u, \
|
|
(USBH_CFG_STD_REQ_TIMEOUT), \
|
|
(p_err))
|
|
|
|
#define USBH_SET_CFG(p_dev, cfg_nbr, p_err) USBH_CtrlTx((p_dev), \
|
|
(USBH_REQ_SET_CFG), \
|
|
(USBH_REQ_DIR_HOST_TO_DEV | USBH_REQ_RECIPIENT_DEV), \
|
|
(cfg_nbr), \
|
|
0u, \
|
|
(void *)0, \
|
|
0u, \
|
|
(USBH_CFG_STD_REQ_TIMEOUT), \
|
|
(p_err))
|
|
|
|
#define USBH_SET_IF(p_dev, if_nbr, alt_nbr, p_err) USBH_CtrlTx((p_dev), \
|
|
(USBH_REQ_SET_IF), \
|
|
(USBH_REQ_DIR_HOST_TO_DEV | USBH_REQ_RECIPIENT_IF), \
|
|
(alt_nbr), \
|
|
(if_nbr), \
|
|
(void *)0, \
|
|
0u, \
|
|
(USBH_CFG_STD_REQ_TIMEOUT), \
|
|
(p_err))
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* FUNCTION PROTOTYPES
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
/* --------- USB HOST STACK GENERAL FUNCTIONS --------- */
|
|
CPU_INT32U USBH_VersionGet (void);
|
|
|
|
USBH_ERR USBH_Init (USBH_KERNEL_TASK_INFO *async_task_info,
|
|
USBH_KERNEL_TASK_INFO *hub_task_info);
|
|
|
|
USBH_ERR USBH_Suspend (void);
|
|
|
|
USBH_ERR USBH_Resume (void);
|
|
|
|
/* ------------ HOST CONTROLLER FUNCTIONS ------------- */
|
|
CPU_INT08U USBH_HC_Add (USBH_HC_CFG *p_hc_cfg,
|
|
USBH_HC_DRV_API *p_drv_api,
|
|
USBH_HC_RH_API *p_hc_rh_api,
|
|
USBH_HC_BSP_API *p_hc_bsp_api,
|
|
USBH_ERR *p_err);
|
|
|
|
USBH_ERR USBH_HC_Start (CPU_INT08U hc_nbr);
|
|
|
|
USBH_ERR USBH_HC_Stop (CPU_INT08U hc_nbr);
|
|
|
|
USBH_ERR USBH_HC_PortEn (CPU_INT08U hc_nbr,
|
|
CPU_INT08U port_nbr);
|
|
|
|
USBH_ERR USBH_HC_PortDis (CPU_INT08U hc_nbr,
|
|
CPU_INT08U port_nbr);
|
|
|
|
CPU_INT32U USBH_HC_FrameNbrGet (CPU_INT08U hc_nbr,
|
|
USBH_ERR *p_err);
|
|
|
|
/* ------------- DEVICE CONTROL FUNCTIONS ------------- */
|
|
USBH_ERR USBH_DevConn (USBH_DEV *p_dev);
|
|
|
|
void USBH_DevDisconn (USBH_DEV *p_dev);
|
|
|
|
CPU_INT08U USBH_DevCfgNbrGet (USBH_DEV *p_dev);
|
|
|
|
void USBH_DevDescGet (USBH_DEV *p_dev,
|
|
USBH_DEV_DESC *p_dev_desc);
|
|
|
|
/* ---------- DEVICE CONFIGURATION FUNCTIONS ---------- */
|
|
USBH_ERR USBH_CfgSet (USBH_DEV *p_dev,
|
|
CPU_INT08U cfg_nbr);
|
|
|
|
USBH_CFG *USBH_CfgGet (USBH_DEV *p_dev,
|
|
CPU_INT08U cfg_ix);
|
|
|
|
CPU_INT08U USBH_CfgIF_NbrGet (USBH_CFG *p_cfg);
|
|
|
|
USBH_ERR USBH_CfgDescGet (USBH_CFG *p_cfg,
|
|
USBH_CFG_DESC *p_cfg_desc);
|
|
|
|
USBH_DESC_HDR *USBH_CfgExtraDescGet (USBH_CFG *p_cfg,
|
|
USBH_ERR *p_err);
|
|
|
|
/* -------- DEVICE INTERFACE CONTROL FUNCTIONS -------- */
|
|
USBH_ERR USBH_IF_Set (USBH_IF *p_if,
|
|
CPU_INT08U alt_nbr);
|
|
|
|
USBH_IF *USBH_IF_Get (USBH_CFG *p_cfg,
|
|
CPU_INT08U if_ix);
|
|
|
|
CPU_INT08U USBH_IF_AltNbrGet (USBH_IF *p_if);
|
|
|
|
CPU_INT08U USBH_IF_NbrGet (USBH_IF *p_if);
|
|
|
|
CPU_INT08U USBH_IF_EP_NbrGet (USBH_IF *p_if,
|
|
CPU_INT08U alt_ix);
|
|
|
|
USBH_ERR USBH_IF_DescGet (USBH_IF *p_if,
|
|
CPU_INT08U alt_ix,
|
|
USBH_IF_DESC *p_if_desc);
|
|
|
|
CPU_INT08U *USBH_IF_ExtraDescGet (USBH_IF *p_if,
|
|
CPU_INT08U alt_ix,
|
|
CPU_INT16U *p_data_len);
|
|
|
|
/* ---------- DEVICE ENDPOINT OPEN FUNCTIONS ---------- */
|
|
USBH_ERR USBH_BulkInOpen (USBH_DEV *p_dev,
|
|
USBH_IF *p_if,
|
|
USBH_EP *p_ep);
|
|
|
|
USBH_ERR USBH_BulkOutOpen (USBH_DEV *p_dev,
|
|
USBH_IF *p_if,
|
|
USBH_EP *p_ep);
|
|
|
|
USBH_ERR USBH_IntrInOpen (USBH_DEV *p_dev,
|
|
USBH_IF *p_if,
|
|
USBH_EP *p_ep);
|
|
|
|
USBH_ERR USBH_IntrOutOpen (USBH_DEV *p_dev,
|
|
USBH_IF *p_if,
|
|
USBH_EP *p_ep);
|
|
|
|
USBH_ERR USBH_IsocInOpen (USBH_DEV *p_dev,
|
|
USBH_IF *p_if,
|
|
USBH_EP *p_ep);
|
|
|
|
USBH_ERR USBH_IsocOutOpen (USBH_DEV *p_dev,
|
|
USBH_IF *p_if,
|
|
USBH_EP *p_ep);
|
|
|
|
/* -------- DEVICE ENDPOINT TRANSFER FUNCTIONS -------- */
|
|
CPU_INT16U USBH_CtrlTx (USBH_DEV *p_dev,
|
|
CPU_INT08U b_req,
|
|
CPU_INT08U bm_req_type,
|
|
CPU_INT16U w_val,
|
|
CPU_INT16U w_ix,
|
|
void *p_data,
|
|
CPU_INT16U w_len,
|
|
CPU_INT32U timeout_ms,
|
|
USBH_ERR *p_err);
|
|
|
|
CPU_INT16U USBH_CtrlRx (USBH_DEV *p_dev,
|
|
CPU_INT08U b_req,
|
|
CPU_INT08U bm_req_type,
|
|
CPU_INT16U w_val,
|
|
CPU_INT16U w_ix,
|
|
void *p_data,
|
|
CPU_INT16U w_len,
|
|
CPU_INT32U timeout_ms,
|
|
USBH_ERR *p_err);
|
|
|
|
CPU_INT32U USBH_BulkTx (USBH_EP *p_ep,
|
|
void *p_buf,
|
|
CPU_INT32U buf_len,
|
|
CPU_INT32U timeout_ms,
|
|
USBH_ERR *p_err);
|
|
|
|
USBH_ERR USBH_BulkTxAsync (USBH_EP *p_ep,
|
|
void *p_buf,
|
|
CPU_INT32U buf_len,
|
|
USBH_XFER_CMPL_FNCT fnct,
|
|
void *p_fnct_arg);
|
|
|
|
CPU_INT32U USBH_BulkRx (USBH_EP *p_ep,
|
|
void *p_buf,
|
|
CPU_INT32U buf_len,
|
|
CPU_INT32U timeout_ms,
|
|
USBH_ERR *p_err);
|
|
|
|
USBH_ERR USBH_BulkRxAsync (USBH_EP *p_ep,
|
|
void *p_buf,
|
|
CPU_INT32U buf_len,
|
|
USBH_XFER_CMPL_FNCT fnct,
|
|
void *p_fnct_arg);
|
|
|
|
CPU_INT32U USBH_IntrTx (USBH_EP *p_ep,
|
|
void *p_buf,
|
|
CPU_INT32U buf_len,
|
|
CPU_INT32U timeout_ms,
|
|
USBH_ERR *p_err);
|
|
|
|
USBH_ERR USBH_IntrTxAsync (USBH_EP *p_ep,
|
|
void *p_buf,
|
|
CPU_INT32U buf_len,
|
|
USBH_XFER_CMPL_FNCT fnct,
|
|
void *p_fnct_arg);
|
|
|
|
CPU_INT32U USBH_IntrRx (USBH_EP *p_ep,
|
|
void *p_buf,
|
|
CPU_INT32U buf_len,
|
|
CPU_INT32U timeout_ms,
|
|
USBH_ERR *p_err);
|
|
|
|
USBH_ERR USBH_IntrRxAsync (USBH_EP *p_ep,
|
|
void *p_buf,
|
|
CPU_INT32U buf_len,
|
|
USBH_XFER_CMPL_FNCT fnct,
|
|
void *p_fnct_arg);
|
|
|
|
CPU_INT32U USBH_IsocTx (USBH_EP *p_ep,
|
|
CPU_INT08U *p_buf,
|
|
CPU_INT32U buf_len,
|
|
CPU_INT32U start_frm,
|
|
CPU_INT32U nbr_frm,
|
|
CPU_INT16U *p_frm_len,
|
|
USBH_ERR *p_frm_err,
|
|
CPU_INT32U timeout_ms,
|
|
USBH_ERR *p_err);
|
|
|
|
USBH_ERR USBH_IsocTxAsync (USBH_EP *p_ep,
|
|
CPU_INT08U *p_buf,
|
|
CPU_INT32U buf_len,
|
|
CPU_INT32U start_frm,
|
|
CPU_INT32U nbr_frm,
|
|
CPU_INT16U *p_frm_len,
|
|
USBH_ERR *p_frm_err,
|
|
USBH_ISOC_CMPL_FNCT fnct,
|
|
void *p_fnct_arg);
|
|
|
|
CPU_INT32U USBH_IsocRx (USBH_EP *p_ep,
|
|
CPU_INT08U *p_buf,
|
|
CPU_INT32U buf_len,
|
|
CPU_INT32U start_frm,
|
|
CPU_INT32U nbr_frm,
|
|
CPU_INT16U *p_frm_len,
|
|
USBH_ERR *p_frm_err,
|
|
CPU_INT32U timeout_ms,
|
|
USBH_ERR *p_err);
|
|
|
|
USBH_ERR USBH_IsocRxAsync (USBH_EP *p_ep,
|
|
CPU_INT08U *p_buf,
|
|
CPU_INT32U buf_len,
|
|
CPU_INT32U start_frm,
|
|
CPU_INT32U nbr_frm,
|
|
CPU_INT16U *p_frm_len,
|
|
USBH_ERR *p_frm_err,
|
|
USBH_ISOC_CMPL_FNCT fnct,
|
|
void *p_fnct_arg);
|
|
|
|
/* ------------ DEVICE ENDPOINT FUNCTIONS ------------- */
|
|
CPU_INT08U USBH_EP_LogNbrGet (USBH_EP *p_ep);
|
|
|
|
CPU_INT08U USBH_EP_DirGet (USBH_EP *p_ep);
|
|
|
|
CPU_INT16U USBH_EP_MaxPktSizeGet (USBH_EP *p_ep);
|
|
|
|
CPU_INT08U USBH_EP_TypeGet (USBH_EP *p_ep);
|
|
|
|
USBH_ERR USBH_EP_Get (USBH_IF *p_if,
|
|
CPU_INT08U alt_ix,
|
|
CPU_INT08U ep_ix,
|
|
USBH_EP *p_ep);
|
|
|
|
USBH_ERR USBH_EP_StallSet (USBH_EP *p_ep);
|
|
|
|
USBH_ERR USBH_EP_StallClr (USBH_EP *p_ep);
|
|
|
|
USBH_ERR USBH_EP_Reset (USBH_DEV *p_dev,
|
|
USBH_EP *p_ep);
|
|
|
|
USBH_ERR USBH_EP_Close (USBH_EP *p_ep);
|
|
|
|
/* ----------- USB REQUEST BLOCK FUNCTIONS ------------ */
|
|
void USBH_URB_Done (USBH_URB *p_urb);
|
|
|
|
USBH_ERR USBH_URB_Complete (USBH_URB *p_urb);
|
|
|
|
/* ------------- MISCELLENEOUS FUNCTIONS -------------- */
|
|
CPU_INT32U USBH_StrGet (USBH_DEV *p_dev,
|
|
CPU_INT08U desc_ix,
|
|
CPU_INT16U lang_id,
|
|
CPU_INT08U *p_buf,
|
|
CPU_INT32U buf_len,
|
|
USBH_ERR *p_err);
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* CONFIGURATION ERRORS
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#ifndef USBH_CFG_MAX_NBR_DEVS
|
|
#error "USBH_CFG_MAX_NBR_DEVS not #define'd in 'usbh_cfg.h'"
|
|
#elif (USBH_CFG_MAX_NBR_DEVS < 1u)
|
|
#error "USBH_CFG_MAX_NBR_DEVS illegally #define'd in 'usbh_cfg.h'"
|
|
#error " [MUST be >= 1] "
|
|
#elif (USBH_CFG_MAX_NBR_DEVS > 127u)
|
|
#error "USBH_CFG_MAX_NBR_DEVS illegally #define'd in 'usbh_cfg.h'"
|
|
#error " [MUST be <= 127] "
|
|
#endif
|
|
|
|
#ifndef USBH_CFG_MAX_NBR_CFGS
|
|
#error "USBH_CFG_MAX_NBR_CFGS not #define'd in 'usbh_cfg.h'"
|
|
#elif (USBH_CFG_MAX_NBR_CFGS < 1u)
|
|
#error "USBH_CFG_MAX_NBR_CFGS illegally #define'd in 'usbh_cfg.h'"
|
|
#error " [MUST be >= 1] "
|
|
#endif
|
|
|
|
#ifndef USBH_CFG_MAX_NBR_IFS
|
|
#error "USBH_CFG_MAX_NBR_IFS not #define'd in 'usbh_cfg.h'"
|
|
#elif (USBH_CFG_MAX_NBR_IFS < 1u)
|
|
#error "USBH_CFG_MAX_NBR_IFS illegally #define'd in 'usbh_cfg.h'"
|
|
#error " [MUST be >= 1] "
|
|
#endif
|
|
|
|
#ifndef USBH_CFG_MAX_NBR_EPS
|
|
#error "USBH_CFG_MAX_NBR_EPS not #define'd in 'usbh_cfg.h'"
|
|
#elif (USBH_CFG_MAX_NBR_EPS < 1u)
|
|
#error "USBH_CFG_MAX_NBR_EPS illegally #define'd in 'usbh_cfg.h'"
|
|
#error " [MUST be >= 1] "
|
|
#endif
|
|
|
|
#ifndef USBH_CFG_MAX_NBR_CLASS_DRVS
|
|
#error "USBH_CFG_MAX_NBR_CLASS_DRVS not #define'd in 'usbh_cfg.h'"
|
|
#elif (USBH_CFG_MAX_NBR_CLASS_DRVS < 2u)
|
|
#error "USBH_CFG_MAX_NBR_CLASS_DRVS illegally #define'd in 'usbh_cfg.h'"
|
|
#error " [MUST be >= 2] "
|
|
#endif
|
|
|
|
#ifndef USBH_CFG_MAX_CFG_DATA_LEN
|
|
#error "USBH_CFG_MAX_CFG_DATA_LEN not #define'd in 'usbh_cfg.h'"
|
|
#elif (USBH_CFG_MAX_CFG_DATA_LEN < 18u)
|
|
#error "USBH_CFG_MAX_CFG_DATA_LEN illegally #define'd in 'usbh_cfg.h'"
|
|
#error " [MUST be >= 18] "
|
|
#endif
|
|
|
|
#ifndef USBH_CFG_MAX_HUBS
|
|
#error "USBH_CFG_MAX_HUBS not #define'd in 'usbh_cfg.h'"
|
|
#elif (USBH_CFG_MAX_HUBS < 1u)
|
|
#error "USBH_CFG_MAX_HUBS illegally #define'd in 'usbh_cfg.h'"
|
|
#error " [MUST be >= 1 (min value = 1 root hub)}"
|
|
#endif
|
|
|
|
#ifndef USBH_CFG_MAX_HUB_PORTS
|
|
#error "USBH_CFG_MAX_HUB_PORTS not #define'd in 'usbh_cfg.h'"
|
|
#elif (USBH_CFG_MAX_HUB_PORTS < 1u)
|
|
#error "USBH_CFG_MAX_HUB_PORTS illegally #define'd in 'usbh_cfg.h'"
|
|
#error " [MUST be >= 1] "
|
|
#elif (USBH_CFG_MAX_HUB_PORTS > 7u)
|
|
#error "USBH_CFG_MAX_HUB_PORTS illegally #define'd in 'usbh_cfg.h'"
|
|
#error "USBH_CFG_MAX_HUB_PORTS cannot exceed 7 ports per external hub. "
|
|
#endif
|
|
|
|
#ifndef USBH_CFG_STD_REQ_RETRY
|
|
#error "USBH_CFG_STD_REQ_RETRY not #define'd in 'usbh_cfg.h'"
|
|
#elif (USBH_CFG_STD_REQ_RETRY < 1u)
|
|
#error "USBH_CFG_STD_REQ_RETRY illegally #define'd in 'usbh_cfg.h'"
|
|
#error " [MUST be >= 1] "
|
|
#endif
|
|
|
|
#ifndef USBH_CFG_STD_REQ_TIMEOUT
|
|
#error "USBH_CFG_STD_REQ_TIMEOUT not #define'd in 'usbh_cfg.h'"
|
|
#endif
|
|
|
|
#ifndef USBH_CFG_MAX_STR_LEN
|
|
#error "USBH_CFG_MAX_STR_LEN not #define'd in 'usbh_cfg.h'"
|
|
#elif (USBH_CFG_MAX_STR_LEN > 256u)
|
|
#error "USBH_CFG_MAX_STR_LEN illegally #define'd in 'usbh_cfg.h'"
|
|
#error " [MUST be <= 256] "
|
|
#endif
|
|
|
|
#ifndef USBH_CFG_MAX_NBR_HC
|
|
#error "USBH_CFG_MAX_NBR_HC not #define'd in 'usbh_cfg.h'"
|
|
#elif (USBH_CFG_MAX_NBR_HC < 1u)
|
|
#error "USBH_CFG_MAX_NBR_HC illegally #define'd in 'usbh_cfg.h'"
|
|
#error " [MUST be >= 1] "
|
|
#endif
|
|
|
|
#ifndef USBH_CFG_MAX_ISOC_DESC
|
|
#error "USBH_CFG_MAX_ISOC_DESC not #define'd in 'usbh_cfg.h'"
|
|
#elif (USBH_CFG_MAX_ISOC_DESC < 1u)
|
|
#error "USBH_CFG_MAX_ISOC_DESC illegally #define'd in 'usbh_cfg.h'"
|
|
#error " [MUST be >= 1] "
|
|
#endif
|
|
|
|
#ifndef USBH_CFG_MAX_EXTRA_URB_PER_DEV
|
|
#error "USBH_CFG_MAX_EXTRA_URB_PER_DEV not #define'd in 'usbh_cfg.h'"
|
|
#elif (USBH_CFG_MAX_EXTRA_URB_PER_DEV < 1u)
|
|
#error "USBH_CFG_MAX_EXTRA_URB_PER_DEV illegally #define'd in 'usbh_cfg.h'"
|
|
#error " [MUST be >= 1] "
|
|
#endif
|
|
|
|
#ifndef USBH_CFG_MAX_NUM_DEV_RECONN
|
|
#error "USBH_CFG_MAX_NUM_DEV_RECONN not #define'd in 'usbh_cfg.h'"
|
|
#endif
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* MODULE END
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#endif
|