summaryrefslogtreecommitdiff
path: root/drivers/usb/gadget/u8500_udc.h
blob: 0bafeb015850c369cc34f16ad40db1cde942fd4e (plain)
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__