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