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