1 /* mbed USBHost Library
2 * Copyright (c) 2006-2013 ARM Limited
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
21 #include "toolchain.h"
27 USB_TYPE_CRC_ERROR
= 1,
28 USB_TYPE_BIT_STUFFING_ERROR
= 2,
29 USB_TYPE_DATA_TOGGLE_MISMATCH_ERROR
= 3,
30 USB_TYPE_STALL_ERROR
= 4,
31 USB_TYPE_DEVICE_NOT_RESPONDING_ERROR
= 5,
32 USB_TYPE_PID_CHECK_FAILURE_ERROR
= 6,
33 USB_TYPE_UNEXPECTED_PID_ERROR
= 7,
34 USB_TYPE_DATA_OVERRUN_ERROR
= 8,
35 USB_TYPE_DATA_UNDERRUN_ERROR
= 9,
36 USB_TYPE_RESERVED
= 9,
37 USB_TYPE_RESERVED_
= 10,
38 USB_TYPE_BUFFER_OVERRUN_ERROR
= 12,
39 USB_TYPE_BUFFER_UNDERRUN_ERROR
= 13,
42 USB_TYPE_DISCONNECTED
= 14,
45 USB_TYPE_PROCESSING
= 17,
51 enum ENDPOINT_DIRECTION
{
63 #define AUDIO_CLASS 0x01
64 #define CDC_CLASS 0x02
65 #define HID_CLASS 0x03
66 #define MSD_CLASS 0x08
67 #define HUB_CLASS 0x09
68 #define SERIAL_CLASS 0x0A
70 // ------------------ HcControl Register ---------------------
71 #define OR_CONTROL_PLE 0x00000004
72 #define OR_CONTROL_CLE 0x00000010
73 #define OR_CONTROL_BLE 0x00000020
74 #define OR_CONTROL_HCFS 0x000000C0
75 #define OR_CONTROL_HC_OPER 0x00000080
76 // ----------------- HcCommandStatus Register -----------------
77 #define OR_CMD_STATUS_HCR 0x00000001
78 #define OR_CMD_STATUS_CLF 0x00000002
79 #define OR_CMD_STATUS_BLF 0x00000004
80 // --------------- HcInterruptStatus Register -----------------
81 #define OR_INTR_STATUS_WDH 0x00000002
82 #define OR_INTR_STATUS_RHSC 0x00000040
83 #define OR_INTR_STATUS_UE 0x00000010
84 // --------------- HcInterruptEnable Register -----------------
85 #define OR_INTR_ENABLE_WDH 0x00000002
86 #define OR_INTR_ENABLE_RHSC 0x00000040
87 #define OR_INTR_ENABLE_MIE 0x80000000
88 // ---------------- HcRhDescriptorA Register ------------------
89 #define OR_RH_STATUS_LPSC 0x00010000
90 #define OR_RH_STATUS_DRWE 0x00008000
91 // -------------- HcRhPortStatus[1:NDP] Register --------------
92 #define OR_RH_PORT_CCS 0x00000001
93 #define OR_RH_PORT_PRS 0x00000010
94 #define OR_RH_PORT_CSC 0x00010000
95 #define OR_RH_PORT_PRSC 0x00100000
96 #define OR_RH_PORT_LSDA 0x00000200
98 #define FI 0x2EDF // 12000 bits per frame (-1)
99 #define DEFAULT_FMINTERVAL ((((6 * (FI - 210)) / 7) << 16) | FI)
101 #define ED_SKIP (uint32_t) (0x00001000) // Skip this ep in queue
103 #define TD_ROUNDING (uint32_t) (0x00040000) // Buffer Rounding
104 #define TD_SETUP (uint32_t)(0) // Direction of Setup Packet
105 #define TD_IN (uint32_t)(0x00100000) // Direction In
106 #define TD_OUT (uint32_t)(0x00080000) // Direction Out
107 #define TD_DELAY_INT(x) (uint32_t)((x) << 21) // Delay Interrupt
108 #define TD_TOGGLE_0 (uint32_t)(0x02000000) // Toggle 0
109 #define TD_TOGGLE_1 (uint32_t)(0x03000000) // Toggle 1
110 #define TD_CC (uint32_t)(0xF0000000) // Completion Code
112 #define DEVICE_DESCRIPTOR (1)
113 #define CONFIGURATION_DESCRIPTOR (2)
114 #define INTERFACE_DESCRIPTOR (4)
115 #define ENDPOINT_DESCRIPTOR (5)
116 #define HID_DESCRIPTOR (33)
118 // ----------- Control RequestType Fields -----------
119 #define USB_DEVICE_TO_HOST 0x80
120 #define USB_HOST_TO_DEVICE 0x00
121 #define USB_REQUEST_TYPE_CLASS 0x20
122 #define USB_REQUEST_TYPE_STANDARD 0x00
123 #define USB_RECIPIENT_DEVICE 0x00
124 #define USB_RECIPIENT_INTERFACE 0x01
125 #define USB_RECIPIENT_ENDPOINT 0x02
127 // -------------- USB Standard Requests --------------
128 #define SET_ADDRESS 0x05
129 #define GET_DESCRIPTOR 0x06
130 #define SET_CONFIGURATION 0x09
131 #define SET_INTERFACE 0x0b
132 #define CLEAR_FEATURE 0x01
134 // -------------- USB Descriptor Length --------------
135 #define DEVICE_DESCRIPTOR_LENGTH 0x12
136 #define CONFIGURATION_DESCRIPTOR_LENGTH 0x09
138 // ------------ HostController Transfer Descriptor ------------
139 typedef struct HCTD
{
140 __IO
uint32_t control
; // Transfer descriptor control
141 __IO
uint8_t * currBufPtr
; // Physical address of current buffer pointer
142 __IO HCTD
* nextTD
; // Physical pointer to next Transfer Descriptor
143 __IO
uint8_t * bufEnd
; // Physical address of end of buffer
144 void * ep
; // ep address where a td is linked in
145 uint32_t dummy
[3]; // padding
148 // ----------- HostController EndPoint Descriptor -------------
149 typedef struct hcEd
{
150 __IO
uint32_t control
; // Endpoint descriptor control
151 __IO HCTD
* tailTD
; // Physical address of tail in Transfer descriptor list
152 __IO HCTD
* headTD
; // Physcial address of head in Transfer descriptor list
153 __IO hcEd
* nextED
; // Physical address of next Endpoint descriptor
157 // ----------- Host Controller Communication Area ------------
158 typedef struct hcca
{
159 __IO
uint32_t IntTable
[32]; // Interrupt Table
160 __IO
uint32_t FrameNumber
; // Frame Number
161 __IO
uint32_t DoneHead
; // Done Head
162 volatile uint8_t Reserved
[116]; // Reserved for future use
163 volatile uint8_t Unknown
[4]; // Unused
168 uint8_t bDescriptorType
;
170 uint8_t bDeviceClass
;
171 uint8_t bDeviceSubClass
;
172 uint8_t bDeviceProtocol
;
173 uint8_t bMaxPacketSize
;
177 uint8_t iManufacturer
;
179 uint8_t iSerialNumber
;
180 uint8_t bNumConfigurations
;
181 } PACKED DeviceDescriptor
;
185 uint8_t bDescriptorType
;
186 uint16_t wTotalLength
;
187 uint8_t bNumInterfaces
;
188 uint8_t bConfigurationValue
;
189 uint8_t iConfiguration
;
190 uint8_t bmAttributes
;
192 } PACKED ConfigurationDescriptor
;
196 uint8_t bDescriptorType
;
197 uint8_t bInterfaceNumber
;
198 uint8_t bAlternateSetting
;
199 uint8_t bNumEndpoints
;
200 uint8_t bInterfaceClass
;
201 uint8_t bInterfaceSubClass
;
202 uint8_t bInterfaceProtocol
;
204 } InterfaceDescriptor
;
208 uint8_t bDescriptorType
;
209 uint8_t bEndpointAddress
;
210 uint8_t bmAttributes
;
211 uint16_t wMaxPacketSize
;
213 } EndpointDescriptor
;
217 uint8_t bDescriptorType
;
219 uint16_t wHubCharacteristics
;
220 uint8_t bPwrOn2PwrGood
;
221 uint8_t bHubContrCurrent
;
222 uint8_t DeviceRemovable
;
223 uint8_t PortPweCtrlMak
;