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

📄 chap_9.lst

📁 PDIUSBD12的固件程序可能对开发USB1.1的兄弟有用
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   CHAP_9                                                                09/15/2008 18:19:55 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE CHAP_9
OBJECT MODULE PLACED IN Chap_9.OBJ
COMPILER INVOKED BY: E:\Program Files\C51\BIN\C51.EXE Chap_9.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          //协议层
   2          
   3          #include <reg52.h>
   4          #include "D12Config.h"
   5          #include "D12CI.h"
   6          #include "Chap_9.h"
   7          #include "Descriptor.h"
   8          
   9          CONTROL_XFER ControlData;
  10          EPPFLAGS bEPPflags;
  11          
  12          //USB标准设备请求入口地址指针表
  13          code void (*StandardDeviceRequest[])(void) =
  14          {
  15                  get_status,
  16                  clear_feature,
  17                  reserved,
  18                  set_feature,
  19                  reserved,
  20                  set_address,
  21                  get_descriptor,
  22                  reserved,
  23                  get_configuration,
  24                  set_configuration,
  25                  get_interface,
  26                  set_interface,
  27                  reserved,
  28                  reserved,
  29                  reserved,
  30                  reserved
  31          };
  32          
  33          // USB 协议层函数
  34          
  35          void stall_ep0(void)
  36          {
  37   1              D12_SetEndpointStatus(0, 1);
  38   1              D12_SetEndpointStatus(1, 1);
  39   1      }
  40             
  41          void reserved(void)
  42          {
  43   1              stall_ep0();                                                                                                                            //返回STALL
  44   1      }
  45          
  46          
  47          void init_unconfig(void)
  48          {
  49   1              D12_SetEndpointEnable(0);                                                                                                       //禁止0除外的所有端点
  50   1      }
  51          
  52          
  53          void init_config(void)
  54          {
  55   1              D12_SetEndpointEnable(1);
C51 COMPILER V7.06   CHAP_9                                                                09/15/2008 18:19:55 PAGE 2   

  56   1      }
  57          
  58          
  59          void single_transmit(INT8U * buf, INT8U len)
  60          {
  61   1              if( len <= EP0_PACKET_SIZE)
  62   1                      D12_WriteEndpoint(1, len, buf);
  63   1      }
  64          
  65          
  66          void code_transmit(INT8U *pRomData, INT16U len)
  67          {
  68   1              ControlData.wCount = 0;
  69   1              if(ControlData.wLength > len)
  70   1                      ControlData.wLength = len;
  71   1      
  72   1              ControlData.pData = pRomData;
  73   1              if( ControlData.wLength >= EP0_PACKET_SIZE)
  74   1          {
  75   2                      D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);
  76   2                      ControlData.wCount += EP0_PACKET_SIZE;
  77   2      
  78   2                      DISABLE();
  79   2                      bEPPflags.bits.control_state = USB_TRANSMIT;            
  80   2                      ENABLE();
  81   2              }
  82   1              else 
  83   1              {
  84   2                      D12_WriteEndpoint(1, ControlData.wLength, pRomData);
  85   2                      ControlData.wCount += ControlData.wLength;
  86   2                      DISABLE();
  87   2                      bEPPflags.bits.control_state = USB_IDLE;
  88   2                      ENABLE();
  89   2              }
  90   1      }
  91          
  92          
  93          // USB 标准设备请求服务程序
  94          
  95          void get_status(void)
  96          {
  97   1              INT8U endp, txdat[2], c;
  98   1              INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;     
  99   1      
 100   1              if (bRecipient == USB_RECIPIENT_DEVICE) 
 101   1              {
 102   2                      if(bEPPflags.bits.remote_wakeup == 1)                   
 103   2                              txdat[0] = 3;                                                                                                           //支持远程唤醒、自供电
 104   2                      else
 105   2                              txdat[0] = 1;
 106   2                      txdat[1]=0;     
 107   2                      single_transmit(txdat, 2);                                                                                              //发送16位的状态到主机
 108   2                      
 109   2              } 
 110   1              else if (bRecipient == USB_RECIPIENT_INTERFACE) 
 111   1              {       
 112   2                      txdat[0]=0;
 113   2                      txdat[1]=0;
 114   2                      single_transmit(txdat, 2);
 115   2              
 116   2              }
 117   1              else if (bRecipient == USB_RECIPIENT_ENDPOINT) 
C51 COMPILER V7.06   CHAP_9                                                                09/15/2008 18:19:55 PAGE 3   

 118   1              {
 119   2                      endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 120   2                      if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
 121   2                              c = D12_SelectEndpoint(endp*2 + 1);                                                                     //读取输入端点状态
 122   2                      else
 123   2                              c = D12_SelectEndpoint(endp*2);                                                                         //读取输出端点状态
 124   2                      if(c & D12_STALL)
 125   2                              txdat[0] = 1;                                                                                                           //端点禁止
 126   2                      else
 127   2                              txdat[0] = 0;                                                                                                           //端点有效
 128   2                      txdat[1] = 0;
 129   2                      single_transmit(txdat, 2);
 130   2      
 131   2              } 
 132   1              else
 133   1                      stall_ep0();                                                                                                                    //非标准请求,发STALL
 134   1      }
 135          
 136          
 137          void clear_feature(void)
 138          {
 139   1              INT8U endp;
 140   1              INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
 141   1      
 142   1              if (bRecipient == USB_RECIPIENT_DEVICE&&ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) 
 143   1              {
 144   2                      DISABLE();                                                                                                                              //清除远程唤醒特性      
 145   2                      bEPPflags.bits.remote_wakeup = 0;                                                                               //清0远程唤醒标志
 146   2                      ENABLE();
 147   2                      single_transmit(0, 0);                                                                                                  //返回一个空的数据表示执行完毕
 148   2              }
 149   1              
 150   1              else if (bRecipient == USB_RECIPIENT_ENDPOINT&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_
             -STALL)
 151   1              {               //清除端点禁止特性,恢复其使用
 152   2                      endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 153   2                      if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
 154   2                              D12_SetEndpointStatus(endp*2 + 1, 0);                                                           //清除控制输入端点STALL特性
 155   2                      else
 156   2                              D12_SetEndpointStatus(endp*2, 0);                                                                       //清除控制输出端点STALL特性
 157   2                      single_transmit(0, 0);
 158   2              } 
 159   1              else
 160   1                      stall_ep0();                                                                                                                    //没有该请求,返回STALL                                                  
 161   1      }
 162          
 163          
 164          void set_feature(void)
 165          {
 166   1              INT8U endp;
 167   1              INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;//读取请求类型中的接收方
 168   1      
 169   1              if (bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) 
 170   1              {//设置远程唤醒特性
 171   2                      DISABLE();
 172   2                      bEPPflags.bits.remote_wakeup = 1;                                                                               //置1远程唤醒标志
 173   2                      ENABLE();
 174   2                      single_transmit(0, 0);
 175   2              }       
 176   1              
 177   1              else if (bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT
             -_STALL) 
C51 COMPILER V7.06   CHAP_9                                                                09/15/2008 18:19:55 PAGE 4   

 178   1              {//禁止端点
 179   2                      endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 180   2                      if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
 181   2                              D12_SetEndpointStatus(endp*2 + 1, 1);                                                           //设置输入端点禁止
 182   2                      else
 183   2                              D12_SetEndpointStatus(endp*2, 1);                                                                       //设置输出端点禁止
 184   2                      single_transmit(0, 0);
 185   2              }
 186   1              else
 187   1                      stall_ep0();
 188   1      }
 189          
 190          
 191          void set_address(void)
 192          {
 193   1              D12_SetAddressEnable((INT8U)(ControlData.DeviceRequest.wValue &
 194   1                                                       DEVICE_ADDRESS_MASK), 1);
 195   1              single_transmit(0, 0);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -