📄 chap_9.lst
字号:
C51 COMPILER V8.02 CHAP_9 12/19/2007 17:51:24 PAGE 1
C51 COMPILER V8.02, 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
line level source
1 #include "define.h"
2 #include "epphal.h"
3 #include "d12ci.h"
4 #include "mainloop.h"
5 #include "usb100.h"
6 #include "chap_9.h"
7
8 #define NUM_ENDPOINTS 4
9
10 #define CONFIG_DESCRIPTOR_LENGTH sizeof(USB_CONFIGURATION_DESCRIPTOR) \
11 + sizeof(USB_INTERFACE_DESCRIPTOR) \
12 + (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR))
13
14 extern CONTROL_XFER ControlData;
15 extern EPPFLAGS bEPPflags;
16
17 //设备描述符
18 code USB_DEVICE_DESCRIPTOR DeviceDescr =
19 {
20 sizeof(USB_DEVICE_DESCRIPTOR),
21 USB_DEVICE_DESCRIPTOR_TYPE,
22 SWAP(0x0110),
23 USB_CLASS_CODE_TEST_CLASS_DEVICE,
24 0, 0,
25 EP0_PACKET_SIZE,
26 SWAP(0x0471),
27 SWAP(0x0888),
28 SWAP(0x0100),
29 0, 0, 0,
30 1
31 };
32
33 //配置描述符
34 code USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
35 {
36 sizeof(USB_CONFIGURATION_DESCRIPTOR),
37 USB_CONFIGURATION_DESCRIPTOR_TYPE,
38 SWAP(CONFIG_DESCRIPTOR_LENGTH),
39 1,
40 1,
41 0,
42 0xa0,
43 0x32
44 };
45
46 //接口描述符
47 code USB_INTERFACE_DESCRIPTOR InterfaceDescr =
48 {
49 sizeof(USB_INTERFACE_DESCRIPTOR),
50 USB_INTERFACE_DESCRIPTOR_TYPE,
51 0,
52 0,
53 NUM_ENDPOINTS,
54 USB_CLASS_CODE_TEST_CLASS_DEVICE,
55 USB_SUBCLASS_CODE_TEST_CLASS_D12,
C51 COMPILER V8.02 CHAP_9 12/19/2007 17:51:24 PAGE 2
56 USB_PROTOCOL_CODE_TEST_CLASS_D12,
57 0
58 };
59
60 //端点描述符
61 code USB_ENDPOINT_DESCRIPTOR EP1_TXDescr =
62 {
63 sizeof(USB_ENDPOINT_DESCRIPTOR),
64 USB_ENDPOINT_DESCRIPTOR_TYPE,
65 0x81,
66 USB_ENDPOINT_TYPE_INTERRUPT,
67 SWAP(EP1_PACKET_SIZE),
68 10
69 };
70
71 code USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
72 {
73 sizeof(USB_ENDPOINT_DESCRIPTOR),
74 USB_ENDPOINT_DESCRIPTOR_TYPE,
75 0x1,
76 USB_ENDPOINT_TYPE_INTERRUPT,
77 SWAP(EP1_PACKET_SIZE),
78 10
79 };
80
81 code USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
82 {
83 sizeof(USB_ENDPOINT_DESCRIPTOR),
84 USB_ENDPOINT_DESCRIPTOR_TYPE,
85 0x82,
86 USB_ENDPOINT_TYPE_BULK,
87 SWAP(EP2_PACKET_SIZE),
88 10
89 };
90
91 code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
92 {
93 sizeof(USB_ENDPOINT_DESCRIPTOR),
94 USB_ENDPOINT_DESCRIPTOR_TYPE,
95 0x2,
96 USB_ENDPOINT_TYPE_BULK,
97 SWAP(EP2_PACKET_SIZE),
98 10
99 };
100
101 /*
102 //*************************************************************************
103 // USB Protocol Layer
104 //*************************************************************************
105 */
106
107 void reserved(void)
108 {
109 1 stall_ep0();
110 1 }
111
112 /*
113 //*************************************************************************
114 // USB standard device requests
115 //*************************************************************************
116 */
117
C51 COMPILER V8.02 CHAP_9 12/19/2007 17:51:24 PAGE 3
118 //获取设备状态
119 void get_status(void)
120 {
121 1 unsigned char endp, txdat[2];
122 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
123 1 unsigned char c;
124 1
125 1 if (bRecipient == USB_RECIPIENT_DEVICE) {
126 2 if(bEPPflags.bits.remote_wakeup == 1)//获取远程唤醒状态
127 2 txdat[0] = 3;
128 2 else
129 2 txdat[0] = 1;
130 2 txdat[1]=0;
131 2 single_transmit(txdat, 2);
132 2 } else if (bRecipient == USB_RECIPIENT_INTERFACE) {//获取接口状态
133 2 txdat[0]=0;
134 2 txdat[1]=0;
135 2 single_transmit(txdat, 2);
136 2 } else if (bRecipient == USB_RECIPIENT_ENDPOINT) {//获取端点状态
137 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
138 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
139 2 c = D12_SelectEndpoint(endp*2 + 1); /* Control-in */
140 2 else
141 2 c = D12_SelectEndpoint(endp*2); /* Control-out */
142 2 if(c & D12_STALL)
143 2 txdat[0] = 1;
144 2 else
145 2 txdat[0] = 0;
146 2 txdat[1] = 0;
147 2 single_transmit(txdat, 2);
148 2 } else
149 1 stall_ep0();
150 1 }
151
152 //特性清除
153 void clear_feature(void)
154 {
155 1 unsigned char endp;
156 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
157 1
158 1 if (bRecipient == USB_RECIPIENT_DEVICE
159 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {//清除远程唤醒功能
160 2 DISABLE;
161 2 bEPPflags.bits.remote_wakeup = 0;
162 2 ENABLE;
163 2 single_transmit(0, 0);
164 2 }
165 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
166 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {//清除端点stall
167 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
168 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
169 2 /* clear TX stall for IN on EPn. */
170 2 D12_SetEndpointStatus(endp*2 + 1, 0);
171 2 else
172 2 /* clear RX stall for OUT on EPn. */
173 2 D12_SetEndpointStatus(endp*2, 0);
174 2 single_transmit(0, 0);
175 2 } else
176 1 stall_ep0();
177 1 }
178
179 //特性设置
C51 COMPILER V8.02 CHAP_9 12/19/2007 17:51:24 PAGE 4
180 void set_feature(void)
181 {
182 1 unsigned char endp;
183 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
184 1
185 1 if (bRecipient == USB_RECIPIENT_DEVICE
186 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {//设置远程唤醒功能
187 2 DISABLE;
188 2 bEPPflags.bits.remote_wakeup = 1;
189 2 ENABLE;
190 2 single_transmit(0, 0);
191 2 }
192 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
193 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {//设置端点stall
194 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
195 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
196 2 /* clear TX stall for IN on EPn. */
197 2 D12_SetEndpointStatus(endp*2 + 1, 1);
198 2 else
199 2 /* clear RX stall for OUT on EPn. */
200 2 D12_SetEndpointStatus(endp*2, 1);
201 2 single_transmit(0, 0);
202 2 } else
203 1 stall_ep0();
204 1 }
205
206 //设置地址
207 void set_address(void)
208 {
209 1 D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
210 1 DEVICE_ADDRESS_MASK), 1);
211 1 single_transmit(0, 0);
212 1 }
213
214 //获取描述符
215 void get_descriptor(void)
216 {
217 1 unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
218 1 if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) {//获取设备描述符
219 2 code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
220 2 } else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) {//获取配置描述符
221 2 code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
222 2 } else
223 1 stall_ep0();
224 1 }
225
226 //获取配置状态
227 void get_configuration(void)
228 {
229 1 unsigned char c = bEPPflags.bits.configuration;
230 1 single_transmit(&c, 1);
231 1 }
232
233 //设置配置状态
234 void set_configuration(void)
235 {
236 1 if (ControlData.DeviceRequest.wValue == 0) {
237 2 //设备进入未配置状态
238 2 single_transmit(0, 0);
239 2 DISABLE;
240 2 bEPPflags.bits.configuration = 0;
241 2 ENABLE;
C51 COMPILER V8.02 CHAP_9 12/19/2007 17:51:24 PAGE 5
242 2 init_unconfig();
243 2 } else if (ControlData.DeviceRequest.wValue == 1) {
244 2 //配置设备
245 2 single_transmit(0, 0);
246 2
247 2 init_unconfig();
248 2 init_config();
249 2 DISABLE;
250 2 bEPPflags.bits.configuration = 1;
251 2 ENABLE;
252 2 } else
253 1 stall_ep0();
254 1 }
255
256 //获取接口状态
257 void get_interface(void)
258 {
259 1 unsigned char txdat = 0; /* Only/Current interface = 0 */
260 1 single_transmit(&txdat, 1);
261 1 }
262
263 //设置接口状态
264 void set_interface(void)
265 {
266 1 if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
267 1 single_transmit(0, 0);
268 1 else
269 1 stall_ep0();
270 1 }
271
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 + -