📄 chap9.lst
字号:
C51 COMPILER V7.09 CHAP9 03/30/2005 12:31:36 PAGE 1
C51 COMPILER V7.09, 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
2
3 #include <stdio.h>
4 #include <string.h>
5
6 //#include <reg51.h> /* special function register declarations */
7
8 #include "hal.h"
9 #include "d12ci.h"
10 #include "main.h"
11 #include "usb100.h"
12 #include "chap9.h"
13 //可能会修改PID 和 VID,其它均不用修改
14 //---------------------------
15 extern void single_transmit(unsigned char * buf, unsigned char len);
16 extern void code_transmit(unsigned char code * pRomData, unsigned short len);
17 extern void stall_ep0(void);
18 extern void init_unconfig(void);
19 extern void init_config(void);
20
21 #define NUM_ENDPOINTS 4
22
23 #define CONFIG_DESCRIPTOR_LENGTH sizeof(USB_CONFIGURATION_DESCRIPTOR) \
24 + sizeof(USB_INTERFACE_DESCRIPTOR) \
25 + (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR))
26
27 extern CONTROL_XFER ControlData;
28 extern IO_REQUEST idata ioRequest;
29 extern EPPFLAGS bEPPflags;
30
31 code USB_DEVICE_DESCRIPTOR DeviceDescr =
32 {
33 sizeof(USB_DEVICE_DESCRIPTOR),
34 USB_DEVICE_DESCRIPTOR_TYPE,
35 SWAP(0x0100),
36 USB_CLASS_CODE_TEST_CLASS_DEVICE,
37 0,
38 0,
39 EP0_PACKET_SIZE,
40 //定义产品ID,在产品发布时有用
41 SWAP(0x0471), //VID
42 SWAP(0x0666), //PID
43 SWAP(0x0100),
44 0, //Manufactory
45 0, //Product
46 0, //Serial Number
47 25 //Number of possible configurations
48 };
49
50 code USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
51 {
52 sizeof(USB_CONFIGURATION_DESCRIPTOR),
53 USB_CONFIGURATION_DESCRIPTOR_TYPE,
54 SWAP(CONFIG_DESCRIPTOR_LENGTH),
55 1,
C51 COMPILER V7.09 CHAP9 03/30/2005 12:31:36 PAGE 2
56 1,
57 0,
58 0x80,
59 0x64
60 //0x1
61 };
62
63 code USB_INTERFACE_DESCRIPTOR InterfaceDescr =
64 {
65 sizeof(USB_INTERFACE_DESCRIPTOR),
66 USB_INTERFACE_DESCRIPTOR_TYPE,
67 0,
68 0,
69 NUM_ENDPOINTS,
70 USB_CLASS_CODE_TEST_CLASS_DEVICE,
71 USB_SUBCLASS_CODE_TEST_CLASS_D12,
72 USB_PROTOCOL_CODE_TEST_CLASS_D12,
73 0
74 };
75
76 code USB_ENDPOINT_DESCRIPTOR EP1_TXDescr =
77 {
78 sizeof(USB_ENDPOINT_DESCRIPTOR),
79 USB_ENDPOINT_DESCRIPTOR_TYPE,
80 0x81,
81 USB_ENDPOINT_TYPE_INTERRUPT,
82 SWAP(EP1_PACKET_SIZE),
83 10
84 };
85
86 code USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
87 {
88 sizeof(USB_ENDPOINT_DESCRIPTOR),
89 USB_ENDPOINT_DESCRIPTOR_TYPE,
90 0x1,
91 USB_ENDPOINT_TYPE_INTERRUPT,
92 SWAP(EP1_PACKET_SIZE),
93 10
94 };
95
96 code USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
97 {
98 sizeof(USB_ENDPOINT_DESCRIPTOR),
99 USB_ENDPOINT_DESCRIPTOR_TYPE,
100 0x82,
101 USB_ENDPOINT_TYPE_BULK,
102 SWAP(EP2_PACKET_SIZE),
103 10
104 };
105
106 code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
107 {
108 sizeof(USB_ENDPOINT_DESCRIPTOR),
109 USB_ENDPOINT_DESCRIPTOR_TYPE,
110 0x2,
111 USB_ENDPOINT_TYPE_BULK,
112 SWAP(EP2_PACKET_SIZE),
113 10
114 };
115
116 /*
117 //*************************************************************************
C51 COMPILER V7.09 CHAP9 03/30/2005 12:31:36 PAGE 3
118 // USB Protocol Layer
119 //*************************************************************************
120 */
121
122 void reserved(void)
123 {
124 1 stall_ep0();
125 1 }
126
127 /*
128 //*************************************************************************
129 // USB standard device requests
130 //*************************************************************************
131 */
132
133 void get_status(void)
134 {
135 1 unsigned char endp, txdat[2];
136 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
137 1 unsigned char c;
138 1
139 1 if (bRecipient == USB_RECIPIENT_DEVICE) {
140 2 if(bEPPflags.bits.remote_wakeup == 1)
141 2 txdat[0] = 3;
142 2 else
143 2 txdat[0] = 1;
144 2 txdat[1]=0;
145 2 single_transmit(txdat, 2);
146 2 } else if (bRecipient == USB_RECIPIENT_INTERFACE) {
147 2 txdat[0]=0;
148 2 txdat[1]=0;
149 2 single_transmit(txdat, 2);
150 2 } else if (bRecipient == USB_RECIPIENT_ENDPOINT) {
151 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
152 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
153 2 c = D12_SelectEndpoint(endp*2 + 1); /* Control-in */
154 2
155 2
156 2 else
157 2 c = D12_SelectEndpoint(endp*2); /* Control-out */
158 2 if(c & D12_STALL)
159 2 txdat[0] = 1;
160 2 else
161 2 txdat[0] = 0;
162 2 txdat[1] = 0;
163 2 single_transmit(txdat, 2);
164 2 } else
165 1 stall_ep0();
166 1 }
167
168 void clear_feature(void)
169 {
170 1 unsigned char endp;
171 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
172 1
173 1 if (bRecipient == USB_RECIPIENT_DEVICE
174 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
175 2 DISABLE;
176 2 bEPPflags.bits.remote_wakeup = 0;
177 2 ENABLE;
178 2 single_transmit(0, 0);
179 2 }
C51 COMPILER V7.09 CHAP9 03/30/2005 12:31:36 PAGE 4
180 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
181 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
182 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
183 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
184 2 // clear TX stall for IN on EPn.
185 2 D12_SetEndpointStatus(endp*2 + 1, 0);
186 2 else
187 2 // clear RX stall for OUT on EPn.
188 2 D12_SetEndpointStatus(endp*2, 0);
189 2 single_transmit(0, 0);
190 2 } else
191 1 stall_ep0();
192 1 }
193
194 void set_feature(void)
195 {
196 1 unsigned char endp;
197 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
198 1
199 1 if (bRecipient == USB_RECIPIENT_DEVICE
200 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
201 2 DISABLE;
202 2 bEPPflags.bits.remote_wakeup = 1;
203 2 ENABLE;
204 2 single_transmit(0, 0);
205 2 }
206 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
207 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
208 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
209 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
210 2 // clear TX stall for IN on EPn.
211 2 D12_SetEndpointStatus(endp*2 + 1, 1);
212 2 else
213 2 // clear RX stall for OUT on EPn.
214 2 D12_SetEndpointStatus(endp*2, 1);
215 2 single_transmit(0, 0);
216 2 } else
217 1 stall_ep0();
218 1 }
219
220 void set_address(void)
221 {
222 1 D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
223 1 DEVICE_ADDRESS_MASK), 1);
224 1 single_transmit(0, 0);
225 1 }
226
227 void get_descriptor(void)
228 {
229 1 unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
230 1
231 1 if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) {
232 2 code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
233 2 }
234 1 else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) {
235 2 code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
236 2 }
237 1 else
238 1 stall_ep0();
239 1 }
240
241 void get_configuration(void)
C51 COMPILER V7.09 CHAP9 03/30/2005 12:31:36 PAGE 5
242 {
243 1 unsigned char c = bEPPflags.bits.configuration;
244 1
245 1 single_transmit(&c, 1);
246 1 }
247
248 void set_configuration(void)
249 {
250 1 if (ControlData.DeviceRequest.wValue == 0) {
251 2 //* put device in unconfigured state
252 2 single_transmit(0, 0);
253 2 DISABLE;
254 2 bEPPflags.bits.configuration = 0;
255 2 ENABLE;
256 2 init_unconfig();
257 2 } else if (ControlData.DeviceRequest.wValue == 1) {
258 2 // Configure device
259 2 single_transmit(0, 0);
260 2
261 2 init_unconfig();
262 2 init_config();
263 2
264 2 DISABLE;
265 2 bEPPflags.bits.configuration = 1;
266 2 ENABLE;
267 2 } else
268 1 stall_ep0();
269 1 }
270
271 void get_interface(void)
272 {
273 1 unsigned char txdat = 0; // Only/Current interface = 0
274 1 single_transmit(&txdat, 1);
275 1 }
276
277 void set_interface(void)
278 {
279 1 if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
280 1 single_transmit(0, 0);
281 1 else
282 1 stall_ep0();
283 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 + -