summaryrefslogtreecommitdiff
path: root/nuttx/arch/arm/src/sam34/chip/sam_udp.h
blob: 267bcc43ae8fcff692f94c235d4013e0482d27c4 (plain) (blame)
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
/****************************************************************************************
 * arch/arm/src/sam34/chip/sam_udp.h
 * USB Device Port (UDP) definitions for the SAM4E
 *
 *   Copyright (C) 2014 Gregory Nutt. All rights reserved.
 *   Author: Gregory Nutt <gnutt@nuttx.org>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 * 3. Neither the name NuttX nor the names of its contributors may be
 *    used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 ****************************************************************************************/

#ifndef __ARCH_ARM_SRC_SAM34_CHIP_SAM_UDP_H
#define __ARCH_ARM_SRC_SAM34_CHIP_SAM_UDP_H

/****************************************************************************************
 * Included Files
 ****************************************************************************************/

#include <nuttx/config.h>

#include "chip.h"
#include "chip/sam_memorymap.h"

/****************************************************************************************
 * Pre-processor Definitions
 ****************************************************************************************/
/* General Definitions ******************************************************************/
/* Capabilities and characteristics of endpoints
 *
 *   EP  EP BANKS  EP SIZE   EP TYPE
 *   --- --------- --------- ---------
 *    0      1        64     Control/Bulk/Interrupt
 *    1      2        64     Bulk/Iso/Interrupt
 *    2      2        64     Bulk/Iso/Interrupt
 *    3      1        64     Control/Bulk/Interrupt
 *    4      2       512     Bulk/Iso/Interrupt
 *    5      2       512     Bulk/Iso/Interrupt
 *    6      2        64     Bulk/Iso/Interrupt
 *    7      2        64     Bulk/Iso/Interrupt
 */

#define SAM_UDP_NENDPOINTS                  8     /* EP0-7 */
#define SAM_UDP_MAXPACKETSIZE(ep)           ((((unsigned)(ep) & 6) == 4) ? 512 : 64)
#define SAM_UDP_NBANKS(ep)                  (((unsigned)(ep) == 0 || (unsigned)(ep) == 3) ? 1 : 2)
#define SAM_UDP_CONTROL(ep)                 (((unsigned)(ep) == 0 || (unsigned)(ep) == 3))
#define SAM_UDP_BULK(ep)                    (true)
#define SAM_UDP_ISOCHRONOUS(ep)             (((unsigned)(ep) != 0 && (unsigned)(ep) != 3))
#define SAM_UDP_INTERRUPT(ep)               (true)

/* UDP register offsets *****************************************************************/

/* Global Registers */

#define SAM_UDP_FRMNUM_OFFSET               0x0000 /* UDP Frame Number Register */
#define SAM_UDP_GLBSTAT_OFFSET              0x0004 /* UDP Global State Register */
#define SAM_UDP_FADDR_OFFSET                0x0008 /* UDP Function Address Register */
                                                   /* 0x000c: Reserved */
#define SAM_UDP_IER_OFFSET                  0x0010 /* UDP Interrupt Enable Register */
#define SAM_UDP_IDR_OFFSET                  0x0014 /* UDP Interrupt Disable Register */
#define SAM_UDP_IMR_OFFSET                  0x0018 /* UDP Interrupt Mask Register */
#define SAM_UDP_ISR_OFFSET                  0x001c /* UDP Interrupt Status Register */
#define SAM_UDP_ICR_OFFSET                  0x0020 /* UDP Interrupt Clear Register */
                                                   /* 0x0024: Reserved */
#define SAM_UDP_RSTEP_OFFSET                0x0028 /* UDP Reset Endpoint Register */
                                                   /* 0x002c: Reserved */
/* Endpoint registers */

