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