1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
|
/*
* Copyright (C) ST-Ericsson SA 2009
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#ifndef __MUSB_UDC_H__
#define __MUSB_UDC_H__
#include <linux/byteorder/little_endian.h>
#include <linux/byteorder/generic.h>
/* Endpoint parameters */
#define EP_MAX_PACKET_SIZE 512
#define EP0_MAX_PACKET_SIZE 64
#define UDC_OUT_PACKET_SIZE EP_MAX_PACKET_SIZE
#define UDC_IN_PACKET_SIZE EP_MAX_PACKET_SIZE
#define UDC_INT_PACKET_SIZE EP_MAX_PACKET_SIZE//64
#define UDC_BULK_PACKET_SIZE EP_MAX_PACKET_SIZE
/* Get offset for a given FIFO */
#define FIFO_OFFSET(_bEnd) (0x20 + (_bEnd * 4))
/* Endpoint 0 states */
#define END0_STAGE_SETUP 0x0
#define END0_STAGE_TX 0x1
#define END0_STAGE_RX 0x2
#define END0_STAGE_STATUSIN 0x3
#define END0_STAGE_STATUSOUT 0x4
#define END0_STAGE_STALL_BIT 0x10
/* offsets to registers in flat model */
#define HDRC_TXMAXP 0x00
#define HDRC_TXCSR 0x02
#define HDRC_CSR0 HDRC_TXCSR /* re-used for EP0 */
#define HDRC_RXMAXP 0x04
#define HDRC_RXCSR 0x06
#define HDRC_RXCOUNT 0x08
#define HDRC_COUNT0 HDRC_RXCOUNT /* re-used for EP0 */
#define HDRC_TXTYPE 0x0A
#define HDRC_TYPE0 HDRC_TXTYPE /* re-used for EP0 */
#define HDRC_TXINTERVAL 0x0B
#define HDRC_NAKLIMIT0 HDRC_TXINTERVAL /* re-used for EP0 */
#define HDRC_RXTYPE 0x0C
#define HDRC_RXINTERVAL 0x0D
#define HDRC_INDEX 0x0E
#define HDRC_FIFOSIZE 0x0F
#define HDRC_CONFIGDATA HDRC_FIFOSIZE /* re-used for EP0 */
/* INTRUSB */
#define INTR_SUSPEND 0x01
#define INTR_RESUME 0x02
#define INTR_RESET 0x04
#define INTR_BABBLE 0x04
#define INTR_SOF 0x08
#define INTR_CONNECT 0x10
#define INTR_DISCONNECT 0x20
#define INTR_SESSREQ 0x40
#define INTR_VBUSERROR 0x80 /* FOR SESSION END */
#define INTR_EP0 0x01 /* FOR EP0 INTERRUPT */
/* CONFIGDATA */
#define CONFIGDATA_MPRXE 0x80 /* auto bulk pkt combining */
#define CONFIGDATA_MPTXE 0x40 /* auto bulk pkt splitting */
#define CONFIGDATA_BIGENDIAN 0x20
#define CONFIGDATA_HBRXE 0x10 /* HB-ISO for RX */
#define CONFIGDATA_HBTXE 0x08 /* HB-ISO for TX */
#define CONFIGDATA_DYNFIFO 0x04 /* dynamic FIFO sizing */
#define CONFIGDATA_SOFTCONE 0x02 /* SoftConnect */
#define CONFIGDATA_UTMIDW 0x01 /* data width 0 => 8bits, 1 => 16bits */
/* DEVCTL */
#define DEVCTL_BDEVICE 0x80
#define DEVCTL_FSDEV 0x40
#define DEVCTL_LSDEV 0x20
#define DEVCTL_VBUS 0x18
#define DEVCTL_HM 0x04
#define DEVCTL_HR 0x02
#define DEVCTL_SESSION 0x01
/* TXCSR in Peripheral mode */
#define TXCSR_AUTOSET 0x8000
#define TXCSR_ISO 0x4000
#define TXCSR_MODE 0x2000
#define TXCSR_DMAENAB 0x1000
#define TXCSR_FRCDATATOG 0x0800
#define TXCSR_DMAMODE 0x0400
#define TXCSR_CLRDATATOG 0x0040
#define TXCSR_FLUSHFIFO 0x0008
#define TXCSR_FIFONOTEMPTY 0x0002
#define TXCSR_TXPKTRDY 0x0001
#define TXCSR_P_INCOMPTX 0x0080
#define TXCSR_P_SENTSTALL 0x0020
#define TXCSR_P_SENDSTALL 0x0010
#define TXCSR_P_UNDERRUN 0x0004
/* RXCSR in Peripheral */
#define RXCSR_AUTOCLEAR 0x8000
#define RXCSR_DMAENAB 0x2000
#define RXCSR_DISNYET 0x1000
#define RXCSR_DMAMODE 0x0800
#define RXCSR_INCOMPRX 0x0100
#define RXCSR_CLRDATATOG 0x0080
#define RXCSR_FLUSHFIFO 0x0010
#define RXCSR_DATAERROR 0x0008
#define RXCSR_FIFOFULL 0x0002
#define RXCSR_RXPKTRDY 0x0001
#define RXCSR_P_ISO 0x4000
#define RXCSR_P_SENTSTALL 0x0040
#define RXCSR_P_SENDSTALL 0x0020
#define RXCSR_P_OVERRUN 0x0004
#define READ8(base_ptr, offset) *((volatile u8*)((unsigned long)base_ptr + offset))
#define READ16(base_ptr, offset) *((volatile u16*)((unsigned long)base_ptr + offset))
#define READ32(base_ptr, offset) *((volatile uint32_t*)((unsigned long)base_ptr + offset))
#define WRITE8(base_ptr, offset, data) *(volatile u8*)((unsigned long)base_ptr + offset) = data;
#define WRITE16(base_ptr, offset, data) *(volatile u16*)((unsigned long)base_ptr + offset) = data;
#define WRITE32(base_ptr, offset, data) *(volatile uint32_t*)((unsigned long)base_ptr + offset) = data;
#define SELECTEND(base_ptr, end) WRITE8(base_ptr, HDRC_INDEX, end)
#define READCSR8(base_ptr, offset, end) READ8(base_ptr, (offset + 0x10))
#define READCSR16(base_ptr, offset, end) READ16(base_ptr, (offset + 0x10))
#define WRITECSR8(base_ptr, offset, end, data) WRITE8(base_ptr, (offset + 0x10), data)
#define WRITECSR16(base_ptr, offset, end, data) WRITE16(base_ptr, (offset + 0x10), data)
#define MODE_ULPI 0x01
#define POWER_HSENAB 0x20
#define POWER_SOFTCONN 0x40
/*EP0 related macros */
/* CSR0 in Peripheral mode */
#define CSR0_P_SVDSETUPEND 0x0080
#define CSR0_P_SVDRXPKTRDY 0x0040
#define CSR0_P_SENDSTALL 0x0020
#define CSR0_P_SETUPEND 0x0010
#define CSR0_P_DATAEND 0x0008
#define CSR0_P_SENTSTALL 0x0004
#define CSR0_FLUSHFIFO 0x0100
#define CSR0_TXPKTRDY 0x0002
#define CSR0_RXPKTRDY 0x0001
#define EP_ACTIVE 0
#define EP_HALTED 1
#define EP_DISABLED 2
/* TESTMODE */
#define TEST_FORCE_HOST 0x80
#define TEST_FIFO_ACCESS 0x40
#define TEST_FORCE_FS 0x20
#define TEST_FORCE_HS 0x10
#define TEST_PACKET 0x08
#define TEST_K 0x04
#define TEST_J 0x02
#define TEST_SE0_NAK 0x01
struct endpoint_control {
__u8 OTG_TX0FAD;
__u8 FILL4;
__u8 OTG_TX0HAD;
__u8 OTG_TX0HP;
__u8 OTG_RX0FAD;
__u8 FILL5;
__u8 OTG_RX0HAD;
__u8 OTG_RX0HP;
};
struct mg_dev_register
{
__u8 OTG_FADDR;
__u8 OTG_PWR;
__u16 OTG_INTTX;
__u16 OTG_INTRX;
__u16 OTG_INTTXEN;
__u16 OTG_INTRXEN;
__u8 OTG_INTUSB;
__u8 OTG_INTUSBEN;
__u16 OTG_FMNO;
__u8 OTG_INDX;
__u8 OTG_TM;
__u16 OTG_TXMAXP;
__u16 OTG_CSR0_TXCSR;
__u16 OTG_RXMAXP;
__u16 OTG_RXCSR;
__u16 OTG_CNT0_RXCNT;
__u8 OTG_TYPE0_TXTYPE;
__u8 OTG_NAKLMT0_TXINTV;
__u8 OTG_RXTYPE;
__u8 OTG_RXINTV;
__u8 FILL0;
__u8 OTG_CFD_FSIZE;
/* FIFO registers */
__u32 OTG_FIFO[16];
__u8 OTG_DEVCTL;
__u8 FILL1;
__u8 OTG_TXFSZ;
__u8 OTG_RXFSZ;
__u16 OTG_TXFA;
__u16 OTG_RXFA;
__u32 OTG_VCNTL;
__u16 OTG_HWVER;
__u16 FILL2;
__u8 OTG_UVBCTRL;
__u8 OTG_UCKIT;
__u8 OTG_UINTMASK;
__u8 OTG_UINTSRC;
__u8 OTG_UREGDATA;
__u8 OTG_UREGADDR;
__u8 OTG_UREGCTRL;
__u8 OTG_URAWDATA;
__u8 OTG_EPINFO;
__u8 OTG_RAMINFO;
__u8 OTG_LINKINFO;
__u8 OTG_VPLEN;
__u8 OTG_HSEOF1;
__u8 OTG_FSEOF1;
__u8 OTG_LSEOF1;
__u8 OTG_SOFTRST;
/* Target Endpoint control registers */
struct endpoint_control endp_control[16];
/* Control Status register for Endpoint 0 */
__u16 OTG_TX0MAXP;
__u16 OTG_CSR0;
__u16 OTG_RX0MAXP;
__u16 OTG_RX0CSR;
__u16 OTG_CNT0;
__u8 OTG_TYPE0;
__u8 OTG_NAKLMT0;
__u8 OTG_RX0TYPE;
__u8 OTG_RX0INTV;
__u8 FILL36;
__u8 OTG_CFD;
/* Control Status register for Endpoint 1 */
__u16 OTG_TX1MAXP;
__u16 OTG_TX1CSR;
__u16 OTG_RX1MAXP;
__u16 OTG_RX1CSR;
__u16 OTG_RX1CNT;
__u8 OTG_TX1TYPE;
__u8 OTG_TX1INTV;
__u8 OTG_RX1TYPE;
__u8 OTG_RX1INTV;
__u8 FILL37;
__u8 OTG_FSIZE1;
/* Control Status register for Endpoint 2 */
__u16 OTG_TX2MAXP;
__u16 OTG_TX2CSR;
__u16 OTG_RX2MAXP;
__u16 OTG_RX2CSR;
__u16 OTG_RX2CNT;
__u8 OTG_TX2TYPE;
__u8 OTG_TX2INTV;
__u8 OTG_RX2TYPE;
__u8 OTG_RX2INTV;
__u8 FILL38;
__u8 OTG_FSIZE2;
/* Control Status register for Endpoint 3 */
__u16 OTG_TX3MAXP;
__u16 OTG_TX3CSR;
__u16 OTG_RX3MAXP;
__u16 OTG_RX3CSR;
__u16 OTG_RX3CNT;
__u8 OTG_TX3TYPE;
__u8 OTG_TX3INTV;
__u8 OTG_RX3TYPE;
__u8 OTG_RX3INTV;
__u8 FILL39;
__u8 OTG_FSIZE3;
/* Control Status register for Endpoint 4 */
__u16 OTG_TX4MAXP;
__u16 OTG_TX4CSR;
__u16 OTG_RX4MAXP;
__u16 OTG_RX4CSR;
__u16 OTG_RX4CNT;
__u8 OTG_TX4TYPE;
__u8 OTG_TX4INTV;
__u8 OTG_RX4TYPE;
__u8 OTG_RX4INTV;
__u8 FILL40;
__u8 OTG_FSIZE4;
/* Control Status register for Endpoint 5 */
__u16 OTG_TX5MAXP;
__u16 OTG_TX5CSR;
__u16 OTG_RX5MAXP;
__u16 OTG_RX5CSR;
__u16 OTG_RX5CNT;
__u8 OTG_TX5TYPE;
__u8 OTG_TX5INTV;
__u8 OTG_RX5TYPE;
__u8 OTG_RX5INTV;
__u8 FILL41;
__u8 OTG_FSIZE5;
/* Control Status register for Endpoint 6 */
__u16 OTG_TX6MAXP;
__u16 OTG_TX6CSR;
__u16 OTG_RX6MAXP;
__u16 OTG_RX6CSR;
__u16 OTG_RX6CNT;
__u8 OTG_TX6TYPE;
__u8 OTG_TX6INTV;
__u8 OTG_RX6TYPE;
__u8 OTG_RX6INTV;
__u8 FILL42;
__u8 OTG_FSIZE6;
/* Control Status register for Endpoint 7 */
__u16 OTG_TX7MAXP;
__u16 OTG_TX7CSR;
__u16 OTG_RX7MAXP;
__u16 OTG_RX7CSR;
__u16 OTG_RX7CNT;
__u8 OTG_TX7TYPE;
__u8 OTG_TX7INTV;
__u8 OTG_RX7TYPE;
__u8 OTG_RX7INTV;
__u8 FILL43;
__u8 OTG_FSIZE7;
/* Control Status register for Endpoint 8 */
__u16 OTG_TX8MAXP;
__u16 OTG_TX8CSR;
__u16 OTG_RX8MAXP;
__u16 OTG_RX8CSR;
__u16 OTG_RX8CNT;
__u8 OTG_TX8TYPE;
__u8 OTG_TX8INTV;
__u8 OTG_RX8TYPE;
__u8 OTG_RX8INTV;
__u8 FILL44;
__u8 OTG_FSIZE8;
/* Control Status register for Endpoint 9 */
__u16 OTG_TX9MAXP;
__u16 OTG_TX9CSR;
__u16 OTG_RX9MAXP;
__u16 OTG_RX9CSR;
__u16 OTG_RX9CNT;
__u8 OTG_TX9TYPE;
__u8 OTG_TX9INTV;
__u8 OTG_RX9TYPE;
__u8 OTG_RX9INTV;
__u8 FILL45;
__u8 OTG_FSIZE9;
/* Control Status register for Endpoint 10 */
__u16 OTG_TX10MAXP;
__u16 OTG_TX10CSR;
__u16 OTG_RX10MAXP;
__u16 OTG_RX10CSR;
__u16 OTG_RX10CNT;
__u8 OTG_TX10TYPE;
__u8 OTG_TX10INTV;
__u8 OTG_RX10TYPE;
__u8 OTG_RX10INTV;
__u8 FILL46;
__u8 OTG_FSIZE10;
/* Control Status register for Endpoint 11 */
__u16 OTG_TX11MAXP;
__u16 OTG_TX11CSR;
__u16 OTG_RX11MAXP;
__u16 OTG_RX11CSR;
__u16 OTG_RX11CNT;
__u8 OTG_TX11TYPE;
__u8 OTG_TX11INTV;
__u8 OTG_RX11TYPE;
__u8 OTG_RX11INTV;
__u8 FILL47;
__u8 OTG_FSIZE11;
/* Control Status register for Endpoint 12 */
__u16 OTG_TX12MAXP;
__u16 OTG_TX12CSR;
__u16 OTG_RX12MAXP;
__u16 OTG_RX12CSR;
__u16 OTG_RX12CNT;
__u8 OTG_TX12TYPE;
__u8 OTG_TX12INTV;
__u8 OTG_RX12TYPE;
__u8 OTG_RX12INTV;
__u8 FILL48;
__u8 OTG_FSIZE12;
/* Control Status register for Endpoint 13 */
__u16 OTG_TX13MAXP;
__u16 OTG_TX13CSR;
__u16 OTG_RX13MAXP;
__u16 OTG_RX13CSR;
__u16 OTG_RX13CNT;
__u8 OTG_TX13TYPE;
__u8 OTG_TX13INTV;
__u8 OTG_RX13TYPE;
__u8 OTG_RX13INTV;
__u8 FILL49;
__u8 OTG_FSIZE13;
/* Control Status register for Endpoint 14 */
__u16 OTG_TX14MAXP;
__u16 OTG_TX14CSR;
__u16 OTG_RX14MAXP;
__u16 OTG_RX14CSR;
__u16 OTG_RX14CNT;
__u8 OTG_TX14TYPE;
__u8 OTG_TX14INTV;
__u8 OTG_RX14TYPE;
__u8 OTG_RX14INTV;
__u8 FILL50;
__u8 OTG_FSIZE14;
/* Control Status register for Endpoint 15 */
__u16 OTG_TX15MAXP;
__u16 OTG_TX15CSR;
__u16 OTG_RX15MAXP;
__u16 OTG_RX15CSR;
__u16 OTG_RX15CNT;
__u8 OTG_TX15TYPE;
__u8 OTG_TX15INTV;
__u8 OTG_RX15TYPE;
__u8 OTG_RX15INTV;
__u8 FILL51;
__u8 OTG_FSIZE15;
__u32 OTG_DMASEL;
__u8 OTG_TOPCTRL;
};
struct udc_end0_buffer {
u8 data[EP0_MAX_PACKET_SIZE];
u16 count;
};
/* Higher level functions for abstracting away from specific device */
int udc_init (void);
void udc_enable(struct usb_device_instance *device);
void udc_disable(void);
void udc_connect(void);
void udc_disconnect(void);
void udc_startup_events(struct usb_device_instance *device);
void udc_setup_ep(struct usb_device_instance *device, unsigned int ep, struct usb_endpoint_instance *endpoint);
void udc_irq (void);
/* Flow control */
void udc_set_nak(int epid);
void udc_unset_nak (int epid);
int udc_endpoint_write(struct usb_endpoint_instance *endpoint);
#endif //__MUSB_UDC_H__
|