📄 usbcore.lst
字号:
ARM COMPILER V2.50a, usbcore 27/03/06 17:22:53 PAGE 1
ARM COMPILER V2.50a, COMPILATION OF MODULE usbcore
OBJECT MODULE PLACED IN .\Obj\usbcore.obj
COMPILER INVOKED BY: C:\Keil\ARM\BIN\CA.exe usbcore.c THUMB DEBUG PRINT(.\LST\USBCORE.LST) TABS(4) OBJECT(.\Obj\usbcore.
-obj)
stmt level source
1 /*----------------------------------------------------------------------------
2 * U S B - K e r n e l
3 *----------------------------------------------------------------------------
4 * Name: USBCORE.C
5 * Purpose: USB Core Module
6 * Version: V1.05
7 *----------------------------------------------------------------------------
8 * This software is supplied "AS IS" without any warranties, express,
9 * implied or statutory, including but not limited to the implied
10 * warranties of fitness for purpose, satisfactory quality and
11 * noninfringement. Keil extends you a royalty-free right to reproduce
12 * and distribute executable files created using this software for use
13 * on Philips LPC2xxx microcontroller devices only. Nothing else gives
14 * you the right to use this software.
15 *
16 * Copyright (c) 2005-2006 Keil Software.
17 *---------------------------------------------------------------------------*/
18
19 #include "type.h"
20
21 #include "usb.h"
22 #include "usbcfg.h"
23 #include "usbhw.h"
24 #include "usbcore.h"
25 #include "usbdesc.h"
26 #include "usbuser.h"
27
28 #if (USB_AUDIO)
29 #include "audio.h"
30 #include "adcuser.h"
31 #endif
32
33 #if (USB_HID)
#include "hid.h"
#include "hiduser.h"
#endif
37
38 #if (USB_MSC)
#include "msc.h"
#include "mscuser.h"
#endif
42
43
44 WORD USB_DeviceStatus;
45 BYTE USB_DeviceAddress;
46 BYTE USB_Configuration;
47 DWORD USB_EndPointMask;
48 DWORD USB_EndPointHalt;
49 BYTE USB_NumInterfaces;
50 BYTE USB_AltSetting[USB_IF_NUM];
51
52 BYTE EP0Buf[USB_MAX_PACKET0];
53
54
55 USB_EP_DATA EP0Data;
56
57 USB_SETUP_PACKET SetupPacket;
58
ARM COMPILER V2.50a, usbcore 27/03/06 17:22:53 PAGE 2
59
60 /*
61 * Reset USB Core
62 * Parameters: None
63 * Return Value: None
64 */
65
66 void USB_ResetCore (void) {
67 1
68 1 USB_DeviceStatus = USB_POWER;
69 1 USB_DeviceAddress = 0;
70 1 USB_Configuration = 0;
71 1 USB_EndPointMask = 0x00010001;
72 1 USB_EndPointHalt = 0x00000000;
73 1 }
74
75
76 /*
77 * USB Request - Setup Stage
78 * Parameters: None (global SetupPacket)
79 * Return Value: None
80 */
81
82 void USB_SetupStage (void) {
83 1 USB_ReadEP(0x00, (BYTE *)&SetupPacket);
84 1 }
85
86
87 /*
88 * USB Request - Data In Stage
89 * Parameters: None (global EP0Data)
90 * Return Value: None
91 */
92
93 void USB_DataInStage (void) {
94 1 DWORD cnt;
95 1
96 1 if (EP0Data.Count > USB_MAX_PACKET0) {
97 2 cnt = USB_MAX_PACKET0;
98 2 } else {
99 2 cnt = EP0Data.Count;
100 2 }
101 1 cnt = USB_WriteEP(0x80, EP0Data.pData, cnt);
102 1 EP0Data.pData += cnt;
103 1 EP0Data.Count -= cnt;
104 1 }
105
106
107 /*
108 * USB Request - Data Out Stage
109 * Parameters: None (global EP0Data)
110 * Return Value: None
111 */
112
113 void USB_DataOutStage (void) {
114 1 DWORD cnt;
115 1
116 1 cnt = USB_ReadEP(0x00, EP0Data.pData);
117 1 EP0Data.pData += cnt;
118 1 EP0Data.Count -= cnt;
119 1 }
120
121
122 /*
123 * USB Request - Status In Stage
124 * Parameters: None
ARM COMPILER V2.50a, usbcore 27/03/06 17:22:53 PAGE 3
125 * Return Value: None
126 */
127
128 void USB_StatusInStage (void) {
129 1 USB_WriteEP(0x80, NULL, 0);
130 1 }
131
132
133 /*
134 * USB Request - Status Out Stage
135 * Parameters: None
136 * Return Value: None
137 */
138
139 void USB_StatusOutStage (void) {
140 1 USB_ReadEP(0x00, EP0Buf);
141 1 }
142
143
144 /*
145 * Get Status USB Request
146 * Parameters: None (global SetupPacket)
147 * Return Value: TRUE - Success, FALSE - Error
148 */
149
150 __inline BOOL USB_GetStatus (void) {
151 1 DWORD n, m;
152 1
153 1 switch (SetupPacket.bmRequestType.BM.Recipient) {
154 2 case REQUEST_TO_DEVICE:
155 2 EP0Data.pData = (BYTE *)&USB_DeviceStatus;
156 2 USB_DataInStage();
157 2 break;
158 2 case REQUEST_TO_INTERFACE:
159 2 if ((USB_Configuration != 0) && (SetupPacket.wIndex.WB.L < USB_NumInterfaces)) {
160 3 *((__packed WORD *)EP0Buf) = 0;
161 3 EP0Data.pData = EP0Buf;
162 3 USB_DataInStage();
163 3 } else {
164 3 return (FALSE);
165 3 }
166 2 break;
167 2 case REQUEST_TO_ENDPOINT:
168 2 n = SetupPacket.wIndex.WB.L & 0x8F;
169 2 m = (n & 0x80) ? ((1 << 16) << n) : (1 << n);
170 2 if (((USB_Configuration != 0) || ((n & 0x0F) == 0)) && (USB_EndPointMask & m)) {
171 3 *((__packed WORD *)EP0Buf) = (USB_EndPointHalt & m) ? 1 : 0;
172 3 EP0Data.pData = EP0Buf;
173 3 USB_DataInStage();
174 3 } else {
175 3 return (FALSE);
176 3 }
177 2 break;
178 2 default:
179 2 return (FALSE);
180 2 }
181 1 return (TRUE);
182 1 }
183
184
185 /*
186 * Set/Clear Feature USB Request
187 * Parameters: sc: 0 - Clear, 1 - Set
188 * None (global SetupPacket)
189 * Return Value: TRUE - Success, FALSE - Error
190 */
ARM COMPILER V2.50a, usbcore 27/03/06 17:22:53 PAGE 4
191
192 __inline BOOL USB_SetClrFeature (DWORD sc) {
193 1 DWORD n, m;
194 1
195 1 switch (SetupPacket.bmRequestType.BM.Recipient) {
196 2 case REQUEST_TO_DEVICE:
197 2 if (SetupPacket.wValue.W == USB_FEATURE_REMOTE_WAKEUP) {
198 3 if (sc) {
199 4 USB_WakeUpCfg(TRUE);
200 4 USB_DeviceStatus |= USB_GETSTATUS_REMOTE_WAKEUP;
201 4 } else {
202 4 USB_WakeUpCfg(FALSE);
203 4 USB_DeviceStatus &= ~USB_GETSTATUS_REMOTE_WAKEUP;
204 4 }
205 3 } else {
206 3 return (FALSE);
207 3 }
208 2 break;
209 2 case REQUEST_TO_INTERFACE:
210 2 return (FALSE);
211 2 case REQUEST_TO_ENDPOINT:
212 2 n = SetupPacket.wIndex.WB.L & 0x8F;
213 2 m = (n & 0x80) ? ((1 << 16) << n) : (1 << n);
214 2 if ((USB_Configuration != 0) && ((n & 0x0F) != 0) && (USB_EndPointMask & m)) {
215 3 if (SetupPacket.wValue.W == USB_FEATURE_ENDPOINT_STALL) {
216 4 if (sc) {
217 5 USB_SetStallEP(n);
218 5 USB_EndPointHalt |= m;
219 5 } else {
220 5 USB_ClrStallEP(n);
221 5 USB_EndPointHalt &= ~m;
222 5 }
223 4 } else {
224 4 return (FALSE);
225 4 }
226 3 } else {
227 3 return (FALSE);
228 3 }
229 2 break;
230 2 default:
231 2 return (FALSE);
232 2 }
233 1 return (TRUE);
234 1 }
235
236
237 /*
238 * Get Descriptor USB Request
239 * Parameters: None (global SetupPacket)
240 * Return Value: TRUE - Success, FALSE - Error
241 */
242
243 __inline BOOL USB_GetDescriptor (void) {
244 1 BYTE *pD;
245 1 DWORD len, n;
246 1
247 1 switch (SetupPacket.bmRequestType.BM.Recipient) {
248 2 case REQUEST_TO_DEVICE:
249 2 switch (SetupPacket.wValue.WB.H) {
250 3 case USB_DEVICE_DESCRIPTOR_TYPE:
251 3 EP0Data.pData = (BYTE *)USB_DeviceDescriptor;
252 3 len = USB_DEVICE_DESC_SIZE;
253 3 break;
254 3 case USB_CONFIGURATION_DESCRIPTOR_TYPE:
255 3 pD = (BYTE *)USB_ConfigDescriptor;
256 3 for (n = 0; n != SetupPacket.wValue.WB.L; n++) {
ARM COMPILER V2.50a, usbcore 27/03/06 17:22:53 PAGE 5
257 4 if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bLength != 0) {
258 5 pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
259 5 }
260 4 }
261 3 if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bLength == 0) {
262 4 return (FALSE);
263 4 }
264 3 EP0Data.pData = pD;
265 3 len = ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
266 3 break;
267 3 case USB_STRING_DESCRIPTOR_TYPE:
268 3 EP0Data.pData = (BYTE *)USB_StringDescriptor + SetupPacket.wValue.WB.L;
269 3 len = ((USB_STRING_DESCRIPTOR *)EP0Data.pData)->bLength;
270 3 break;
271 3 default:
272 3 return (FALSE);
273 3 }
274 2 break;
275 2 case REQUEST_TO_INTERFACE:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -