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