#define SAM_UDPEP_CSR_OFFSET(n)             (0x0030+((n)<<2))
#  define SAM_UDPEP_CSR0_OFFSET             0x0030 /* Endpoint Control and Status Register 0 */
#  define SAM_UDPEP_CSR1_OFFSET             0x0034 /* Endpoint Control and Status Register 1 */
#  define SAM_UDPEP_CSR2_OFFSET             0x0038 /* Endpoint Control and Status Register 2 */
#  define SAM_UDPEP_CSR3_OFFSET             0x003c /* Endpoint Control and Status Register 3 */
#  define SAM_UDPEP_CSR4_OFFSET             0x0040 /* Endpoint Control and Status Register 4 */
#  define SAM_UDPEP_CSR5_OFFSET             0x0044 /* Endpoint Control and Status Register 5 */
#  define SAM_UDPEP_CSR6_OFFSET             0x0048 /* Endpoint Control and Status Register 6 */
#  define SAM_UDPEP_CSR7_OFFSET             0x004c /* Endpoint Control and Status Register 7 */
#define SAM_UDPEP_FDR_OFFSET(n)             (0x0050+((n)<<2))
#  define SAM_UDPEP_FDR0_OFFSET             0x0050 /* Endpoint FIFO Data Register 0 */
#  define SAM_UDPEP_FDR1_OFFSET             0x0054 /* Endpoint FIFO Data Register 1 */
#  define SAM_UDPEP_FDR2_OFFSET             0x0058 /* Endpoint FIFO Data Register 2 */
#  define SAM_UDPEP_FDR3_OFFSET             0x005c /* Endpoint FIFO Data Register 3 */
#  define SAM_UDPEP_FDR4_OFFSET             0x0060 /* Endpoint FIFO Data Register 4 */
#  define SAM_UDPEP_FDR5_OFFSET             0x0064 /* Endpoint FIFO Data Register 5 */
#  define SAM_UDPEP_FDR6_OFFSET             0x0068 /* Endpoint FIFO Data Register 6 */
#  define SAM_UDPEP_FDR7_OFFSET             0x006c /* Endpoint FIFO Data Register 7 */
                                                   /* 0x0070: Reserved */
#define SAM_UDP_TXVC_OFFSET                 0x0074 /* Transceiver Control Register */
                                                   /* 0x0078-0x00fc: Reserved */

/* UDP register addresses ***************************************************************/

/* Global Registers */

#define SAM_UDP_FRMNUM                      (SAM_UDP_BASE+SAM_UDP_FRMNUM_OFFSET)
#define SAM_UDP_GLBSTAT                     (SAM_UDP_BASE+SAM_UDP_GLBSTAT_OFFSET)
#define SAM_UDP_FADDR                       (SAM_UDP_BASE+SAM_UDP_FADDR_OFFSET)
#define SAM_UDP_IER                         (SAM_UDP_BASE+SAM_UDP_IER_OFFSET)
#define SAM_UDP_IDR                         (SAM_UDP_BASE+SAM_UDP_IDR_OFFSET)
#define SAM_UDP_IMR                         (SAM_UDP_BASE+SAM_UDP_IMR_OFFSET)
#define SAM_UDP_ISR                         (SAM_UDP_BASE+SAM_UDP_ISR_OFFSET)
#define SAM_UDP_ICR                         (SAM_UDP_BASE+SAM_UDP_ICR_OFFSET)
#define SAM_UDP_RSTEP                       (SAM_UDP_BASE+SAM_UDP_RSTEP_OFFSET)

/* Endpoint registers */

#define SAM_UDPEP_CSR(n)                    (SAM_UDP_BASE+SAM_UDPEP_CSR_OFFSET(n))
#  define SAM_UDPEP_CSR0                    (SAM_UDP_BASE+SAM_UDPEP_CSR0_OFFSET)
#  define SAM_UDPEP_CSR1                    (SAM_UDP_BASE+SAM_UDPEP_CSR1_OFFSET)
#  define SAM_UDPEP_CSR2                    (SAM_UDP_BASE+SAM_UDPEP_CSR2_OFFSET)
#  define SAM_UDPEP_CSR3                    (SAM_UDP_BASE+SAM_UDPEP_CSR3_OFFSET)
#  define SAM_UDPEP_CSR4                    (SAM_UDP_BASE+SAM_UDPEP_CSR4_OFFSET)
#  define SAM_UDPEP_CSR5                    (SAM_UDP_BASE+SAM_UDPEP_CSR5_OFFSET)
#  define SAM_UDPEP_CSR6                    (SAM_UDP_BASE+SAM_UDPEP_CSR6_OFFSET)
#  define SAM_UDPEP_CSR7                    (SAM_UDP_BASE+SAM_UDPEP_CSR7_OFFSET)
#define SAM_UDPEP_FDR(n)                    (SAM_UDP_BASE+SAM_UDPEP_FDR_OFFSET(n))
#  define SAM_UDPEP_FDR0                    (SAM_UDP_BASE+SAM_UDPEP_FDR0_OFFSET)
#  define SAM_UDPEP_FDR1                    (SAM_UDP_BASE+SAM_UDPEP_FDR1_OFFSET)
#  define SAM_UDPEP_FDR2                    (SAM_UDP_BASE+SAM_UDPEP_FDR2_OFFSET)
#  define SAM_UDPEP_FDR3                    (SAM_UDP_BASE+SAM_UDPEP_FDR3_OFFSET)
#  define SAM_UDPEP_FDR4                    (SAM_UDP_BASE+SAM_UDPEP_FDR4_OFFSET)
#  define SAM_UDPEP_FDR5                    (SAM_UDP_BASE+SAM_UDPEP_FDR5_OFFSET)
#  define SAM_UDPEP_FDR6                    (SAM_UDP_BASE+SAM_UDPEP_FDR6_OFFSET)
#  define SAM_UDPEP_FDR7                    (SAM_UDP_BASE+SAM_UDPEP_FDR7_OFFSET)

#define SAM_UDP_TXVC                        (SAM_UDP_BASE+SAM_UDP_TXVC_OFFSET)

/* UDP register bit definitions *********************************************************/

/* Global Registers */

/* UDP Frame Number Register */

#define UDP_FRMNUM_SHIFT                    (0)       /* Bits 0-10: Frame Number in Packet Field Formats */
#define UDP_FRMNUM_MASK                     (0x000007ff)
#define UDP_FRMNUM_FRMERR                   (1 << 16) /* Bit 16: Frame Error */
#define UDP_FRMNUM_FRMOK                    (1 << 17) /* Bit 17: Frame OK */

/* UDP Global State Register */

#define UDP_GLBSTAT_FADDEN                  (1 << 0)  /* Bit 0:  Function Address Enable */
#define UDP_GLBSTAT_CONFG                   (1 << 1)  /* Bit 1:  Configured */
#define UDP_GLBSTAT_ESR                     (1 << 2)  /* Bit 2:  Enable Send Resume */
#define UDP_GLBSTAT_RSMINPR                 (1 << 3)  /* Bit 3:  */
#define UDP_GLBSTAT_RMWUPE                  (1 << 4)  /* Bit 4:  Remote Wake-up Enable */

/* UDP Function Address Register */

#define UDP_FADDR_SHIFT                     (0)       /* Bits 0-6:  Function Address Value */
#define UDP_FADDR_MASK                      (0x0000007f)
#  define UDP_FADDR(n)                      ((uint32_t)(n))
#define UDP_FADDR_FEN                       (1 << 8)  /* Bit 8:  Function Enable */

/* UDP Interrupt Enable, UDP Interrupt Disable, UDP Interrupt Mask, UDP Interrupt
 * Status, and UDP Interrupt Clear Registers.
 */

#define UDP_INT_EP_MASK                     (0x000000ff)
#define UDP_INT_EP(n)                       (1 << (n))
#  define UDP_INT_EP0                       (1 << 0)  /* Bit 0:  Endpoint 0 Interrupt (Not ICR) */
#  define UDP_INT_EP1                       (1 << 1)  /* Bit 1:  Endpoint 1 Interrupt (Not ICR) */
#  define UDP_INT_EP2                       (1 << 2)  /* Bit 2:  Endpoint 2 Interrupt (Not ICR) */
#  define UDP_INT_EP3                       (1 << 3)  /* Bit 3:  Endpoint 3 Interrupt (Not ICR) */
#  define UDP_INT_EP4                       (1 << 4)  /* Bit 4:  Endpoint 4 Interrupt (Not ICR) */
#  define UDP_INT_EP5                       (1 << 5)  /* Bit 5:  Endpoint 5 Interrupt (Not ICR) */
#  define UDP_INT_EP6                       (1 << 6)  /* Bit 6:  Endpoint 6 Interrupt (Not ICR) */
#  define UDP_INT_EP7                       (1 << 7)  /* Bit 7:  Endpoint 7 Interrupt (Not ICR) */
#define UDP_INT_RXSUSP                      (1 << 8)  /* Bit 8:  UDP Suspend Interrupt */
#define UDP_INT_RXRSM                       (1 << 9)  /* Bit 9:  UDP Resume Interrupt */
#define UDP_INT_EXTRSM                      (1 << 10) /* Bit 10: */
#define UDP_INT_SOF                         (1 << 11) /* Bit 11: Start Of Frame Interrupt */
#define UDP_ISR_ENDBUSRES                   (1 << 12) /* Bit 12: End of BUS Reset Interrupt Status (ISR and ICR only) */
#define UDP_INT_WAKEUP                      (1 << 13) /* Bit 13: UDP bus Wake-up Interrupt */

#define UDP_INT_ALL                         (0x00003fff)

/* UDP Reset Endpoint Register */

