📄 usbcore.lst
字号:
ARM COMPILER V2.42b, usbcore 02/01/06 23:45:15 PAGE 1
ARM COMPILER V2.42b, 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.03
7 *----------------------------------------------------------------------------
8 * This file is part of the uVision/ARM development tools.
9 * Copyright (c) 2005 Keil Software. All rights reserved.
10 *---------------------------------------------------------------------------*/
11
12 #include "type.h"
13
14 #include "usb.h"
15 #include "usbcfg.h"
16 #include "usbhw.h"
17 #include "usbcore.h"
18 #include "usbdesc.h"
19 #include "usbuser.h"
20
21 #if (USB_AUDIO)
#include "audio.h"
#include "adcuser.h"
#endif
25
26 #if (USB_HID)
#include "hid.h"
#include "hiduser.h"
#endif
30
31 #if (USB_MSC)
32 #include "msc.h"
33 #include "mscuser.h"
34 #endif
35
36
37 WORD USB_DeviceStatus;
38 BYTE USB_DeviceAddress;
39 BYTE USB_Configuration;
40 DWORD USB_EndPointMask;
41 DWORD USB_EndPointHalt;
42 BYTE USB_NumInterfaces;
43 BYTE USB_AltSetting[USB_IF_NUM];
44
45 BYTE EP0Buf[USB_MAX_PACKET0];
46
47
48 USB_EP_DATA EP0Data;
49
50 USB_SETUP_PACKET SetupPacket;
51
52
53 /*
54 * Reset USB Core
55 * Parameters: None
56 * Return Value: None
57 */
58
ARM COMPILER V2.42b, usbcore 02/01/06 23:45:15 PAGE 2
59 void USB_ResetCore (void) {
60 1
61 1 USB_DeviceStatus = USB_POWER;
62 1 USB_DeviceAddress = 0;
63 1 USB_Configuration = 0;
64 1 USB_EndPointMask = 0x00010001;
65 1 USB_EndPointHalt = 0x00000000;
66 1 }
67
68
69 /*
70 * USB Request - Setup Stage
71 * Parameters: None (global SetupPacket)
72 * Return Value: None
73 */
74
75 void USB_SetupStage (void) {
76 1 USB_ReadEP(0x00, (BYTE *)&SetupPacket);
77 1 }
78
79
80 /*
81 * USB Request - Data In Stage
82 * Parameters: None (global EP0Data)
83 * Return Value: None
84 */
85
86 void USB_DataInStage (void) {
87 1 DWORD cnt;
88 1
89 1 if (EP0Data.Count > USB_MAX_PACKET0) {
90 2 cnt = USB_MAX_PACKET0;
91 2 } else {
92 2 cnt = EP0Data.Count;
93 2 }
94 1 cnt = USB_WriteEP(0x80, EP0Data.pData, cnt);
95 1 EP0Data.pData += cnt;
96 1 EP0Data.Count -= cnt;
97 1 }
98
99
100 /*
101 * USB Request - Data Out Stage
102 * Parameters: None (global EP0Data)
103 * Return Value: None
104 */
105
106 void USB_DataOutStage (void) {
107 1 DWORD cnt;
108 1
109 1 cnt = USB_ReadEP(0x00, EP0Data.pData);
110 1 EP0Data.pData += cnt;
111 1 EP0Data.Count -= cnt;
112 1 }
113
114
115 /*
116 * USB Request - Status In Stage
117 * Parameters: None
118 * Return Value: None
119 */
120
121 void USB_StatusInStage (void) {
122 1 USB_WriteEP(0x80, NULL, 0);
123 1 }
124
ARM COMPILER V2.42b, usbcore 02/01/06 23:45:15 PAGE 3
125
126 /*
127 * USB Request - Status Out Stage
128 * Parameters: None
129 * Return Value: None
130 */
131
132 void USB_StatusOutStage (void) {
133 1 USB_ReadEP(0x00, EP0Buf);
134 1 }
135
136
137 /*
138 * Get Status USB Request
139 * Parameters: None (global SetupPacket)
140 * Return Value: TRUE - Success, FALSE - Error
141 */
142
143 __inline BOOL USB_GetStatus (void) {
144 1 DWORD n, m;
145 1
146 1 switch (SetupPacket.bmRequestType.BM.Recipient) {
147 2 case REQUEST_TO_DEVICE:
148 2 EP0Data.pData = (BYTE *)&USB_DeviceStatus;
149 2 USB_DataInStage();
150 2 break;
151 2 case REQUEST_TO_INTERFACE:
152 2 if ((USB_Configuration != 0) && (SetupPacket.wIndex.WB.L < USB_NumInterfaces)) {
153 3 *((__packed WORD *)EP0Buf) = 0;
154 3 EP0Data.pData = EP0Buf;
155 3 USB_DataInStage();
156 3 } else {
157 3 return (FALSE);
158 3 }
159 2 break;
160 2 case REQUEST_TO_ENDPOINT:
161 2 n = SetupPacket.wIndex.WB.L & 0x8F;
162 2 m = (n & 0x80) ? ((1 << 16) << n) : (1 << n);
163 2 if (((USB_Configuration != 0) || ((n & 0x0F) == 0)) && (USB_EndPointMask & m)) {
164 3 *((__packed WORD *)EP0Buf) = (USB_EndPointHalt & m) ? 1 : 0;
165 3 EP0Data.pData = EP0Buf;
166 3 USB_DataInStage();
167 3 } else {
168 3 return (FALSE);
169 3 }
170 2 break;
171 2 default:
172 2 return (FALSE);
173 2 }
174 1 return (TRUE);
175 1 }
176
177
178 /*
179 * Set/Clear Feature USB Request
180 * Parameters: sc: 0 - Clear, 1 - Set
181 * None (global SetupPacket)
182 * Return Value: TRUE - Success, FALSE - Error
183 */
184
185 __inline BOOL USB_SetClrFeature (DWORD sc) {
186 1 DWORD n, m;
187 1
188 1 switch (SetupPacket.bmRequestType.BM.Recipient) {
189 2 case REQUEST_TO_DEVICE:
190 2 if (SetupPacket.wValue.W == USB_FEATURE_REMOTE_WAKEUP) {
ARM COMPILER V2.42b, usbcore 02/01/06 23:45:15 PAGE 4
191 3 if (sc) {
192 4 USB_WakeUpCfg(TRUE);
193 4 USB_DeviceStatus |= USB_GETSTATUS_REMOTE_WAKEUP;
194 4 } else {
195 4 USB_WakeUpCfg(FALSE);
196 4 USB_DeviceStatus &= ~USB_GETSTATUS_REMOTE_WAKEUP;
197 4 }
198 3 } else {
199 3 return (FALSE);
200 3 }
201 2 break;
202 2 case REQUEST_TO_INTERFACE:
203 2 return (FALSE);
204 2 case REQUEST_TO_ENDPOINT:
205 2 n = SetupPacket.wIndex.WB.L & 0x8F;
206 2 m = (n & 0x80) ? ((1 << 16) << n) : (1 << n);
207 2 if ((USB_Configuration != 0) && ((n & 0x0F) != 0) && (USB_EndPointMask & m)) {
208 3 if (SetupPacket.wValue.W == USB_FEATURE_ENDPOINT_STALL) {
209 4 if (sc) {
210 5 USB_SetStallEP(n);
211 5 USB_EndPointHalt |= m;
212 5 } else {
213 5 USB_ClrStallEP(n);
214 5 USB_EndPointHalt &= ~m;
215 5 }
216 4 } else {
217 4 return (FALSE);
218 4 }
219 3 } else {
220 3 return (FALSE);
221 3 }
222 2 break;
223 2 default:
224 2 return (FALSE);
225 2 }
226 1 return (TRUE);
227 1 }
228
229
230 /*
231 * Get Descriptor USB Request
232 * Parameters: None (global SetupPacket)
233 * Return Value: TRUE - Success, FALSE - Error
234 */
235
236 __inline BOOL USB_GetDescriptor (void) {
237 1 BYTE *pD;
238 1 DWORD len, n;
239 1
240 1 switch (SetupPacket.bmRequestType.BM.Recipient) {
241 2 case REQUEST_TO_DEVICE:
242 2 switch (SetupPacket.wValue.WB.H) {
243 3 case USB_DEVICE_DESCRIPTOR_TYPE:
244 3 EP0Data.pData = (BYTE *)USB_DeviceDescriptor;
245 3 len = USB_DEVICE_DESC_SIZE;
246 3 break;
247 3 case USB_CONFIGURATION_DESCRIPTOR_TYPE:
248 3 pD = (BYTE *)USB_ConfigDescriptor;
249 3 for (n = 0; n != SetupPacket.wValue.WB.L; n++) {
250 4 if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bLength != 0) {
251 5 pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
252 5 }
253 4 }
254 3 if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bLength == 0) {
255 4 return (FALSE);
256 4 }
ARM COMPILER V2.42b, usbcore 02/01/06 23:45:15 PAGE 5
257 3 EP0Data.pData = pD;
258 3 len = ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
259 3 break;
260 3 case USB_STRING_DESCRIPTOR_TYPE:
261 3 EP0Data.pData = (BYTE *)USB_StringDescriptor + SetupPacket.wValue.WB.L;
262 3 len = ((USB_STRING_DESCRIPTOR *)EP0Data.pData)->bLength;
263 3 break;
264 3 default:
265 3 return (FALSE);
266 3 }
267 2 break;
268 2 case REQUEST_TO_INTERFACE:
269 2 switch (SetupPacket.wValue.WB.H) {
270 3 #if USB_HID
case HID_HID_DESCRIPTOR_TYPE:
if (SetupPacket.wIndex.WB.L != USB_HID_IF_NUM) {
return (FALSE); /* Only Single HID Interface is supported */
}
EP0Data.pData = (BYTE *)USB_ConfigDescriptor + HID_DESC_OFFSET;
len = HID_DESC_SIZE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -