📄 usbhw.lst
字号:
ARM COMPILER V2.53, usbhw 09/06/07 15:42:23 PAGE 1
ARM COMPILER V2.53, COMPILATION OF MODULE usbhw
OBJECT MODULE PLACED IN .\Obj\usbhw.obj
COMPILER INVOKED BY: C:\Keil\ARM\BIN\CA.exe usbhw.c THUMB BROWSE DEFINE(MCB2140) DEBUG PRINT(.\LST\USBHW.LST) TABS(4) OB
-JECT(.\Obj\usbhw.obj)
stmt level source
1 /*----------------------------------------------------------------------------
2 * U S B - K e r n e l
3 *----------------------------------------------------------------------------
4 * Name: usbhw.c
5 * Purpose: USB Hardware layer module file for Philips LPC214x Family
6 * Microprocessors
7 * Version: V1.04
8 *----------------------------------------------------------------------------
9 * This software is supplied "AS IS" without any warranties, express,
10 * implied or statutory, including but not limited to the implied
11 * warranties of fitness for purpose, satisfactory quality and
12 * noninfringement. Keil extends you a royalty-free right to reproduce and
13 * distribute executable files created using this software for use on
14 * Philips LPC2xxx microcontroller devices only. Nothing else gives you the
15 * right to use this software.
16 *
17 * Copyright (c) 2005 Keil Software.
18 * Modified by Philips Semiconductor
19 *---------------------------------------------------------------------------*/
20 #include <LPC214x.h> /* LPC214x definitions */
21
22 #include "type.h"
23 #include "usb.h"
24 #include "usbcfg.h"
25 #include "usbreg.h"
26 #include "usbhw.h"
27 #include "usbcore.h"
28 #include "vcomuser.h"
29
30 /*
31 * Get Endpoint Address
32 * Parameters: EPNum: Endpoint Number
33 * EPNum.0..3: Address
34 * EPNum.7: Dir
35 * Return Value: Endpoint Physical Address
36 */
37
38 DWORD EPAdr (DWORD EPNum) {
39 1 DWORD val;
40 1
41 1 val = (EPNum & 0x0F) << 1;
42 1 if (EPNum & 0x80) {
43 2 val += 1;
44 2 }
45 1 return (val);
46 1 }
47
48
49 /*
50 * Write Command
51 * Parameters: cmd: Command
52 * Return Value: None
53 */
54
55 void WrCmd (DWORD cmd) {
56 1
57 1 CMD_CODE = cmd;
58 1 while ((DEV_INT_STAT & CCEMTY_INT) == 0);
ARM COMPILER V2.53, usbhw 09/06/07 15:42:23 PAGE 2
59 1 DEV_INT_CLR = CCEMTY_INT;
60 1 }
61
62
63 /*
64 * Write Command Data
65 * Parameters: cmd: Command
66 * val: Data
67 * Return Value: None
68 */
69
70 void WrCmdDat (DWORD cmd, DWORD val) {
71 1
72 1 CMD_CODE = cmd;
73 1 while ((DEV_INT_STAT & CCEMTY_INT) == 0);
74 1 DEV_INT_CLR = CCEMTY_INT;
75 1 CMD_CODE = val;
76 1 while ((DEV_INT_STAT & CCEMTY_INT) == 0);
77 1 DEV_INT_CLR = CCEMTY_INT;
78 1 }
79
80
81 /*
82 * Read Command Data
83 * Parameters: cmd: Command
84 * Return Value: Data Value
85 */
86
87 DWORD RdCmdDat (DWORD cmd) {
88 1 DWORD val;
89 1
90 1 DEV_INT_CLR = CDFULL_INT;
91 1 CMD_CODE = cmd;
92 1 while ((DEV_INT_STAT & CCEMTY_INT) == 0);
93 1 DEV_INT_CLR = CCEMTY_INT;
94 1 while ((DEV_INT_STAT & CDFULL_INT) == 0);
95 1 val = CMD_DATA;
96 1 DEV_INT_CLR = CDFULL_INT;
97 1 return (val);
98 1 }
99
100
101 /*
102 * USB Initialize Function
103 * Return Value: None
104 */
105
106 void USB_Init (void) {
107 1
108 1 PCONP |= 0x80000000; /* Turn On USB PCLK */
109 1
110 1 // Configure 48MHz USB Clock; FOsc = 12MHz, M = 4, P = 2
111 1 PLL48CFG = 0x23; /* M = 4, P = 2 */
112 1 PLL48CON = PLLCON_PLLE; /* PLL Enable */
113 1 PLL48FEED = 0xAA; /* Feed Sequence 1 */
114 1 PLL48FEED = 0x55; /* Feed Sequence 2 */
115 1
116 1 while ((PLL48STAT & PLLSTAT_PLOCK) == 0); /* Wait for PLL Lock */
117 1
118 1 PLL48CON = PLLCON_PLLE | PLLCON_PLLC; /* PLL Enable & Connect */
119 1 PLL48FEED = 0xAA; /* Feed Sequence 1 */
120 1 PLL48FEED = 0x55; /* Feed Sequence 2 */
121 1
122 1 VICVectAddr0 = (unsigned long)USB_ISR; /* USB Interrupt -> Vector 0 */
123 1 VICVectCntl0 = 0x20 | 22; /* USB Interrupt -> IRQ Slot 0 */
124 1 VICIntEnable = 1 << 22; /* Enable USB Interrupt */
ARM COMPILER V2.53, usbhw 09/06/07 15:42:23 PAGE 3
125 1
126 1 DEV_INT_EN = DEV_STAT_INT; /* Enable Device Status Interrupt */
127 1
128 1 #if 1 /* Partial Manual Reset */
129 1 USB_Reset();
130 1 USB_SetAddress(0);
131 1 #endif
132 1 }
133
134
135 /*
136 * USB Connect Function
137 * Parameters: con: Connect/Disconnect
138 * Return Value: None
139 */
140
141 void USB_Connect (BOOL con) {
142 1 WrCmdDat(CMD_SET_DEV_STAT, DAT_WR_BYTE(con ? DEV_CON : 0));
143 1 }
144
145
146 /*
147 * USB Reset Function
148 * Return Value: None
149 */
150
151 void USB_Reset (void) {
152 1
153 1 EP_INDEX = 0;
154 1 MAXPACKET_SIZE = USB_MAX_PACKET0;
155 1 EP_INDEX = 1;
156 1 MAXPACKET_SIZE = USB_MAX_PACKET0;
157 1 while ((DEV_INT_STAT & EP_RLZED_INT) == 0);
158 1
159 1 EP_INT_CLR = 0xFFFFFFFF;
160 1 EP_INT_EN = 0xFFFFFFFF;
161 1 DEV_INT_CLR = 0xFFFFFFFF;
162 1 DEV_INT_EN = DEV_STAT_INT | EP_SLOW_INT |
163 1 (USB_SOF_EVENT ? FRAME_INT : 0) |
164 1 (USB_ERROR_EVENT ? ERR_INT : 0);
165 1 }
166
167
168 /*
169 * USB Suspend Function
170 * Return Value: None
171 */
172
173 void USB_Suspend (void) {
174 1 // Performed by Hardware
175 1 }
176
177
178 /*
179 * USB Resume Function
180 * Return Value: None
181 */
182
183 void USB_Resume (void) {
184 1 // Performed by Hardware
185 1 }
186
187
188 /*
189 * USB Remote Wakeup Function
190 * Return Value: None
ARM COMPILER V2.53, usbhw 09/06/07 15:42:23 PAGE 4
191 */
192
193 void USB_WakeUp (void) {
194 1
195 1 if (USB_DeviceStatus & USB_GETSTATUS_REMOTE_WAKEUP) {
196 2 WrCmdDat(CMD_SET_DEV_STAT, DAT_WR_BYTE(DEV_CON));
197 2 }
198 1 }
199
200
201 /*
202 * USB Remote Wakeup Configuration Function
203 * Parameters: cfg: Enable/Disable
204 * Return Value: None
205 */
206
207 void USB_WakeUpCfg (BOOL cfg) {
208 1 cfg; // Not needed
209 1 }
210
211
212 /*
213 * USB Set Address Function
214 * Parameters: adr: USB Address
215 * Return Value: None
216 */
217
218 void USB_SetAddress (BYTE adr) {
219 1 WrCmdDat(CMD_SET_ADDR, DAT_WR_BYTE(DEV_EN | adr)); /* Don't wait for next */
220 1 WrCmdDat(CMD_SET_ADDR, DAT_WR_BYTE(DEV_EN | adr)); /* Setup Status Phase */
221 1 }
222
223
224 /*
225 * USB Configure Function
226 * Parameters: cfg: Configure/Deconfigure
227 * Return Value: None
228 */
229
230 void USB_Configure (BOOL cfg) {
231 1
232 1 WrCmdDat(CMD_CFG_DEV, DAT_WR_BYTE(cfg ? CONF_DVICE : 0));
233 1
234 1 REALIZE_EP = 0x00000003;
235 1 while ((DEV_INT_STAT & EP_RLZED_INT) == 0);
236 1 DEV_INT_CLR = EP_RLZED_INT;
237 1 }
238
239
240 /*
241 * Configure USB Endpoint
242 * Parameters: pEPD: Pointer to Endpoint Descriptor
243 * Return Value: None
244 */
245
246 void USB_ConfigEP (USB_ENDPOINT_DESCRIPTOR *pEPD) {
247 1 DWORD num;
248 1
249 1 num = EPAdr(pEPD->bEndpointAddress);
250 1 REALIZE_EP |= (1 << num);
251 1 EP_INDEX = num;
252 1 MAXPACKET_SIZE = pEPD->wMaxPacketSize;
253 1 while ((DEV_INT_STAT & EP_RLZED_INT) == 0);
254 1 DEV_INT_CLR = EP_RLZED_INT;
255 1 }
256
ARM COMPILER V2.53, usbhw 09/06/07 15:42:23 PAGE 5
257
258 /*
259 * Set Direction for USB Control Endpoint
260 * Parameters: dir: Out (dir == 0), In (dir <> 0)
261 * Return Value: None
262 */
263
264 void USB_DirCtrlEP (BYTE dir) {
265 1 dir; // Not needed
266 1 }
267
268
269 /*
270 * Enable USB Endpoint
271 * Parameters: EPNum: Endpoint Number
272 * EPNum.0..3: Address
273 * EPNum.7: Dir
274 * Return Value: None
275 */
276
277 void USB_EnableEP (BYTE EPNum) {
278 1 WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(0));
279 1 }
280
281
282 /*
283 * Disable USB Endpoint
284 * Parameters: EPNum: Endpoint Number
285 * EPNum.0..3: Address
286 * EPNum.7: Dir
287 * Return Value: None
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -