📄 chap_9.lst
字号:
395 1
396 1 type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
397 1 /* 读请求类型码 read request type code */
398 1 req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
399 1 if (type == USB_STANDARD_REQUEST)
400 1 (*StandardDeviceRequest[req])(); /* 标准请求 standard request */
401 1 //else if (type == USB_VENDOR_REQUEST) /* 厂商请求 vendor request */
402 1 // (*VendorDeviceRequest[req])();
403 1 //else if(type == USB_CLASS_REQUEST)
404 1 // (*ClassDeviceRequest[req])(); /* 类请求 class request */
405 1 else
406 1 stall_ep0(); /* 没有要求的描述符,禁止逻辑端点0 no the request, stall logical endpoint 0 */
407 1 }
408
409
410 /********************************************************************************************************
-*******
411 ** 函数名称: ep0_rxdone() Name : ep0_rxdone()
412 ** 功能描述: 通过端点索引 0 接收数据 Function : receive data by logic endpoint 0
413 *********************************************************************************************************
-*******/
414 void ep0_rxdone(void)
415 {
416 1 INT8U ep_last, i;
417 1 INT8U req[sizeof(DEVICE_REQUEST)];
418 1
419 1 ep_last = USB_SelectClrIntEndpoint(0); /* 清除该端点的中断 clear the interrupt of the endpoint */
420 1
421 1 if (ep_last & USB_SETUPPACKET)
422 1 { //接收到了建立包 /* 接收到SETUP包 if receive SETUP packet */
423 2 ControlData.wLength = 0;
424 2 ControlData.wCount = 0;
425 2 if(USB_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),req)
426 2 != sizeof(DEVICE_REQUEST)) /* 从端点 0 读取数据 read data from endpoint 0 */
427 2 { //接收建立包出错
428 3 USB_SetEndpointStatus(0, 1); /* 禁止控制端点0 stall control endpoint 0 */
ARM COMPILER V2.53, Chap_9 28/06/07 09:54:11 PAGE 8
429 3 USB_SetEndpointStatus(1, 1); /* 禁止控制端点1 stall control endpoint 1 */
430 3 bEPPflags.bits.control_state = USB_IDLE; /* 标识空闲状态 flag Idle status */
431 3 return;
432 3 }
433 2 //接收建立包成功
434 2 /****** receive SETUP packet sucessfully 接收 SETUP 包成功 ******/
435 2 ControlData.DeviceRequest.bmRequestType = req[0];
436 2 ControlData.DeviceRequest.bRequest = req[1];
437 2 ControlData.DeviceRequest.wValue = req[3] * 256 + req[2];
438 2 ControlData.DeviceRequest.wIndex = req[5] * 256 + req[4];
439 2 ControlData.DeviceRequest.wLength = req[7] * 256 + req[6];
440 2 ControlData.wLength = ControlData.DeviceRequest.wLength;
441 2
442 2 if (ControlData.DeviceRequest.bmRequestType & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
443 2 { /* 如果为控制读 if it is control read */
444 3 bEPPflags.bits.setup_packet = 1; /* 通知contorl_handler()处理SETUP包 inform control_handler() t
-o process SETUP packet */
445 3 bEPPflags.bits.control_state = USB_TRANSMIT;
446 3 //接收到的建立包要求进行“控制读取”,bEPPflags.bits.control_state为发送状态,
447 3 //等到再次发生控制端点发送数据中断时,通过ep0_txdone( )将数据发送到USB主机
448 3 }
449 2 else
450 2 { /* 如果为控制写 if it is control write */
451 3 if (ControlData.DeviceRequest.wLength == 0)
452 3 { //接受到的建立包为“无数据控制”
453 4 bEPPflags.bits.setup_packet = 1; /* 通知contorl_handler()处理SETUP包 inform control_handler() t
-o process SETUP packet */
454 4 bEPPflags.bits.control_state = USB_IDLE;
455 4 }
456 3 else
457 3 { //接受到的建立包为“控制写入”(有数据控制写入)
458 4 //主机告诉设备,将有数据包发送到设备。
459 4 //该函数先判断即将接收的数据长度是否正确,如果正确,才将bEPPflags.bits.control_state设为接收状态(U
-SB_RECEIVE)
460 4 if (ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE)
461 4 { /* data length is error */
462 5 bEPPflags.bits.control_state = USB_IDLE;
463 5 USB_SetEndpointStatus(0, 1); /* 禁止控制端点0 stall control endpoint 0 */
464 5 USB_SetEndpointStatus(1, 1); /* 禁止控制端点1 stall control endpoint 1 */
465 5 }
466 4 else
467 4 bEPPflags.bits.control_state = USB_RECEIVE; /* 标识接收状态 flag receive status */
468 4 // bEPPflags.bits.control_state状态设为USB_RECEIVE后,
469 4 // 等到再次发生控制端点接收数据中断时,ep0_rxdone( )进入控制接收(控制写入)数据阶段
470 4 } // set command with data
471 3 } // else set command
472 2 } // if setup packet
473 1
474 1 /****** control receive data phase 下面为控制接收(控制写入)数据阶段 *******/
475 1 else if (bEPPflags.bits.control_state == USB_RECEIVE)
476 1 { /* 如果当前为接收状态 if it is receive status */
477 2 i = USB_ReadEndpoint(0, EP0_PACKET_SIZE,
478 2 ControlData.dataBuffer + ControlData.wCount); /* 从端点 0 读取数据 read from endpoint 0 */
479 2
480 2 ControlData.wCount += i;
481 2 if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength)
482 2 { /* 完成接收数据 finish receiving data */
483 3 bEPPflags.bits.setup_packet = 1; /* 通知contorl_handler()处理SETUP包 inform control_handler(
-) to process SETUP packet */
484 3 bEPPflags.bits.control_state = USB_IDLE;
485 3 }
486 2 }
487 1 else
488 1 bEPPflags.bits.control_state = USB_IDLE;
489 1 }
490
ARM COMPILER V2.53, Chap_9 28/06/07 09:54:11 PAGE 9
491
492 /********************************************************************************************************
-*******
493 ** 函数名称: ep0_txdone() Name : ep0_txdone()
494 ** 功能描述: 通过物理端点 0 发送数据 Function : tranmit data by physical endpoint 1
495 *********************************************************************************************************
-*******/
496 void ep0_txdone(void)
497 {
498 1 INT16 i = ControlData.wLength - ControlData.wCount;
499 1
500 1 USB_SelectClrIntEndpoint(1); /* 清除端点中断标志 clear the endpoint interrupt flag bit */
501 1
502 1 if (bEPPflags.bits.control_state != USB_TRANSMIT)
503 1 { /* 非发送状态 not transmit status */
504 2 single_transmit(0, 0);
505 2 return; /* 直接返回 return */
506 2 }
507 1
508 1 if( i >= EP0_PACKET_SIZE)
509 1 { /* 未发送字节数大于64 the byte length is above 64 */
510 2 USB_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
511 2 ControlData.wCount += EP0_PACKET_SIZE;
512 2 bEPPflags.bits.control_state = USB_TRANSMIT;
513 2 }
514 1 else if( i != 0)
515 1 { /* 发送所有未发送的字节 send all bytes */
516 2 USB_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
517 2 ControlData.wCount += i;
518 2 bEPPflags.bits.control_state = USB_IDLE; /* 置状态为等待状态 set Idle status */
519 2 }
520 1 else if (i == 0)
521 1 {
522 2 USB_WriteEndpoint(1, 0, 0); /* 完成发送,再发送一个空包 finish transmitting, send an empty packe
-t */
523 2 bEPPflags.bits.control_state = USB_IDLE;
524 2 }
525 1
526 1 }
527
528 /*******************************************************************************************************
529 ** End Of File
530 ********************************************************************************************************/
ARM COMPILER V2.53, Chap_9 28/06/07 09:54:11 PAGE 10
ASSEMBLY LISTING OF GENERATED OBJECT CODE
*** EXTERNALS:
EXTERN CODE16 (DISABLE?T)
EXTERN CODE16 (ENABLE?T)
EXTERN CODE16 (USB_SetAddressEnable?T)
EXTERN CODE16 (USB_SetEndpointEnable?T)
EXTERN CODE16 (USB_SelectEndpoint?T)
EXTERN CODE16 (USB_SelectClrIntEndpoint?T)
EXTERN CODE16 (USB_SetEndpointStatus?T)
EXTERN CODE16 (USB_ReadEndpoint?T)
EXTERN CODE16 (USB_WriteEndpoint?T)
EXTERN DATA (bEPPflags)
EXTERN DATA (DeviceDescr)
EXTERN DATA (usb_descr)
EXTERN CODE16 (?C?ICALL0?T)
*** PUBLICS:
PUBLIC get_status?T
PUBLIC clear_feature?T
PUBLIC set_feature?T
PUBLIC set_address?T
PUBLIC get_descriptor?T
PUBLIC get_configuration?T
PUBLIC set_configuration?T
PUBLIC get_interface?T
PUBLIC set_interface?T
PUBLIC reserved?T
PUBLIC stall_ep0?T
PUBLIC ep0_txdone?T
PUBLIC ep0_rxdone?T
PUBLIC init_unconfig?T
PUBLIC init_config?T
PUBLIC single_transmit?T
PUBLIC code_transmit?T
PUBLIC control_handler?T
PUBLIC ControlData
PUBLIC StandardDeviceRequest
*** DATA SEGMENT '?DT0?Chap_9':
00000000 ControlData:
00000000 DS 80
00000050 StandardDeviceRequest:
00000050 BEGIN_INIT
00000050 00000000 DD get_status?T
00000054 00000000 DD clear_feature?T
00000058 00000000 DD reserved?T
0000005C 00000000 DD set_feature?T
00000060 00000000 DD reserved?T
00000064 00000000 DD set_address?T
00000068 00000000 DD get_descriptor?T
0000006C 00000000 DD reserved?T
00000070 00000000 DD get_configuration?T
00000074 00000000 DD set_configuration?T
00000078 00000000 DD get_interface?T
0000007C 00000000 DD set_interface?T
00000080 00000000 DD reserved?T
00000084 00000000 DD reserved?T
00000088 00000000 DD reserved?T
0000008C 00000000 DD reserved?T
00000090 END_INIT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -