📄 chap_9.lst
字号:
235 1 unsigned char endp, txdat[2];
236 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
237 1 unsigned char c;
238 1
239 1 if (bRecipient == USB_RECIPIENT_DEVICE) {
240 2 if(bEPPflags.bits.remote_wakeup == 1)
241 2 txdat[0] = 3;//支持远程唤醒,自供电
C51 COMPILER V6.12 CHAP_9 12/16/2004 15:21:55 PAGE 5
242 2 else
243 2 txdat[0] = 1;//不支持远程唤醒,自供电
244 2 txdat[1]=0;
245 2 single_transmit(txdat, 2);
246 2 } else if (bRecipient == USB_RECIPIENT_INTERFACE) {
247 2 txdat[0]=0;
248 2 txdat[1]=0;
249 2 single_transmit(txdat, 2);
250 2 } else if (bRecipient == USB_RECIPIENT_ENDPOINT) {
251 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
252 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
253 2 c = D12_SelectEndpoint(endp*2 + 1); /* Control-in */
254 2 else
255 2 c = D12_SelectEndpoint(endp*2); /* Control-out */
256 2 if(c & D12_STALL)
257 2 txdat[0] = 1;
258 2 else
259 2 txdat[0] = 0;
260 2 txdat[1] = 0;
261 2 single_transmit(txdat, 2);
262 2 } else
263 1 stall_ep0();
264 1 }
265 //清除特性
266 void clear_feature(void)
267 {
268 1 unsigned char endp;
269 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
270 1
271 1 if (bRecipient == USB_RECIPIENT_DEVICE
272 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
273 2 DISABLE;
274 2 bEPPflags.bits.remote_wakeup = 0;
275 2 ENABLE;
276 2 single_transmit(0, 0);
277 2 }
278 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
279 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
280 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
281 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
282 2 /* clear TX stall for IN on EPn. */
283 2 D12_SetEndpointStatus(endp*2 + 1, 0);
284 2 else
285 2 /* clear RX stall for OUT on EPn. */
286 2 D12_SetEndpointStatus(endp*2, 0);
287 2 single_transmit(0, 0);
288 2 } else
289 1 stall_ep0();
290 1 }
291
292 //设置特性
293 void set_feature(void)
294 {
295 1 unsigned char endp;
296 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
297 1
298 1 if (bRecipient == USB_RECIPIENT_DEVICE
299 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
300 2 DISABLE;
301 2 bEPPflags.bits.remote_wakeup = 1;
302 2 ENABLE;
303 2 single_transmit(0, 0);
C51 COMPILER V6.12 CHAP_9 12/16/2004 15:21:55 PAGE 6
304 2 }
305 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT
306 1 && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
307 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
308 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
309 2 /* clear TX stall for IN on EPn. */
310 2 D12_SetEndpointStatus(endp*2 + 1, 1);
311 2 else
312 2 /* clear RX stall for OUT on EPn. */
313 2 D12_SetEndpointStatus(endp*2, 1);
314 2 single_transmit(0, 0);
315 2 } else
316 1 stall_ep0();
317 1 }
318
319 //设置地址
320 void set_address(void)
321 {
322 1 D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
323 1 DEVICE_ADDRESS_MASK), 1);
324 1 single_transmit(0, 0);
325 1 }
326
327 //获取描述符
328 void get_descriptor(void)
329 {
330 1 unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
331 1
332 1 if (bDescriptor == 0x01)//USB_DEVICE_DESCRIPTOR_TYPE)
333 1 {
334 2 code_transmit((unsigned char code *)&DeviceDescr, 18);//sizeof(USB_DEVICE_DESCRIPTOR));
335 2 }
336 1 else if (bDescriptor ==0x02)// USB_CONFIGURATION_DESCRIPTOR_TYPE)
337 1 {
338 2 if (ControlData.DeviceRequest.wLength>CONFIG_DESCRIPTOR_LENGTH)
339 2 ControlData.DeviceRequest.wLength=CONFIG_DESCRIPTOR_LENGTH;
340 2
341 2 code_transmit((unsigned char code *)&ConfigDescr, ControlData.DeviceRequest.wLength);
342 2 //code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
343 2 }
344 1 else
345 1 stall_ep0();
346 1 }
347
348 //获取配置
349 void get_configuration(void)
350 {
351 1 unsigned char c = bEPPflags.bits.configuration;
352 1
353 1 single_transmit(&c, 1);
354 1 }
355
356 //设置配置
357 void set_configuration(void)
358 {
359 1 if (ControlData.DeviceRequest.wValue == 0) {
360 2 /* put device in unconfigured state */
361 2 single_transmit(0, 0);
362 2 DISABLE;
363 2 bEPPflags.bits.configuration = 0;
364 2 ENABLE;
365 2 init_unconfig();
C51 COMPILER V6.12 CHAP_9 12/16/2004 15:21:55 PAGE 7
366 2 } else if (ControlData.DeviceRequest.wValue == 1) {
367 2 /* Configure device */
368 2 single_transmit(0, 0);
369 2
370 2 init_unconfig();
371 2 init_config();
372 2
373 2 DISABLE;
374 2 bEPPflags.bits.configuration = 1;
375 2 ENABLE;
376 2 } else
377 1 stall_ep0();
378 1 }
379
380 //获取接口信息
381 void get_interface(void)
382 {
383 1 unsigned char txdat = 0; /* Only/Current interface = 0 */
384 1 single_transmit(&txdat, 1);
385 1 }
386
387 //设置接口
388 void set_interface(void)
389 {
390 1 if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
391 1 single_transmit(0, 0);
392 1 else
393 1 stall_ep0();
394 1 }
395
396 /*
397 //获取固件版本号
398 void get_firmware_version()
399 {
400 unsigned char i;
401
402 i = 0x30; // firmware version number
403 single_transmit((unsigned char *)&i, 1);
404 }
405
406 //获取端点2缓冲区大小
407 void get_buffer_size()
408 {
409 unsigned char i[4];
410
411 i[0] = EP2_PACKET_SIZE;
412 i[1] = 0;
413 i[2] = 0;
414 i[3] = 0;
415 single_transmit((unsigned char *)&i, 4);
416 }
417
418 //厂商请求处理
419 void read_write_register(void)
420 {
421 // unsigned char i;
422
423 if(ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
424 if(ControlData.DeviceRequest.wIndex == GET_FIRMWARE_VERSION &&
425 ControlData.DeviceRequest.wValue == 0 &&
426 ControlData.DeviceRequest.wLength == 1)
427 get_firmware_version();
C51 COMPILER V6.12 CHAP_9 12/16/2004 15:21:55 PAGE 8
428 else if(ControlData.DeviceRequest.wIndex == GET_BUFFER_SIZE &&
429 ControlData.DeviceRequest.wValue == 0 &&
430 ControlData.DeviceRequest.wLength == 4)
431 get_buffer_size();
432 else
433 stall_ep0();
434
435 } // if read register
436 else{
437 if(ControlData.DeviceRequest.wIndex == SETUP_DMA_REQUEST &&
438 ControlData.DeviceRequest.wValue == 0 &&
439 ControlData.DeviceRequest.wLength == 6)
440 {
441 if(ControlData.dataBuffer[5]==0x81)
442 D12_WriteEndpoint(5, ControlData.dataBuffer[3], EpBuf);
443 single_transmit(0, 0);
444 }
445 else
446 stall_ep0();
447 } // if write register
448 }
449 */
450
451
452
453
454
455
C51 COMPILER V6.12 CHAP_9 12/16/2004 15:21:55 PAGE 9
NAME CLASS MSPACE TYPE OFFSET SIZE
==== ===== ====== ==== ====== ====
T0 . . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 00B4H 1
AC . . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 00D6H 1
T1 . . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 00B5H 1
EA . . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 00AFH 1
ULONG. . . . . . . . . . . . . . . . . TYPEDEF ----- U_LONG ----- 4
stall_ep0. . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
USB_STRING_DESCRIPTOR. . . . . . . . . TYPEDEF ----- STRUCT ----- 3
bLength. . . . . . . . . . . . . . . MEMBER ----- U_CHAR 0000H 1
bDescriptorType. . . . . . . . . . . MEMBER ----- U_CHAR 0001H 1
bString. . . . . . . . . . . . . . . MEMBER ----- ARRAY 0002H 1
InterfaceDescr . . . . . . . . . . . . PUBLIC CODE STRUCT 007BH 9
USB_CONFIGURATION_DESCRIPTOR . . . . . TYPEDEF ----- STRUCT ----- 9
bLength. . . . . . . . . . . . . . . MEMBER ----- U_CHAR 0000H 1
bDescriptorType. . . . . . . . . . . MEMBER ----- U_CHAR 0001H 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -