📄 chap_9.lst
字号:
C51 COMPILER V7.06 CHAP_9 12/06/2003 10:37:15 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE CHAP_9
OBJECT MODULE PLACED IN Chap_9.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE Chap_9.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <stdio.h>
2 #include <string.h>
3
4 #include <reg51.h> /* special function register declarations */
5
6 #include "epphal.h"
7 #include "d12ci.h"
8 #include "mainloop.h"
9 #include "usb100.h"
10 #include "chap_9.h"
11
12 #define NUM_ENDPOINTS 4
13
14 #define CONFIG_DESCRIPTOR_LENGTH sizeof(USB_CONFIGURATION_DESCRIPTOR) \
15 + sizeof(USB_INTERFACE_DESCRIPTOR) \
16 + (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR))
17
18 extern CONTROL_XFER ControlData;
19 extern IO_REQUEST idata ioRequest;
20 extern EPPFLAGS bEPPflags;
21
22 //设备描述符
23 code USB_DEVICE_DESCRIPTOR DeviceDescr =
24 {
25 sizeof(USB_DEVICE_DESCRIPTOR),
26 USB_DEVICE_DESCRIPTOR_TYPE,
27 SWAP(0x0110),
28 USB_CLASS_CODE_TEST_CLASS_DEVICE,
29 0, 0,
30 EP0_PACKET_SIZE,
31 SWAP(0x0471),
32 SWAP(0x0666),
33 //SWAP(0x0700),
34 SWAP(0x0100),
35 0, 0, 0,
36 1
37 };
38
39 //配置描述符
40 code USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
41 {
42 sizeof(USB_CONFIGURATION_DESCRIPTOR),
43 USB_CONFIGURATION_DESCRIPTOR_TYPE,
44 SWAP(CONFIG_DESCRIPTOR_LENGTH),
45 1,
46 1,
47 0,
48 0xa0,
49 0x1
50 };
51
52 //接口描述符
53 code USB_INTERFACE_DESCRIPTOR InterfaceDescr =
54 {
55 sizeof(USB_INTERFACE_DESCRIPTOR),
C51 COMPILER V7.06 CHAP_9 12/06/2003 10:37:15 PAGE 2
56 USB_INTERFACE_DESCRIPTOR_TYPE,
57 0,
58 0,
59 NUM_ENDPOINTS,
60 USB_CLASS_CODE_TEST_CLASS_DEVICE,
61 USB_SUBCLASS_CODE_TEST_CLASS_D12,
62 USB_PROTOCOL_CODE_TEST_CLASS_D12,
63 0
64 };
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 V7.06 CHAP_9 12/06/2003 10:37:15 PAGE 3
118 /*
119 //*************************************************************************
120 // USB standard device requests
121 //*************************************************************************
122 */
123
124 //获取设备状态
125 void get_status(void)
126 {
127 1 unsigned char endp, txdat[2];
128 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
129 1 unsigned char c;
130 1
131 1 if (bRecipient == USB_RECIPIENT_DEVICE) {
132 2 if(bEPPflags.bits.remote_wakeup == 1)//获取远程唤醒状态
133 2 txdat[0] = 3;
134 2 else
135 2 txdat[0] = 1;
136 2 txdat[1]=0;
137 2 single_transmit(txdat, 2);
138 2 } else if (bRecipient == USB_RECIPIENT_INTERFACE) {//获取接口状态
139 2 txdat[0]=0;
140 2 txdat[1]=0;
141 2 single_transmit(txdat, 2);
142 2 } else if (bRecipient == USB_RECIPIENT_ENDPOINT) {//获取端点状态
143 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
144 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
145 2 c = D12_SelectEndpoint(endp*2 + 1); /* Control-in */
146 2 else
147 2 c = D12_SelectEndpoint(endp*2); /* Control-out */
148 2 if(c & D12_STALL)
149 2 txdat[0] = 1;
150 2 else
151 2 txdat[0] = 0;
152 2 txdat[1] = 0;
153 2 single_transmit(txdat, 2);
154 2 } else
155 1 stall_ep0();
156 1 }
157
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) {//清除端点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 V7.06 CHAP_9 12/06/2003 10:37:15 PAGE 4
180 2 single_transmit(0, 0);
181 2 } else
182 1 stall_ep0();
183 1 }
184
185 //特性设置
186 void set_feature(void)
187 {
188 1 unsigned char endp;
189 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
190 1
191 1 if (bRecipient == USB_RECIPIENT_DEVICE
192 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {//设置远程唤醒功能
193 2 DISABLE;
194 2 bEPPflags.bits.remote_wakeup = 1;
195 2 ENABLE;
196 2 single_transmit(0, 0);
197 2 }
198 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
199 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {//设置端点stall
200 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
201 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
202 2 /* clear TX stall for IN on EPn. */
203 2 D12_SetEndpointStatus(endp*2 + 1, 1);
204 2 else
205 2 /* clear RX stall for OUT on EPn. */
206 2 D12_SetEndpointStatus(endp*2, 1);
207 2 single_transmit(0, 0);
208 2 } else
209 1 stall_ep0();
210 1 }
211
212 //设置地址
213 void set_address(void)
214 {
215 1 D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
216 1 DEVICE_ADDRESS_MASK), 1);
217 1 single_transmit(0, 0);
218 1 }
219
220 //获取描述符
221 void get_descriptor(void)
222 {
223 1 unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
224 1
225 1 if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) {//获取设备描述符
226 2 code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
227 2 } else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) {//获取配置描述符
228 2 code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
229 2 } else
230 1 stall_ep0();
231 1 }
232
233 //获取配置状态
234 void get_configuration(void)
235 {
236 1 unsigned char c = bEPPflags.bits.configuration;
237 1 single_transmit(&c, 1);
238 1 }
239
240 //设置配置状态
241 void set_configuration(void)
C51 COMPILER V7.06 CHAP_9 12/06/2003 10:37:15 PAGE 5
242 {
243 1 if (ControlData.DeviceRequest.wValue == 0) {
244 2 //设备进入未配置状态
245 2 single_transmit(0, 0);
246 2 DISABLE;
247 2 bEPPflags.bits.configuration = 0;
248 2 ENABLE;
249 2 init_unconfig();
250 2 } else if (ControlData.DeviceRequest.wValue == 1) {
251 2 //配置设备
252 2 single_transmit(0, 0);
253 2
254 2 init_unconfig();
255 2 init_config();
256 2 DISABLE;
257 2 bEPPflags.bits.configuration = 1;
258 2 ENABLE;
259 2 } else
260 1 stall_ep0();
261 1 }
262
263 //获取接口状态
264 void get_interface(void)
265 {
266 1 unsigned char txdat = 0; /* Only/Current interface = 0 */
267 1 single_transmit(&txdat, 1);
268 1 }
269
270 //设置接口状态
271 void set_interface(void)
272 {
273 1 if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
274 1 single_transmit(0, 0);
275 1 else
276 1 stall_ep0();
277 1 }
278
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 + -