#define UDP_RSTEP(n)                        (1 << (n))
#  define UDP_RSTEP0                        (1 << 0)  /* Bit 0:  Reset Endpoint 0 */
#  define UDP_RSTEP1                        (1 << 1)  /* Bit 1:  Reset Endpoint 1 */
#  define UDP_RSTEP2                        (1 << 2)  /* Bit 2:  Reset Endpoint 2 */
#  define UDP_RSTEP3                        (1 << 3)  /* Bit 3:  Reset Endpoint 3 */
#  define UDP_RSTEP4                        (1 << 4)  /* Bit 4:  Reset Endpoint 4 */
#  define UDP_RSTEP5                        (1 << 5)  /* Bit 5:  Reset Endpoint 5 */
#  define UDP_RSTEP6                        (1 << 6)  /* Bit 6:  Reset Endpoint 6 */
#  define UDP_RSTEP7                        (1 << 7)  /* Bit 7:  Reset Endpoint 7 */

/* Endpoint registers */
/* Endpoint Control and Status Registers */

#define UDPEP_CSR_TXCOMP                    (1 << 0)  /* Bit 0:  Generates an IN packet with data */
#define UDPEP_CSR_RXDATABK0                 (1 << 1)  /* Bit 1:  Receive Data Bank 0 */
#define UDPEP_CSR_RXSETUP                   (1 << 2)  /* Bit 2:  Received Setup */
#define UDPEP_CSR_STALLSENT                 (1 << 3)  /* Bit 3:  Stall Sent */
#define UDPEP_CSR_ISOERROR                  (1 << 3)  /* Bit 3:  CRC error in isochronous transfer */
#define UDPEP_CSR_TXPKTRDY                  (1 << 4)  /* Bit 4:  Transmit Packet Ready */
#define UDPEP_CSR_FORCESTALL                (1 << 5)  /* Bit 5:  Force Stall */
#define UDPEP_CSR_RXDATABK1                 (1 << 6)  /* Bit 6:  Receive Data Bank 1 */
#define UDPEP_CSR_DIR_SHIFT                 (7)       /* Bit 7:  Transfer Direction */
#define UDPEP_CSR_DIR                       (1 << 7)  /* Bit 7:  Transfer Direction */
#define UDPEP_CSR_EPTYPE_SHIFT              (8)       /* Bit 8-10: Endpoint type */
#define UDPEP_CSR_EPTYPE_MASK               (7 << UDPEP_CSR_EPTYPE_SHIFT)
#  define UDPEP_CSR_EPTYPE_CTRL             (0 << UDPEP_CSR_EPTYPE_SHIFT) /* Control */
#  define UDPEP_CSR_EPTYPE_ISOOUT           (1 << UDPEP_CSR_EPTYPE_SHIFT) /* Isochronous OUT */
#  define UDPEP_CSR_EPTYPE_ISOIN            (5 << UDPEP_CSR_EPTYPE_SHIFT) /* Isochronous IN */
#  define UDPEP_CSR_EPTYPE_BULKOUT          (2 << UDPEP_CSR_EPTYPE_SHIFT) /* Bulk OUT */
#  define UDPEP_CSR_EPTYPE_BULKIN           (6 << UDPEP_CSR_EPTYPE_SHIFT) /* Bulk IN */
#  define UDPEP_CSR_EPTYPE_INTOUT           (3 << UDPEP_CSR_EPTYPE_SHIFT) /* Interrupt OUT */
#  define UDPEP_CSR_EPTYPE_INTIN            (7 << UDPEP_CSR_EPTYPE_SHIFT) /* Interrupt IN */
#define UDPEP_CSR_DTGLE                     (1 << 11) /* Bit 11:  Data Toggle */
#define UDPEP_CSR_EPEDS                     (1 << 15) /* Bit 15:  Endpoint Enable Disable */
#define UDPEP_CSR_RXBYTECNT_SHIFT           (16)      /* Bits 16-26: Number of Bytes Available in the FIFO */
#define UDPEP_CSR_RXBYTECNT_MASK            (0x7ff << UDPEP_CSR_RXBYTECNT_SHIFT)

/* Endpoint FIFO Data Registers */

#define UDPEP_FDR_MASK                      (0xff)    /* Bits 0-7: FIFO data value */

/* Transceiver Control Register */

#define UDP_TXVC_TXVDIS                     (1 << 8)  /* Bit 8:  Transceiver Disable */
#define UDP_TXVC_PUON                       (1 << 9)  /* Bit 9:  Pull-up On */

/****************************************************************************************
 * Public Types
 ****************************************************************************************/

/****************************************************************************************
 * Public Data
 ****************************************************************************************/

/****************************************************************************************
 * Public Functions
 ****************************************************************************************/

#endif /* __ARCH_ARM_SRC_SAM34_CHIP_SAM_UDP_H */