⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap_9.lst

📁 周立功的LPC214x固件程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
  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 + -