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

📄 chap_9.lst

📁 USB 源码 ISP1581 Device controller
💻 LST
📖 第 1 页 / 共 5 页
字号:
 188   1              
 189   1              //挂起处理
 190   1              if(USB_Int_Flag.BITS.SUSP)
 191   1              {               
 192   2                      //清除挂起标志
 193   2                      EA_DISABLE;
 194   2                      USB_Int_Flag.BITS.SUSP = 0;
 195   2                      EA_ENABLE;
 196   2                      //ISP1581进入挂起状态           
 197   2                      D14_Cntrl_Reg.D14_MODE.BITS.GOSUSP = 1;
 198   2                      D14_Cntrl_Reg.D14_MODE.BITS.GOSUSP = 0;
 199   2              }
 200   1              
 201   1              //挂起恢复处理
 202   1              if(USB_Int_Flag.BITS.RESUME)
 203   1              {
 204   2                      //清除恢复标志
 205   2                      EA_DISABLE;
 206   2                      USB_Int_Flag.BITS.RESUME = 0;         
 207   2                      EA_ENABLE;
 208   2                      //产生一个恢复信号
 209   2                      D14_Cntrl_Reg.D14_MODE.BITS.SNDRSU = 1;
 210   2                      D14_Cntrl_Reg.D14_MODE.BITS.SNDRSU = 0;
 211   2              }
 212   1              
 213   1              //高速状态
 214   1              if(USB_Int_Flag.BITS.HS_STAT)
 215   1              {
 216   2                      //清除高速状态标志
 217   2                      EA_DISABLE;
 218   2                      USB_Int_Flag.BITS.HS_STAT = 0;
 219   2                      EA_ENABLE;
 220   2                      if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
 221   2                      {
 222   3                              //切换高速指示
 223   3                              HS_FS_LED = HIGH_SPEED_LED;
 224   3                              //设置高速模式状态
 225   3                              Kernel_Flag.BITS.HS_FS_State = HIGH_SPEED;
 226   3                              //重新配置高速端点
 227   3                              Init_Endpoint();
 228   3      
 229   3      //                      PIO_Count = 64;
 230   3                              PIO_Count = 512;
 231   3                      }
 232   2              }
 233   1      }
 234          
 235          
 236          //***********************************************************************
 237          //*                                                                                                                                     *
 238          //*     Routine         :                                                               *
 239          //*     Input           : None                                                                                  *
 240          //*     Output          : None                                                                  *
 241          //*     Function        :                                                               *
C51 COMPILER V7.01  CHAP_9                                                                 03/28/2003 14:38:29 PAGE 5   

 242          //*                                                                                                                                             *
 243          //***********************************************************************
 244          //建立包处理
 245          void USB_Setup(void)
 246          {
 247   1              unsigned char type, req;
 248   1      
 249   1              //清除EP0SETUP中断标志
 250   1              USB_Int_Flag.BITS.EP0SETUP = 0;   
 251   1              //清除总线复位标志
 252   1              Kernel_Flag.BITS.Bus_Reset = 0;
 253   1              //选择端点0SETUP缓冲区
 254   1              D14_Cntrl_Reg.D14_ENDPT_INDEX = 0x20;
 255   1              
 256   1              //读取USB请求
 257   1              //读取请求类型
 258   1              USB_Device_Request.bmRequestType =  D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 259   1              //读取请求号
 260   1              USB_Device_Request.bRequest = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 261   1              //读取16bit请求数据
 262   1              USB_Device_Request.wValue = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 263   1              USB_Device_Request.wValue <<= 8;
 264   1              USB_Device_Request.wValue |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 265   1              //读取16bit请求索引
 266   1              USB_Device_Request.wIndex = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 267   1              USB_Device_Request.wIndex <<= 8;
 268   1              USB_Device_Request.wIndex |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 269   1              //读取16bit长度
 270   1              USB_Device_Request.wLength = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 271   1              USB_Device_Request.wLength <<= 8;
 272   1              USB_Device_Request.wLength |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 273   1              
 274   1              //长度处理(高低8位对调)
 275   1              Temp = USB_Device_Request.wLength;
 276   1              USB_Device_Request.wLength = 0;
 277   1              USB_Device_Request.wLength = (UC) Temp;
 278   1              USB_Device_Request.wLength <<= 8;
 279   1              Temp >>= 8;
 280   1              USB_Device_Request.wLength |= Temp;
 281   1              
 282   1              type = USB_Device_Request.bmRequestType & 0x60;
 283   1              req = USB_Device_Request.bRequest & 0x0f;
 284   1      
 285   1              //厂商请求
 286   1              if (type == 0x40)
 287   1              {
 288   2                      Vendor_Specific_Command();//厂商请求处理
 289   2              }
 290   1              else if (type == 0x00)
 291   1                      (*StandardDeviceRequest[req])();//调用标准请求
 292   1      }
 293          
 294          //***********************************************************************
 295          //*                                                                                                                                     *
 296          //*     Routine         :                                                               *
 297          //*     Input           : None                                                                                  *
 298          //*     Output          : None                                                                  *
 299          //*     Function        :                                                               *
 300          //*                                                                                                                                             *
 301          //***********************************************************************
 302          //厂商请求处理
 303          void Vendor_Specific_Command(void)
C51 COMPILER V7.01  CHAP_9                                                                 03/28/2003 14:38:29 PAGE 6   

 304          {
 305   1              if(USB_Device_Request.bRequest == 0x0C)
 306   1              {
 307   2                      switch (USB_Device_Request.wIndex)
 308   2                      {
 309   3                      case GET_FIRMWARE_VERSION  ://获取固件版本
 310   3                              if(USB_Device_Request.wLength == 1)
 311   3                              {
 312   4                                      //select endpoint
 313   4                                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
 314   4                                      //set the data length to 1 byte
 315   4                                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 1;
 316   4                                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
 317   4                                      //sent 0x21 as data
 318   4                                      D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x21;//版本号
 319   4                                      wait_ep0tx();
 320   4                                      ep0out_ack();
 321   4      //                              ep0in_ack();
 322   4                                      break;
 323   4                              }
 324   3                              
 325   3                      case SETUP_DMA_REQUEST :
 326   3                              //Out Token Ack detected
 327   3                              wait_ep0rx();
 328   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
 329   3                              //
 330   3                              FileSize.Size.Address[0] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 331   3                              FileSize.Size.Address[1] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 332   3                              FileSize.Size.Address[2] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 333   3                              //读取传输字节数
 334   3                              Temp = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 335   3                              bytecount = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 336   3                              bytecount <<= 8;
 337   3                              bytecount |= Temp;
 338   3                              //读取传输方式
 339   3                              FileSize.Size.DIR = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 340   3                              ep0in_ack();
 341   3                              Kernel_Flag.BITS.Transfer_Start = 1;//标志传输数据开始
 342   3                              break;
 343   3                              
 344   3                      default :
 345   3                              if(USB_Device_Request.bmRequestType == 0xC0)
 346   3                              {
 347   4                                      ep0in_ack();
 348   4                                      break;                          
 349   4                              }
 350   3                              if(USB_Device_Request.bmRequestType == 0x40)
 351   3                              {       
 352   4                                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
 353   4                                      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
 354   4                                      while(!USB_Int_Flag.BITS.EP0SETUP)
 355   4                                      {
 356   5                                              //读取ISP1581中断寄存器
 357   5                                              USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
 358   5                                              //回写ISP1581中断寄存器
 359   5                                              D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
 360   5                                              if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
 361   5                                                      return;
 362   5                                      }
 363   4                                      USB_Int_Flag.BITS.EP0TX = 0;
 364   4                                      break;                          
 365   4                              }
C51 COMPILER V7.01  CHAP_9                                                                 03/28/2003 14:38:29 PAGE 7   

 366   3                      }
 367   2              }
 368   1      }
 369          
 370          //***********************************************************************
 371          //*                                                                                                                                     *
 372          //*     Routine         :                                                               *
 373          //*     Input           : None                                                                                  *
 374          //*     Output          : None                                                                  *
 375          //*     Function        :                                                               *
 376          //*                                                                                                                                             *
 377          //***********************************************************************
 378          
 379          void    reserved(void)
 380          {
 381   1      }
 382          
 383          

⌨️ 快捷键说明

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