M480 BSP
V3.05.005
The Board Support Package for M480 Series
UsbHostLib
inc
ehci.h
Go to the documentation of this file.
1
/**************************************************************************/
10
#ifndef _USBH_EHCI_H_
11
#define _USBH_EHCI_H_
12
14
15
struct
utr_t;
16
struct
udev_t;
17
struct
qh_t;
18
struct
iso_ep_t;
19
struct
ep_info_t;
20
21
/*----------------------------------------------------------------------------------------*/
22
/* Periodic Frame List Size (256, 512, or 1024) */
23
/*----------------------------------------------------------------------------------------*/
24
#define FL_SIZE 1024
/* frame list size can be 256, 512, or 1024 */
25
#define NUM_IQH 11
/* depends on FL_SIZE, 256:9, 512:10, 1024:11 */
26
27
28
/*----------------------------------------------------------------------------------------*/
29
/* Interrupt Threshold Control (1, 2, 4, 6, .. 64) */
30
/*----------------------------------------------------------------------------------------*/
31
#define UCMDR_INT_THR_CTRL (0x1<<HSUSBH_UCMDR_ITC_Pos)
/* 1 micro-frames */
32
33
34
/*----------------------------------------------------------------------------------------*/
35
/* Queue Element Transfer Descriptor (qTD) */
36
/*----------------------------------------------------------------------------------------*/
37
typedef
struct
qTD_t
38
{
39
uint32_t Next_qTD;
/* Next qTD Pointer */
40
uint32_t Alt_Next_qTD;
/* Alternate Next qTD Pointer */
41
uint32_t Token;
/* qTD Token */
42
uint32_t Bptr[5];
/* qTD Buffer Page Pointer List */
43
/*
44
* The following members are used by USB Host libary.
45
*/
46
struct
utr_t *utr;
/* associated UTR */
47
uint32_t xfer_len;
/* assigned transfer transfer length */
48
struct
qh_t *qh;
/* The QH that this qTD belong to. */
49
struct
qTD_t *next;
/* link for <qtd_list> of QH */
50
} qTD_T;
51
52
53
#define QTD_LIST_END 0x1
/* Indicate the terminate of qTD list. */
54
#define QTD_PTR(x) ((qTD_T *)((uint32_t)(x) & ~0x1F))
55
56
/*
57
* Status: qTD Token[7:0]
58
*/
59
#define QTD_STS_PS_OUT (0<<0)
/* directs the HC to issue an OUT PID */
60
#define QTD_STS_PS_PING (1<<0)
/* directs the HC to issue an PING PID */
61
#define QTD_STS_SPLIT_STRAT (0<<1)
/* directs the HC to issue an Start split */
62
#define QTD_STS_SPLIT_COMPLETE (1<<1)
/* directs the HC to issue an Complete split */
63
#define QTD_STS_MISS_MF (1<<2)
/* miss a required complete-split transaction */
64
#define QTD_STS_XactErr (1<<3)
/* Transaction Error occurred */
65
#define QTD_STS_BABBLE (1<<4)
/* Babble Detected */
66
#define QTD_STS_DATA_BUFF_ERR (1<<5)
/* Data Buffer Error */
67
#define QTD_STS_HALT (1<<6)
/* Halted */
68
#define QTD_STS_ACTIVE (1<<7)
/* Active */
69
70
/*
71
* PID: qTD Token[9:8]
72
*/
73
#define QTD_PID_Msk (0x3<<8)
74
#define QTD_PID_OUT (0<<8)
/* generates token (E1H) */
75
#define QTD_PID_IN (1<<8)
/* generates token (69H) */
76
#define QTD_PID_SETUP (2<<8)
/* generates token (2DH) */
77
78
#define QTD_ERR_COUNTER (3<<10)
/* Token[11:10] */
79
#define QTD_IOC (1<<15)
/* Token[15] - Interrupt On Complete */
80
#define QTD_TODO_LEN_Pos 16
/* Token[31:16] - Total Bytes to Transfer */
81
#define QTD_TODO_LEN(x) (((x)>>16) & 0x7FFF)
82
#define QTD_DT (1UL<<31)
/* Token[31] - Data Toggle */
83
84
/*----------------------------------------------------------------------------------------*/
85
/* Queue Head (QH) */
86
/*----------------------------------------------------------------------------------------*/
87
typedef
struct
qh_t
88
{
89
/* OHCI spec. Endpoint descriptor */
90
uint32_t HLink;
/* Queue Head Horizontal Link Pointer */
91
uint32_t Chrst;
/* Endpoint Characteristics: QH DWord 1 */
92
uint32_t Cap;
/* Endpoint Capabilities: QH DWord 2 */
93
uint32_t Curr_qTD;
/* Current qTD Pointer */
94
/*
95
* The followings are qTD Transfer Overlay
96
*/
97
uint32_t OL_Next_qTD;
/* Next qTD Pointer */
98
uint32_t OL_Alt_Next_qTD;
/* Alternate Next qTD Pointer */
99
uint32_t OL_Token;
/* qTD Token */
100
uint32_t OL_Bptr[5];
/* qTD Buffer Page Pointer List */
101
/*
102
* The following members are used by USB Host libary.
103
*/
104
qTD_T *dummy;
/* point to the inactive dummy qTD */
105
qTD_T *qtd_list;
/* currently linked qTD transfers */
106
qTD_T *done_list;
/* currently linked qTD transfers */
107
struct
qh_t *next;
/* point to the next QH in remove list */
108
} QH_T;
109
110
/* HLink[0] T field of "Queue Head Horizontal Link Pointer" */
111
#define QH_HLNK_END 0x1
112
113
/*
114
* HLink[2:1] Typ field of "Queue Head Horizontal Link Pointer"
115
*/
116
#define QH_HLNK_ITD(x) (((uint32_t)(x) & ~0x1F) | 0x0)
117
#define QH_HLNK_QH(x) (((uint32_t)(x) & ~0x1F) | 0x2)
118
#define QH_HLNK_SITD(x) (((uint32_t)(x) & ~0x1F) | 0x4)
119
#define QH_HLNK_FSTN(x) (((uint32_t)(x) & ~0x1F) | 0x6)
120
#define QH_PTR(x) ((QH_T *)((uint32_t)(x) & ~0x1F))
121
122
/*
123
* Bit fields of "Endpoint Characteristics"
124
*/
125
#define QH_NAK_RL (4L<<28)
/* Chrst[31:28] - NAK Count Reload */
126
#define QH_CTRL_EP_FLAG (1<<27)
/* Chrst[27] - Control Endpoint Flag */
127
#define QH_RCLM_LIST_HEAD (1<<15)
/* Chrst[15] - Head of Reclamation List Flag */
128
#define QH_DTC (1<<14)
/* Chrst[14] - Data Toggle Control */
129
#define QH_EPS_FULL (0<<12)
/* Chrst[13:12] - Endpoint Speed (Full) */
130
#define QH_EPS_LOW (1<<12)
/* Chrst[13:12] - Endpoint Speed (Low) */
131
#define QH_EPS_HIGH (2<<12)
/* Chrst[13:12] - Endpoint Speed (High) */
132
#define QH_I_NEXT (1<<7)
/* Chrst[7] - Inactivate on Next Transaction */
133
134
/*
135
* Bit fields of "Endpoint Capabilities"
136
*/
137
#define QH_MULT_Pos 30
/* Cap[31:30] - High-Bandwidth Pipe Multiplier */
138
#define QH_HUB_PORT_Pos 23
/* Cap[29:23] - Hub Port Number */
139
#define QH_HUB_ADDR_Pos 16
/* Cap[22:16] - Hub Addr */
140
#define QH_C_MASK_Msk 0xFF00
/* Cap[15:8] - uFrame C-mask */
141
#define QH_S_MASK_Msk 0x00FF
/* Cap[7:0] - uFrame S-mask */
142
143
144
/*----------------------------------------------------------------------------------------*/
145
/* Isochronous (High-Speed) Transfer Descriptor (iTD) */
146
/*----------------------------------------------------------------------------------------*/
147
typedef
struct
itd_t
148
{
149
uint32_t Next_Link;
/* Next Link Pointer */
150
uint32_t Transaction[8];
/* Transaction Status and Control */
151
uint32_t Bptr[7];
/* Buffer Page Pointer List */
152
/*
153
* The following members are used by USB Host libary.
154
*/
155
struct
iso_ep_t *iso_ep;
/* associated isochronous information block */
156
struct
utr_t *utr;
/* associated UTR */
157
uint32_t buff_base;
/* buffer base address */
158
uint8_t fidx;
/* iTD's first index to UTR iso frames */
159
uint8_t trans_mask;
/* mask of activated transactions in iTD */
160
uint32_t sched_frnidx;
/* scheduled frame index */
161
struct
itd_t *next;
/* used by software to maintain iTD list */
162
} iTD_T;
163
164
/*
165
* Next_Link[2:1] Typ field of "Next Schedule Element Pointer" Typ field
166
*/
167
#define ITD_HLNK_ITD(x) (((uint32_t)(x) & ~0x1F) | 0x0)
168
#define ITD_HLNK_QH(x) (((uint32_t)(x) & ~0x1F) | 0x2)
169
#define ITD_HLNK_SITD(x) (((uint32_t)(x) & ~0x1F) | 0x4)
170
#define ITD_HLNK_FSTN(x) (((uint32_t)(x) & ~0x1F) | 0x6)
171
#define ITD_PTR(x) ((iTD_T *)((uint32_t)(x) & ~0x1F))
172
173
/*
174
* Transaction[8]
175
*/
176
#define ITD_STATUS(x) (((x)>>28)&0xF)
177
#define ITD_STATUS_ACTIVE (0x80000000UL)
/* Active */
178
#define ITD_STATUS_BUFF_ERR (0x40000000UL)
/* Data Buffer Error */
179
#define ITD_STATUS_BABBLE (0x20000000UL)
/* Babble Detected */
180
#define ITD_STATUS_XACT_ERR (0x10000000UL)
/* Transcation Error */
181
182
#define ITD_XLEN_Pos 16
183
#define ITD_XFER_LEN(x) (((x)>>16)&0xFFF)
184
#define ITD_IOC (1<<15)
185
#define ITD_PG_Pos 12
186
#define ITD_XFER_OFF_Msk 0xFFF
187
188
/*
189
* Bptr[7]
190
*/
191
#define ITD_BUFF_PAGE_Pos 12
192
/* Bptr[0] */
193
#define ITD_EP_NUM_Pos 8
194
#define ITD_EP_NUM(itd) (((itd)->Bptr[0]>>8)&0xF)
195
#define ITD_DEV_ADDR_Pos 0
196
#define ITD_DEV_ADDR(itd) ((itd)->Bptr[0]&0x7F)
197
/* Bptr[1] */
198
#define ITD_DIR_IN (1<<11)
199
#define ITD_DIR_OUT (0<<11)
200
#define ITD_MAX_PKTSZ_Pos 0
201
#define ITD_MAX_PKTSZ(itd) ((itd)->Bptr[1]&0x7FF)
202
203
/*----------------------------------------------------------------------------------------*/
204
/* Split Isochronous (Full-Speed) Transfer Descriptor (siTD) */
205
/*----------------------------------------------------------------------------------------*/
206
typedef
struct
sitd_t
207
{
208
uint32_t Next_Link;
/* Next Link Pointer */
209
uint32_t Chrst;
/* Endpoint and Transaction Translator Characteristics */
210
uint32_t Sched;
/* Micro-frame Schedule Control */
211
uint32_t StsCtrl;
/* siTD Transfer Status and Control */
212
uint32_t Bptr[2];
/* Buffer Page Pointer List */
213
uint32_t BackLink;
/* siTD Back Link Pointer */
214
/*
215
* The following members are used by USB Host libary.
216
*/
217
struct
iso_ep_t *iso_ep;
/* associated isochronous information block */
218
struct
utr_t *utr;
/* associated UTR */
219
uint8_t fidx;
/* iTD's first index to UTR iso frames */
220
uint32_t sched_frnidx;
/* scheduled frame index */
221
struct
sitd_t *next;
/* used by software to maintain siTD list */
222
} siTD_T;
223
224
#define SITD_LIST_END 0x1
/* Indicate the terminate of siTD list. */
225
226
#define SITD_XFER_IO_Msk (1UL<<31)
227
#define SITD_XFER_IN (1UL<<31)
228
#define SITD_XFER_OUT (0UL<<31)
229
230
#define SITD_PORT_NUM_Pos 24
231
#define SITD_HUB_ADDR_Pos 16
232
#define SITD_EP_NUM_Pos 8
233
#define SITD_DEV_ADDR_Pos 0
234
235
#define SITD_IOC (1UL<<31)
236
#define SITD_XFER_CNT_Pos 16
237
#define SITD_XFER_CNT_Msk (0x3FF<<SITD_XFER_CNT_Pos)
238
239
#define SITD_STATUS(x) ((x)&0xFC)
240
#define SITD_STATUS_ACTIVE 0x80
241
#define SITD_STATUS_ERR 0x40
242
#define SITD_STATUS_BUFF_ERR 0x20
243
#define SITD_BABBLE_DETECTED 0x10
244
#define SITD_STATUS_XFER_ERR 0x08
245
#define SITD_STATUS_MISSED_MF 0x04
246
#define SITD_STATUS_ERROR_MASK 0x78
247
248
249
/*
250
* Next_Link[2:1] Typ field of "Next Schedule Element Pointer" Typ field
251
*/
252
#define SITD_HLNK_ITD(x) (((uint32_t)(x) & ~0x1F) | 0x0)
253
#define SITD_HLNK_QH(x) (((uint32_t)(x) & ~0x1F) | 0x2)
254
#define SITD_HLNK_SITD(x) (((uint32_t)(x) & ~0x1F) | 0x4)
255
#define SITD_HLNK_FSTN(x) (((uint32_t)(x) & ~0x1F) | 0x6)
256
#define SITD_PTR(x) ((siTD_T *)((uint32_t)(x) & ~0x1F))
257
258
#define HLINK_IS_TERMINATED(x) (((uint32_t)(x) & 0x1) ? 1 : 0)
259
#define HLINK_IS_SITD(x) ((((uint32_t)(x) & 0x6) == 0x4) ? 1 : 0)
260
261
/*----------------------------------------------------------------------------------------*/
262
/* Isochronous endpoint transfer information block. (Software only) */
263
/*----------------------------------------------------------------------------------------*/
264
typedef
struct
iso_ep_t
265
{
266
struct
ep_info_t *ep;
267
uint32_t next_frame;
/* frame number of next scheduling */
268
iTD_T *itd_list;
/* Reference to a list of installed iTDs */
269
iTD_T *itd_done_list;
/* Reference to a list of completed iTDs */
270
siTD_T *sitd_list;
/* Reference to a list of installed siTDs */
271
siTD_T *sitd_done_list;
/* Reference to a list of completed siTDs */
272
struct
iso_ep_t *next;
/* used by software to maintain ISO EP list */
273
} ISO_EP_T;
274
275
extern
void
scan_isochronous_list(
void
);
276
278
279
#endif
/* _USBH_EHCI_H_ */
280
Generated on Thu Mar 16 2023 13:35:50 for M480 BSP by
1.9.3