📄 chap9.lst
字号:
C51 COMPILER V8.01 CHAP9 04/19/2006 16:02:45 PAGE 1
C51 COMPILER V8.01, COMPILATION OF MODULE CHAP9
OBJECT MODULE PLACED IN chap9.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE chap9.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "hardware.h"
2 #include "USB100.h"
3 #include "d12_driver.h"
4 #include "ufmain.h"
5 #include "chap9.h"
6
7 //---------------------------
8 extern void single_transmit(unsigned char * buf, unsigned char len);
9 extern void code_transmit(unsigned char code * pRomData, unsigned short len);
10 extern void stall_ep0(void);
11 extern void init_unconfig(void);
12 extern void init_config(void);
13
14 #define NUM_ENDPOINTS 4
15
16 #define CONFIG_DESCRIPTOR_LENGTH sizeof(USB_CONFIGURATION_DESCRIPTOR) \
17 + sizeof(USB_INTERFACE_DESCRIPTOR) \
18 + (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR))
19
20 extern CONTROL_XFER ControlData;
21 extern EPPFLAGS bEPPflags;
22
23 code USB_DEVICE_DESCRIPTOR DeviceDescr =
24 {
25 sizeof(USB_DEVICE_DESCRIPTOR),
26 USB_DEVICE_DESCRIPTOR_TYPE,
27 SWAP(0x0100),
28 USB_CLASS_CODE_TEST_CLASS_DEVICE,
29 0,
30 0,
31 EP0_PACKET_SIZE,
32 SWAP(0x0471), //VID
33 SWAP(0x0666), //PID
34 SWAP(0x0100),
35 0, //Manufactory
36 0, //Product
37 0, //Serial Number
38 25 //Number of possible configurations
39 };
40
41 code USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
42 {
43 sizeof(USB_CONFIGURATION_DESCRIPTOR),
44 USB_CONFIGURATION_DESCRIPTOR_TYPE,
45 SWAP(CONFIG_DESCRIPTOR_LENGTH),
46 1,
47 1,
48 0,
49 0x60,
50 0xf0
51 //0x1
52 };
53
54 code USB_INTERFACE_DESCRIPTOR InterfaceDescr =
55 {
C51 COMPILER V8.01 CHAP9 04/19/2006 16:02:45 PAGE 2
56 sizeof(USB_INTERFACE_DESCRIPTOR),
57 USB_INTERFACE_DESCRIPTOR_TYPE,
58 0,
59 0,
60 NUM_ENDPOINTS,
61 USB_CLASS_CODE_TEST_CLASS_DEVICE,
62 USB_SUBCLASS_CODE_TEST_CLASS_D12,
63 USB_PROTOCOL_CODE_TEST_CLASS_D12,
64 0
65 };
66
67 code USB_ENDPOINT_DESCRIPTOR EP1_TXDescr =
68 {
69 sizeof(USB_ENDPOINT_DESCRIPTOR),
70 USB_ENDPOINT_DESCRIPTOR_TYPE,
71 0x81,
72 USB_ENDPOINT_TYPE_INTERRUPT,
73 SWAP(EP1_PACKET_SIZE),
74 10
75 };
76
77 code USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
78 {
79 sizeof(USB_ENDPOINT_DESCRIPTOR),
80 USB_ENDPOINT_DESCRIPTOR_TYPE,
81 0x1,
82 USB_ENDPOINT_TYPE_INTERRUPT,
83 SWAP(EP1_PACKET_SIZE),
84 10
85 };
86
87 code USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
88 {
89 sizeof(USB_ENDPOINT_DESCRIPTOR),
90 USB_ENDPOINT_DESCRIPTOR_TYPE,
91 0x82,
92 USB_ENDPOINT_TYPE_BULK,
93 SWAP(EP2_PACKET_SIZE),
94 10
95 };
96
97 code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
98 {
99 sizeof(USB_ENDPOINT_DESCRIPTOR),
100 USB_ENDPOINT_DESCRIPTOR_TYPE,
101 0x2,
102 USB_ENDPOINT_TYPE_BULK,
103 SWAP(EP2_PACKET_SIZE),
104 10
105 };
106
107 /*
108 //*************************************************************************
109 // USB Protocol Layer
110 //*************************************************************************
111 */
112
113 void reserved(void)
114 {
115 1 stall_ep0();
116 1 }
117
C51 COMPILER V8.01 CHAP9 04/19/2006 16:02:45 PAGE 3
118 /*
119 //*************************************************************************
120 // USB standard device requests
121 //*************************************************************************
122 */
123
124 void get_status(void)
125 {
126 1 unsigned char endp, txdat[2];
127 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
128 1 unsigned char c;
129 1
130 1 if (bRecipient == USB_RECIPIENT_DEVICE) {
131 2 if(bEPPflags.bits.remote_wakeup == 1)
132 2 txdat[0] = 3;
133 2 else
134 2 txdat[0] = 1;
135 2 txdat[1]=0;
136 2 single_transmit(txdat, 2);
137 2 } else if (bRecipient == USB_RECIPIENT_INTERFACE) {
138 2 txdat[0]=0;
139 2 txdat[1]=0;
140 2 single_transmit(txdat, 2);
141 2 } else if (bRecipient == USB_RECIPIENT_ENDPOINT) {
142 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
143 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
144 2 c = D12_SelectEndpoint(endp*2 + 1); /* Control-in */
145 2
146 2
147 2 else
148 2 c = D12_SelectEndpoint(endp*2); /* Control-out */
149 2 if(c & D12_STALL)
150 2 txdat[0] = 1;
151 2 else
152 2 txdat[0] = 0;
153 2 txdat[1] = 0;
154 2 single_transmit(txdat, 2);
155 2 } else
156 1 stall_ep0();
157 1 }
158
159 void clear_feature(void)
160 {
161 1 unsigned char endp;
162 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
163 1
164 1 if (bRecipient == USB_RECIPIENT_DEVICE
165 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
166 2 DISABLE;
167 2 bEPPflags.bits.remote_wakeup = 0;
168 2 ENABLE;
169 2 single_transmit(0, 0);
170 2 }
171 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
172 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
173 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
174 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
175 2 // clear TX stall for IN on EPn.
176 2 D12_SetEndpointStatus(endp*2 + 1, 0);
177 2 else
178 2 // clear RX stall for OUT on EPn.
179 2 D12_SetEndpointStatus(endp*2, 0);
C51 COMPILER V8.01 CHAP9 04/19/2006 16:02:45 PAGE 4
180 2 single_transmit(0, 0);
181 2 } else
182 1 stall_ep0();
183 1 }
184
185 void set_feature(void)
186 {
187 1 unsigned char endp;
188 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
189 1
190 1 if (bRecipient == USB_RECIPIENT_DEVICE
191 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
192 2 DISABLE;
193 2 bEPPflags.bits.remote_wakeup = 1;
194 2 ENABLE;
195 2 single_transmit(0, 0);
196 2 }
197 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
198 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
199 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
200 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
201 2 // clear TX stall for IN on EPn.
202 2 D12_SetEndpointStatus(endp*2 + 1, 1);
203 2 else
204 2 // clear RX stall for OUT on EPn.
205 2 D12_SetEndpointStatus(endp*2, 1);
206 2 single_transmit(0, 0);
207 2 } else
208 1 stall_ep0();
209 1 }
210
211 void set_address(void)
212 {
213 1 D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
214 1 DEVICE_ADDRESS_MASK), 1);
215 1 single_transmit(0, 0);
216 1 }
217
218 void get_descriptor(void)
219 {
220 1 unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
221 1
222 1 if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) {
223 2 code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
224 2 }
225 1 else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) {
226 2 code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
227 2 }
228 1 else
229 1 stall_ep0();
230 1 }
231
232 void get_configuration(void)
233 {
234 1 unsigned char c = bEPPflags.bits.configuration;
235 1
236 1 single_transmit(&c, 1);
237 1 }
238
239 void set_configuration(void)
240 {
241 1 if (ControlData.DeviceRequest.wValue == 0) {
C51 COMPILER V8.01 CHAP9 04/19/2006 16:02:45 PAGE 5
242 2 //* put device in unconfigured state
243 2 single_transmit(0, 0);
244 2 DISABLE;
245 2 bEPPflags.bits.configuration = 0;
246 2 ENABLE;
247 2 init_unconfig();
248 2 } else if (ControlData.DeviceRequest.wValue == 1) {
249 2 // Configure device
250 2 single_transmit(0, 0);
251 2
252 2 init_unconfig();
253 2 init_config();
254 2
255 2 DISABLE;
256 2 bEPPflags.bits.configuration = 1;
257 2 ENABLE;
258 2 } else
259 1 stall_ep0();
260 1 }
261
262 void get_interface(void)
263 {
264 1 unsigned char txdat = 0; // Only/Current interface = 0
265 1 single_transmit(&txdat, 1);
266 1 }
267
268 void set_interface(void)
269 {
270 1 if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
271 1 single_transmit(0, 0);
272 1 else
273 1 stall_ep0();
274 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 448 ----
CONSTANT SIZE = 64 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 12
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -