📄 chap_9.lst
字号:
C51 COMPILER V8.02 CHAP_9 03/04/2008 13:50:51 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 "mytype.h"
2 #include "d12.h"
3 #include "D12CI.H"
4 #include "uart.h"
5 #define SWAP(x) ((((uint16)(x))<<8)|(((uint16)(x))>>8))
6 #define MSB(x) ((uint8)(((uint16)(x))>>8))
7 #define LSB(x) ((uint8)(x))
8 #define DISABLE EA=0
9 #define ENABLE EA=1
10 #define CONFIG_DESCRIPTOR_LENGTH sizeof(USB_CONFIGURATION_DESCRIPTOR) \
11 + sizeof(USB_INTERFACE_DESCRIPTOR) \
12 + (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR))
13 #define NUM_ENDPOINTS 4
14 extern CONTROL_XFER ControlData;
15 //extern IO_REQUEST idata ioRequest;
16 extern EPPFLAGS bEPPflags;
17 code USB_DEVICE_DESCRIPTOR DeviceDescr=
18 {
19 0x12,
20 0x01,
21 0x1001,
22 0xdc,
23 0,0,
24 0x10,
25 0x7104,
26 0x6606,
27 0x0010,
28 0,0,0,
29 1
30 };
31 code USB_CONFIGURATION_DESCRIPTOR ConfigDescr=
32 {
33 0x09,
34 0x02,
35 0x2e00,
36 1,
37 1,
38 0,
39 0xa0,
40 0x32
41 };
42 code USB_INTERFACE_DESCRIPTOR InterfaceDescr=
43 {
44 0x09,
45 0x04,
46 0,
47 0,
48 0x04,
49 0xdc,
50 0xa0,
51 0xb0,
52 0
53 };
54 code USB_ENDPOINT_DESCRIPTOR EP1_TXDescr=
55 {
C51 COMPILER V8.02 CHAP_9 03/04/2008 13:50:51 PAGE 2
56 0x07,
57 0x05,
58 0x81,
59 0x03,
60 0x1000,
61 10
62 };
63 code USB_ENDPOINT_DESCRIPTOR EP1_RXDescr=
64 {
65 0x07,
66 0x05,
67 0x1,
68 0x03,
69 0x1000,
70 10
71 };
72 code USB_ENDPOINT_DESCRIPTOR EP2_TXDescr=
73 {
74 0x07,
75 0x05,
76 0x82,
77 0x02,
78 0x4000,
79 10
80 };
81 code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr=
82 {
83 0x07,
84 0x05,
85 0x2,
86 0x02,
87 0x4000,
88 10
89 };
90 //从端点号1发送数据
91 void single_transmit(unsigned char * buf, unsigned char len)
92 {
93 1 if( len <= EP0_PACKET_SIZE)
94 1 {
95 2 D12_WriteEndpoint(1, len, buf);
96 2 }
97 1 }
98 //发送端点号1建立代码
99 void code_transmit(unsigned char code * pRomData, unsigned short len)
100 {
101 1 ControlData.wCount = 0;
102 1 if(ControlData.wLength > len)
103 1 ControlData.wLength = len;
104 1
105 1 ControlData.pData = pRomData;
106 1 if( ControlData.wLength >= EP0_PACKET_SIZE)
107 1 {
108 2 //write_endpoint_buff(1, EP0_PACKET_SIZE, ControlData.pData);
109 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);//发送16字节数据
110 2 ControlData.wCount += EP0_PACKET_SIZE;
111 2 DISABLE;
112 2 bEPPflags.bits.control_state = USB_TRANSMIT;
113 2 ENABLE;
114 2 }
115 1 else
116 1 {
117 2 D12_WriteEndpoint(1, ControlData.wLength, pRomData);//发送16字节内数据
C51 COMPILER V8.02 CHAP_9 03/04/2008 13:50:51 PAGE 3
118 2 ControlData.wCount += ControlData.wLength;
119 2 DISABLE;
120 2 bEPPflags.bits.control_state = USB_IDLE;
121 2 ENABLE;
122 2 }
123 1 }
124 void stall_ep0(void)
125 {
126 1 D12_SetEndpointStatus(0, 1);
127 1 D12_SetEndpointStatus(1, 1);
128 1 }
129 void reserved(void)
130 {
131 1 stall_ep0();
132 1 }
133
134 //获取设备状态
135 void get_status(void)
136 {
137 1 unsigned char endp, txdat[2];
138 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
139 1 unsigned char c;
140 1
141 1 if (bRecipient == USB_RECIPIENT_DEVICE) {
142 2 if(bEPPflags.bits.remote_wakeup == 1)//获取远程唤醒状态
143 2 txdat[0] = 3;
144 2 else
145 2 txdat[0] = 1;
146 2 txdat[1]=0;
147 2 single_transmit(txdat, 2);
148 2 } else if (bRecipient == USB_RECIPIENT_INTERFACE) {//获取接口状态
149 2 txdat[0]=0;
150 2 txdat[1]=0;
151 2 single_transmit(txdat, 2);
152 2 } else if (bRecipient == USB_RECIPIENT_ENDPOINT) {//获取端点状态
153 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
154 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
155 2 c = D12_SelectEndpoint(endp*2 + 1); /* Control-in */
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 void clear_feature(void)
168 {
169 1 unsigned char endp;
170 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
171 1
172 1 if (bRecipient == USB_RECIPIENT_DEVICE
173 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {//清除远程唤醒功能
174 2 EA=0;
175 2 bEPPflags.bits.remote_wakeup = 0;
176 2 EA=1;
177 2 single_transmit(0, 0);
178 2 }
179 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
C51 COMPILER V8.02 CHAP_9 03/04/2008 13:50:51 PAGE 4
180 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {//清除端点stall
181 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
182 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
183 2 /* clear TX stall for IN on EPn. */
184 2 D12_SetEndpointStatus(endp*2 + 1, 0);
185 2 else
186 2 /* clear RX stall for OUT on EPn. */
187 2 D12_SetEndpointStatus(endp*2, 0);
188 2 single_transmit(0, 0);
189 2 } else
190 1 stall_ep0();
191 1 }
192 //特性设置
193 void set_feature(void)
194 {
195 1 unsigned char endp;
196 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
197 1
198 1 if (bRecipient == USB_RECIPIENT_DEVICE
199 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {//设置远程唤醒功能
200 2 EA=0;
201 2 bEPPflags.bits.remote_wakeup = 1;
202 2 EA=1;
203 2 single_transmit(0, 0);
204 2 }
205 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
206 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {//设置端点stall
207 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
208 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
209 2 /* clear TX stall for IN on EPn. */
210 2 D12_SetEndpointStatus(endp*2 + 1, 1);
211 2 else
212 2 /* clear RX stall for OUT on EPn. */
213 2 D12_SetEndpointStatus(endp*2, 1);
214 2 single_transmit(0, 0);
215 2 } else
216 1 stall_ep0();
217 1 }
218 //设置地址
219 void set_address(void)
220 {
221 1 D12_SetAddress_Enable((unsigned char)(ControlData.DeviceRequest.wValue &
222 1 DEVICE_ADDRESS_MASK), 1);
223 1 single_transmit(0, 0);
224 1 }
225 //获取描述符
226 void get_descriptor(void)
227 {
228 1 unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
229 1
230 1 if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE)
231 1 {//获取设备描述符
232 2 code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
233 2 Prints("\r\n获取设备描述符");
234 2 }
235 1 else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)
236 1 {//获取配置描述符
237 2 code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
238 2 Prints("\r\n获取配置描述符");
239 2 }
240 1 else
241 1 stall_ep0();
C51 COMPILER V8.02 CHAP_9 03/04/2008 13:50:51 PAGE 5
242 1 }
243 //获取配置状态
244 void get_configuration(void)
245 {
246 1 unsigned char c = bEPPflags.bits.configuration;
247 1 single_transmit(&c, 1);
248 1 }
249 /****************************************************/
250 //恢复到未配置状态
251 void init_unconfig(void)
252 {
253 1 // unsigned char i;
254 1
255 1 D12_SetEndpointEnable(0); /* Disable all endpoints but EPP0. */
256 1 }
257 //设置配置状态
258 void init_config(void)
259 {
260 1 D12_SetEndpointEnable(1); /* Enable generic/iso endpoints. */
261 1 }
262 /******************************************/
263 //设置配置状态
264 void set_configuration(void)
265 {
266 1 if (ControlData.DeviceRequest.wValue == 0) {
267 2 //设备进入未配置状态
268 2 single_transmit(0, 0);
269 2 DISABLE;
270 2 bEPPflags.bits.configuration = 0;
271 2 ENABLE;
272 2 init_unconfig();
273 2 } else if (ControlData.DeviceRequest.wValue == 1) {
274 2 //配置设备
275 2 single_transmit(0, 0);
276 2
277 2 init_unconfig();
278 2 init_config();
279 2 DISABLE;
280 2 bEPPflags.bits.configuration = 1;
281 2 ENABLE;
282 2 } else
283 1 stall_ep0();
284 1 }
285 //获取接口状态
286 void get_interface(void)
287 {
288 1 unsigned char txdat = 0; /* Only/Current interface = 0 */
289 1 single_transmit(&txdat, 1);
290 1 }
291 //设置接口状态
292 void set_interface(void)
293 {
294 1 if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
295 1 single_transmit(0, 0);
296 1 else
297 1 stall_ep0();
298 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 618 ----
CONSTANT SIZE = 98 ----
C51 COMPILER V8.02 CHAP_9 03/04/2008 13:50:51 PAGE 6
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 14
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 + -