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

📄 chap_9.lst

📁 嵌入式系统中一些外围设备驱动示例程序集
💻 LST
📖 第 1 页 / 共 5 页
字号:
 193   1              //高速状态
 194   1              if(USB_Int_Flag.BITS.HS_STAT)
 195   1              {
 196   2                      //清除高速状态标志
 197   2                      EA_DISABLE;
 198   2                      USB_Int_Flag.BITS.HS_STAT = 0;
 199   2                      EA_ENABLE;
 200   2                      if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
 201   2                      {
 202   3                              //切换高速指示
 203   3                              HS_FS_LED = HIGH_SPEED_LED;
 204   3                              //设置高速模式状态
 205   3                              Kernel_Flag.BITS.HS_FS_State = HIGH_SPEED;
 206   3                              //重新配置高速端点
 207   3                              Init_Endpoint();
 208   3      
 209   3      //                      PIO_Count = 64;
 210   3                              PIO_Count = 512;
 211   3                      }
 212   2              }
 213   1      }
 214          
 215          
 216          //***********************************************************************
 217          //*                                                                                                                                     *
 218          //*     Routine         :                                                               *
 219          //*     Input           : None                                                                                  *
 220          //*     Output          : None                                                                  *
 221          //*     Function        :                                                               *
 222          //*                                                                                                                                             *
 223          //***********************************************************************
 224          //建立包处理
 225          void USB_Setup(void)
 226          {
 227   1              unsigned char type, req;
 228   1      
 229   1              //清除EP0SETUP中断标志
 230   1              USB_Int_Flag.BITS.EP0SETUP = 0;   
 231   1              //清除总线复位标志
 232   1              Kernel_Flag.BITS.Bus_Reset = 0;
 233   1              //选择端点0SETUP缓冲区
 234   1              D14_Cntrl_Reg.D14_ENDPT_INDEX = 0x20;
 235   1              
 236   1              //读取USB请求
 237   1              //读取请求类型
 238   1              USB_Device_Request.bmRequestType =  D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 239   1              //读取请求号
 240   1              USB_Device_Request.bRequest = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 241   1              //读取16bit请求数据
C51 COMPILER V7.06   CHAP_9                                                                07/02/2003 10:27:50 PAGE 5   

 242   1              USB_Device_Request.wValue = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 243   1              USB_Device_Request.wValue <<= 8;
 244   1              USB_Device_Request.wValue |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 245   1              //读取16bit请求索引
 246   1              USB_Device_Request.wIndex = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 247   1              USB_Device_Request.wIndex <<= 8;
 248   1              USB_Device_Request.wIndex |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 249   1              //读取16bit长度
 250   1              USB_Device_Request.wLength = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 251   1              USB_Device_Request.wLength <<= 8;
 252   1              USB_Device_Request.wLength |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 253   1              
 254   1              //长度处理(高低8位对调)
 255   1              Temp = USB_Device_Request.wLength;
 256   1              USB_Device_Request.wLength = 0;
 257   1              USB_Device_Request.wLength = (UC) Temp;
 258   1              USB_Device_Request.wLength <<= 8;
 259   1              Temp >>= 8;
 260   1              USB_Device_Request.wLength |= Temp;
 261   1              
 262   1              type = USB_Device_Request.bmRequestType & 0x60;
 263   1              req = USB_Device_Request.bRequest & 0x0f;
 264   1      
 265   1              //厂商请求
 266   1              if (type == 0x40)
 267   1              {
 268   2                      Vendor_Specific_Command();//厂商请求处理
 269   2              }
 270   1              else if (type == 0x00)
 271   1                      (*StandardDeviceRequest[req])();//调用标准请求
 272   1      }
 273          
 274          //***********************************************************************
 275          //*                                                                                                                                     *
 276          //*     Routine         :                                                               *
 277          //*     Input           : None                                                                                  *
 278          //*     Output          : None                                                                  *
 279          //*     Function        :                                                               *
 280          //*                                                                                                                                             *
 281          //***********************************************************************
 282          //厂商请求处理
 283          void Vendor_Specific_Command(void)
 284          {
 285   1              if(USB_Device_Request.bRequest == 0x0C)
 286   1              {
 287   2                      switch (USB_Device_Request.wIndex)
 288   2                      {
 289   3                      case GET_FIRMWARE_VERSION  ://获取固件版本
 290   3                              if(USB_Device_Request.wLength == 1)
 291   3                              {
 292   4                                      //select endpoint
 293   4                                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
 294   4                                      //set the data length to 1 byte
 295   4                                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 1;
 296   4                                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
 297   4                                      //sent 0x21 as data
 298   4                                      D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x22;//版本号
 299   4                                      wait_ep0tx();
 300   4                                      ep0out_ack();
 301   4      //                              ep0in_ack();
 302   4                                      break;
 303   4                              }
C51 COMPILER V7.06   CHAP_9                                                                07/02/2003 10:27:50 PAGE 6   

 304   3                              
 305   3                      case SETUP_DMA_REQUEST :
 306   3                              //Out Token Ack detected
 307   3                              wait_ep0rx();
 308   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
 309   3                              //
 310   3                              FileSize.Size.Address[0] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 311   3                              FileSize.Size.Address[1] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 312   3                              FileSize.Size.Address[2] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 313   3                              //读取传输字节数
 314   3                              Temp = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 315   3                              bytecount = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 316   3                              bytecount <<= 8;
 317   3                              bytecount |= Temp;
 318   3                              //读取传输方式
 319   3                              FileSize.Size.DIR = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 320   3                              ep0in_ack();
 321   3                              Kernel_Flag.BITS.Transfer_Start = 1;//标志传输数据开始
 322   3                              break;
 323   3                              
 324   3                      default :
 325   3                              if(USB_Device_Request.bmRequestType == 0xC0)
 326   3                              {
 327   4                                      ep0in_ack();
 328   4                                      break;                          
 329   4                              }
 330   3                              if(USB_Device_Request.bmRequestType == 0x40)
 331   3                              {       
 332   4                                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
 333   4                                      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
 334   4                                      while(!USB_Int_Flag.BITS.EP0SETUP)
 335   4                                      {
 336   5                                              //读取ISP1581中断寄存器
 337   5                                              USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
 338   5                                              //回写ISP1581中断寄存器
 339   5                                              D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
 340   5                                              if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
 341   5                                                      return;
 342   5                                      }
 343   4                                      USB_Int_Flag.BITS.EP0TX = 0;
 344   4                                      break;                          
 345   4                              }
 346   3                      }
 347   2              }
 348   1      }
 349          
 350          //***********************************************************************
 351          //*                                                                                                                                     *
 352          //*     Routine         :                                                               *
 353          //*     Input           : None                                                                                  *
 354          //*     Output          : None                                                                  *
 355          //*     Function        :                                                               *
 356          //*                                                                                                                                             *
 357          //***********************************************************************
 358          
 359          void    reserved(void)
 360          {
 361   1      }
 362          
 363          
 364          //Get_Descriptor()获取描述符
 365          void get_descriptor(void)
C51 COMPILER V7.06   CHAP_9                                                                07/02/2003 10:27:50 PAGE 7   

 366          {
 367   1      
 368   1              switch(USB_Device_Request.wValue)
 369   1              {
 370   2              case  1://设备描述符
 371   2                      //选择描述符
 372   2                      if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
 373   2                              Descriptor_Ptr = &Standard_Device_Descriptor[0];        //set pointer to device descriptor
 374   2                      if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
 375   2                              Descriptor_Ptr = &HS_Device_Descriptor[0];      //set pointer to device descriptor
 376   2                      count = *Descriptor_Ptr;                                                        //read in descriptor length
 377   2                      //选择端点号
 378   2                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
 379   2                      //写下发送字节数
 380   2                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 0x12;
 381   2                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
 382   2                      //send descriptor
 383   2                      //发送描述符
 384   2                      while(count != 0)
 385   2                      {
 386   3                              D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
 387   3                              count--;
 388   3                              Descriptor_Ptr++;
 389   3                      }
 390   2                      wait_ep0tx();
 391   2                      ep0out_ack();
 392   2                      break;
 393   2                      

⌨️ 快捷键说明

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