forked from triffid/LPC17xx-DFU-Bootloader
-
Notifications
You must be signed in to change notification settings - Fork 6
/
lpc17xx_usb.h
236 lines (204 loc) · 7.36 KB
/
lpc17xx_usb.h
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
#ifndef _LPC17XX_USB_H
#define _LPC17XX_USB_H
#ifdef __cplusplus
extern "C"
{
#endif
#include <stdint.h>
#define EP2IDX(bEP) ((((bEP)&0xF)<<1)|(((bEP)&0x80)>>7))
#define IDX2EP(idx) ((((idx)<<7)&0x80)|(((idx)>>1)&0xF))
#define EP(x) (1UL<<EP2IDX(x))
// USBClkCtrl
#define DEV_CLK_EN (1UL<<1)
#define AHB_CLK_EN (1UL<<4)
// USBClkSt
#define DEV_CLK_ON (1UL<<1)
#define AHB_CLK_ON (1UL<<4)
// USBIntSt
#define USB_INT_REQ_LP (1UL<<0)
#define USB_INT_REQ_HP (1UL<<1)
#define USB_INT_REQ_DMA (1UL<<2)
#define USB_NEED_CLK (1UL<<8)
#define EN_USB_INTS (1UL<<31)
// USBDevIntSt / USBDevIntClr / USBDevIntSet / USBDevIntPri
#define FRAME (1UL<<0)
#define EP_FAST (1UL<<1)
#define EP_SLOW (1UL<<2)
#define DEV_STAT (1UL<<3)
#define CCEMPTY (1UL<<4)
#define CDFULL (1UL<<5)
#define RxENDPKT (1UL<<6)
#define TxENDPKT (1UL<<7)
#define EP_RLZD (1UL<<8)
#define ERR_INT (1UL<<9)
// USBRxPlen / USBTxPlen
#define PKT_LNGTH_MASK (511UL<<0)
#define DV (1UL<<10)
#define PKT_RDY (1UL<<11)
// USBCtrl
#define RD_EN (1UL<<0)
#define WR_EN (1UL<<1)
#define LOG_ENDPOINT_MASK (15UL<<2)
// USBDMAIntSt / USBDMAIntEn
#define EOT (1UL<<0)
#define NDDR (1UL<<1)
#define ERR (1UL<<2)
// USBCmdCode
#define CMD_PHASE_WRITE (1UL<<8)
#define CMD_PHASE_READ (2UL<<8)
#define CMD_PHASE_COMMAND (5UL<<8)
#define CMD_CODE(a) (((a) & 255UL)<<16)
#define CMD_WDATA(a) (((a) & 255UL)<<16)
// SIE commands
// device commands
#define SIE_DEV_CMD_SetAddress 0xD0
#define SIE_DEV_CMD_Configure 0xD8
#define SIE_DEV_CMD_SetMode 0xF3
#define SIE_DEV_CMD_ReadFrameNo 0xF5
#define SIE_DEV_CMD_ReadTestReg 0xFD
#define SIE_DEV_CMD_SetDevStatus 0xFE
#define SIE_DEV_CMD_GetDevStatus 0xFE
#define SIE_DEV_CMD_GetErrorCode 0xFF
#define SIE_DEV_CMD_ReadErrorSt 0xFB
// endpoint commands
#define SIE_EP_CMD_Select 0x0
#define SIE_EP_CMD_SelectClearInt 0x40
#define SIE_EP_CMD_SetEpStatus 0x40
#define SIE_EP_CMD_ClearBuffer 0xF2
#define SIE_EP_CMD_ValidateBuffer 0xFA
// SIE Set Address Bits
/// DEV_ADDR - The device address
#define SIE_SETADDR_DEV_ADDR_MASK (0x7F)
/// DEV_EN - Device will respond to requests destined for DEV_ADDR
#define SIE_SETADDR_DEV_EN (1UL<<7)
// SIE Modes (use with SIE_SetMode)
/// Always Clock: When asserted, the USB clock is kept running if the core enters suspend powerdown
#define SIE_MODE_AP_CLK (1UL<<0)
/// INAK_CI - Interrupt on NAK for Control In
#define SIE_MODE_INAK_CI (1UL<<1)
/// INAK_CO - Interrupt on NAK for Control Out
#define SIE_MODE_INAK_CO (1UL<<2)
/// INAK_II - Interrupt on NAK for Isochronous In
#define SIE_MODE_INAK_II (1UL<<3)
/// INAK_IO - Interrupt on NAK for Isochronous Out
#define SIE_MODE_INAK_IO (1UL<<4)
/// INAK_BI - Interrupt on NAK for Bulk In
#define SIE_MODE_INAK_BI (1UL<<5)
/// INAK_BO - Interrupt on NAK for Bulk Out
#define SIE_MODE_INAK_BO (1UL<<6)
// SIE Device Statuses
/// CON: set this bit to enable the pull-up that indicates to the host that a USB Full Speed device is present. Cleared by hardware if VBus dips for 3ms and we're monitoring VBus
#define SIE_DEVSTAT_CON (1UL<<0)
/// CON_CH: Connection state changed, triggers DEV_STAT interrupt
#define SIE_DEVSTAT_CON_CH (1UL<<1)
/// SUS: Suspended. Write 0 to issue a remote wakeup IF we're connected AND suspended. Writing otherwise has no effect.
#define SIE_DEVSTAT_SUS (1UL<<2)
/// SUS_CH: Suspend state changed. Triggers DEV_STAT interrupt
#define SIE_DEVSTAT_SUS_CH (1UL<<3)
/// RST: received a Bus Reset. Triggers DEV_STAT interrupt.
#define SIE_DEVSTAT_RST (1UL<<4)
// SIE Error Codes - returned from SIE_GetErrorCode
/// No Error
#define SIE_ERRCODE_NOERROR 0x0
/// PID Encoding Error
#define SIE_ERRCODE_PIDENCODE 0x1
/// Unknown PID
#define SIE_ERRCODE_UNKNOWNPID 0x2
/// Unexpected Packet - any packet sequence violation from the specification
#define SIE_ERRCODE_UNEXPECTED 0x3
/// Error in Token CRC
#define SIE_ERRCODE_TOKENCRC 0x4
/// Error in Data CRC
#define SIE_ERRCODE_DATACRC 0x5
/// Timeout Error
#define SIE_ERRCODE_TIMEOUT 0x6
/// Babble
#define SIE_ERRCODE_BABBLE 0x7
/// Error in End of Packet
#define SIE_ERRCODE_EOP 0x8
/// Sent/Received NAK
#define SIE_ERRCODE_NAK 0x9
/// Sent Stall
#define SIE_ERRCODE_STALL 0xA
/// Buffer Overrun Error
#define SIE_ERRCODE_OVERRUN 0xB
/// Sent Empty Packet (Isochronous Endpoints only)
#define SIE_ERRCODE_ISO_EMPTYPACKET 0xC
/// Bitstuff Error
#define SIE_ERRCODE_BITSTUFF 0xD
/// Error in Sync
#define SIE_ERRCODE_SYNC 0xE
/// Wrong toggle bit in Data PID, packet ignored
#define SIE_ERRCODE_TOGGLEBIT 0xF
/// The Error Active bit will be reset when this register is read
#define SIE_EA (1UL<<4)
// SIE Error Statuses - returned from SIE_ReadErrorStatus
/// PID Encoding Error or Unknown PID or Token CRC
#define SIE_ERRST_PID_ERR (1UL<<0)
/// Unexpected Packet Error
#define SIE_ERRST_UEPKT (1UL<<1)
/// Data CRC Error
#define SIE_ERRST_DCRC (1UL<<2)
/// Timeout Error
#define SIE_ERRST_TIMEOUT (1UL<<3)
/// End of Packet Error
#define SIE_ERRST_EOP (1UL<<4)
/// Buffer Overrun Error
#define SIE_ERRST_B_OVRN (1UL<<5)
/// Bitstuff Error
#define SIE_ERRST_BTSTF (1UL<<6)
/// Wrong toggle bit in data PID, packet ignored
#define SIE_ERRST_TGL_ERR (1UL<<7)
// SIE Configure Device
/// CONF_DEVICE: device is configured
#define SIE_CONF_DEVICE (1UL<<0)
// SIE Endpoint Statuses - returned from SIE_SelectEndpoint and SIE_SelectEndpointClearInterrupt
/// Full/Empty bit. For IN endpoints, equal to B_1_FULL & B_2_FULL. For OUT endpoints, equal to B_1_FULL | B_2_FULL. For single buffered endpoints, same as B_1_FULL
#define SIE_EP_FE (1UL<<0)
/// Stalled Indicator. 0 = not stalled, 1 = stalled
#define SIE_EP_ST (1UL<<1)
/// SETUP bit: the last received packet was a SETUP packet
#define SIE_EP_STP (1UL<<2)
/// Packet over-written bit: A regular packet was overwritten by a SETUP packet
#define SIE_EP_PO (1UL<<3)
/// EP Nacked Bit: Asserted when a NAK was sent and interrupt on NAK mode is enabled
#define SIE_EP_EPN (1UL<<4)
/// Buffer 1 status: 0 = empty, 1 = full
#define SIE_EP_B_1_FULL (1UL<<5)
/// Buffer 2 status: 0 = empty, 1 = full
#define SIE_EP_B_2_FULL (1UL<<6)
// SIE Endpoint Statuses - set with SIE_SetEndpointStatus
/// Stall endpoint
#define SIE_EPST_ST (1UL<<0)
/// Disable endpoint
#define SIE_EPST_DA (1UL<<5)
/// Rate Feedback mode
#define SIE_EPST_RF_MO (1UL<<6)
/// Conditional Stall - Stall both control endpoints unless STP is asserted in SIE_SelectEndpoint register. Only for OUT endpoints
#define SIE_EPST_CND_ST (1UL<<7)
// SIE Clear Buffer result
/// Packet Overwritten bit: Asserted when a SETUP packet overwrites a received packet
#define SIE_CLRBUF_PO (1UL<<0)
// device commands
void SIE_SetAddress(uint8_t);
void SIE_ConfigureDevice(uint8_t);
void SIE_SetMode(uint8_t);
uint16_t SIE_ReadCurrentFrameNumber(void);
uint16_t SIE_ReadTestRegister(void);
void SIE_SetDeviceStatus(uint8_t);
uint8_t SIE_GetDeviceStatus(void);
uint8_t SIE_GetErrorCode(void);
uint8_t SIE_ReadErrorStatus(void);
// endpoint commands
uint8_t SIE_SelectEndpoint(uint8_t bEP);
uint8_t SIE_SelectEndpointClearInterrupt(uint8_t bEP);
void SIE_SetEndpointStatus(uint8_t bEP, uint8_t status);
uint8_t SIE_ClearBuffer(void);
void SIE_ValidateBuffer(void);
// utility commands - derived from the above
void SIE_Connect(void);
void SIE_Disconnect(void);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* _LPC17XX_USB_H */