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

📄 chapter9.lst

📁 vC++读写HID_USB设备,包含hid_usb的固件程序和上位机程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 211   1      }
 212          
 213          
 214          /****************************************
 215          ** 函数名称: void clear_feature(void)
 216          ** 功能描述: 清除特性
 217          *****************************************/
 218          void clear_feature(void)
 219          {
 220   1              uint8 idata endp;                                                                                               //读取请求类型中的接收方
 221   1              uint8 idata bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;//读取请求类型
 222   1                                                                                                                              
 223   1              if (bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)/
             -/对设备请求
 224   1              {
 225   2                      bEPPflags.bits.remote_wakeup = 0;                                       //清0远程唤醒标志
 226   2                      single_transmit(0, 0);                                                          //返回一个空的数据表示执行完毕
 227   2              }
 228   1              else if(bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_
             -STALL)//对端点请求
 229   1              {
 230   2                      //清除端点禁止特性,恢复其使用
 231   2                      endp = (uint8)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 232   2                      if (ControlData.DeviceRequest.wIndex & (uint8)USB_ENDPOINT_DIRECTION_MASK)
 233   2                              D12_SetEndpointStatus(endp*2 + 1, 0);                   //清除控制输入端点STALL特性
 234   2                      else
 235   2                              D12_SetEndpointStatus(endp*2, 0);                               //清除控制输出端点STALL特性
 236   2                      single_transmit(0, 0);                                                          //返回一个空的数据表示执行完毕
 237   2              }
C51 COMPILER V7.50   CHAPTER9                                                              03/24/2008 11:06:13 PAGE 5   

 238   1              else
 239   1                      stall_ep0();                                    //没有该请求,返回STALL                                                  
 240   1      }
 241          
 242          
 243          /****************************************
 244          ** 函数名称: void set_feature(void)
 245          ** 功能描述: 设置特性
 246          *****************************************/
 247          void set_feature(void)
 248          {
 249   1              uint8 idata endp;                                                                                       //读取请求类型中的接收方
 250   1              uint8 idata bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;//读取请求类型
 251   1      
 252   1              if (bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)/
             -/对设备请求
 253   1              {
 254   2                      //设置远程唤醒特性
 255   2                      bEPPflags.bits.remote_wakeup = 1;                               //置1远程唤醒标志
 256   2                      single_transmit(0, 0);                                                  //返回一个空的数据表示执行完毕
 257   2              }       
 258   1              else if (bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT
             -_STALL) //对端点请求
 259   1              {
 260   2                      //禁止端点
 261   2                      endp = (uint8)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 262   2                      if (ControlData.DeviceRequest.wIndex & (uint8)USB_ENDPOINT_DIRECTION_MASK)
 263   2                              D12_SetEndpointStatus(endp*2 + 1, 1);           //设置输入端点禁止
 264   2                      else
 265   2                              D12_SetEndpointStatus(endp*2, 1);                       //设置输出端点禁止
 266   2                      single_transmit(0, 0);                                                  //返回一个空的数据表示执行完毕
 267   2              } 
 268   1              else
 269   1                      stall_ep0();                                    //没有该请求,返回STALL
 270   1      }
 271          
 272          
 273          /****************************************
 274          ** 函数名称: void set_address(void)
 275          ** 功能描述: 设置地址
 276          *****************************************/
 277          void set_address(void)
 278          {
 279   1              D12_SetAddressEnable((uint8)(ControlData.DeviceRequest.wValue & DEVICE_ADDRESS_MASK), 1);
 280   1              single_transmit(0, 0);                          //发送一个空的数据响应
 281   1      }
 282          
 283          
 284          /****************************************
 285          ** 函数名称: void get_descriptor(void)
 286          ** 功能描述: 获取描述符
 287          *****************************************/
 288          void get_descriptor(void)
 289          {
 290   1              uint8 idata bDescriptor = MSB(ControlData.DeviceRequest.wValue);                        //读取请求的描述符类型
 291   1              uint8 idata bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
 292   1      #ifdef debug
                      PutString0("Get usb descriptors.......\r\n",50);
              #endif
 295   1              if(bRecipient == USB_RECIPIENT_DEVICE)
 296   1              {
 297   2                      if (bDescriptor == USB_DEVICE_DESCRIPTOR)//获取设备描述符
C51 COMPILER V7.50   CHAPTER9                                                              03/24/2008 11:06:13 PAGE 6   

 298   2                      {                                               
 299   3                      #ifdef debug
                                      PutString0("    Get usb device descriptor....\r\n",50);
                              #endif  
 302   3                              code_transmit((uint8 *)&device_descriptor, sizeof(DEVICE_DESCRIPTOR_STRUCT));
 303   3                      }
 304   2                      else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR) //获取其它描述符
 305   2                      {               
 306   3                              if (ControlData.DeviceRequest.wLength > SWAP16(usb_descriptor.configuration_descriptor.wTotalLength))
 307   3                              { 
 308   4                                      ControlData.DeviceRequest.wLength = SWAP16(usb_descriptor.configuration_descriptor.wTotalLength);
 309   4                              }
 310   3                      #ifdef debug
                                      PutString0("    Get usb config&interface&HID&endpoints descriptor....\r\n",100);
                              #endif
 313   3                              code_transmit((uint8 *)&(usb_descriptor), ControlData.DeviceRequest.wLength);//发送描述符内容
 314   3                      }
 315   2                      else if(bDescriptor == USB_STRING_DESCRIPTOR)   //字符串描述符
 316   2                      {
 317   3                      #ifdef debug
                                      PutString0("    Get usb string descriptor.....\r\n",50);
                              #endif
 320   3                              switch(LSB(ControlData.DeviceRequest.wValue))
 321   3                              {
 322   4                              case 0:
 323   4                                      //获取语言ID
 324   4                              #ifdef debug
                                              PutString0("            Get language ID....\r\n",50);
                                      #endif
 327   4                                      if(ControlData.DeviceRequest.wLength > LANGUAGE_ID[0])
 328   4                                              ControlData.DeviceRequest.wLength = LANGUAGE_ID[0];
 329   4                                      code_transmit((uint8 *)LANGUAGE_ID, ControlData.DeviceRequest.wLength);
 330   4                                      break;
 331   4      
 332   4                              case 1:
 333   4                                      //获取厂商字符串
 334   4                              #ifdef debug
                                              PutString0("            Get manufaceture String descriptor....\r\n",50);
                                      #endif
 337   4                                      if(ControlData.DeviceRequest.wLength > ManufacturerString[0])
 338   4                                              ControlData.DeviceRequest.wLength = ManufacturerString[0];
 339   4                                      code_transmit((uint8 *)ManufacturerString, ControlData.DeviceRequest.wLength);
 340   4                                      break;
 341   4      
 342   4                              case 2:
 343   4                                      //获取产品字符串
 344   4                              #ifdef debug
                                              PutString0("            Get Product String descriptor....\r\n",50);
                                      #endif
 347   4                                      if(ControlData.DeviceRequest.wLength > ProducterString[0])
 348   4                                              ControlData.DeviceRequest.wLength = ProducterString[0];
 349   4                                      code_transmit((uint8 *)ProducterString, ControlData.DeviceRequest.wLength);
 350   4                                      break;
 351   4      
 352   4                              case 3:
 353   4                                      //获取设备序列号
 354   4                              #ifdef debug
                                              PutString0("            Get device serial number String descriptor....\r\n",50);
                                      #endif
 357   4                                      if(ControlData.DeviceRequest.wLength > device_serial_number[0])
 358   4                                              ControlData.DeviceRequest.wLength = device_serial_number[0];
 359   4                                      code_transmit((uint8 *)device_serial_number, ControlData.DeviceRequest.wLength);
C51 COMPILER V7.50   CHAPTER9                                                              03/24/2008 11:06:13 PAGE 7   

 360   4                                      break;
 361   4      
 362   4                              default:
 363   4                                      break;
 364   4                              }
 365   3                      }
 366   2                      else
 367   2                              stall_ep0();                                    //没有该请求,返回STALL
 368   2              }
 369   1              else if(bRecipient == USB_RECIPIENT_INTERFACE)  //接口接收
 370   1              {
 371   2                      switch(MSB(ControlData.DeviceRequest.wValue))
 372   2                      {
 373   3                      case USB_HID_DESCRIPTOR:
 374   3                              #ifdef debug
                                              PutString0("    Get USB HID descriptor....\r\n",50);
                                      #endif
 377   3                              if(ControlData.DeviceRequest.wLength > sizeof(HID_DESCRIPTOR_STRUCT))
 378   3                                      ControlData.DeviceRequest.wLength = sizeof(HID_DESCRIPTOR_STRUCT);
 379   3                              code_transmit((uint8 *)&(usb_descriptor.hid_descriptor),sizeof(HID_DESCRIPTOR_STRUCT));
 380   3                      break;
 381   3                      case USB_REPORT_DESCRIPTOR:
 382   3                              #ifdef debug
                                              PutString0("    Get USB report descriptor....\r\n",50);
                                      #endif
 385   3                              if(ControlData.DeviceRequest.wLength > sizeof(HidUseReportDescriptor))
 386   3                                      ControlData.DeviceRequest.wLength = sizeof(HidUseReportDescriptor);
 387   3                              code_transmit((uint8 *)HidUseReportDescriptor,sizeof(HidUseReportDescriptor));
 388   3                      break;
 389   3                              case USB_PHYSICAL_DESCRIPTOR:
 390   3                              #ifdef debug
                                              PutString0("    Get USB physical descriptor....\r\n",50);
                                      #endif
 393   3                              break;
 394   3                              default:
 395   3                              break;
 396   3                      }       
 397   2              }
 398   1              else if(bRecipient == USB_RECIPIENT_ENDPOINT)
 399   1              {
 400   2                      //do nothing;
 401   2              }
 402   1      }
 403          
 404          
 405          /****************************************
 406          ** 函数名称: void get_configuration(void)
 407          ** 功能描述: 获取配置
 408          *****************************************/
 409          void get_configuration(void)
 410          {
 411   1              uint8 idata c = bEPPflags.bits.configuration;   //取出配置值
 412   1              single_transmit(&c, 1);                         //发送配置值
 413   1      }
 414          
 415          /****************************************
 416          ** 函数名称: void set_configuration(void)
 417          ** 功能描述: 设置配置
 418          *****************************************/
 419          void set_configuration(void)
 420          {
 421   1              if (ControlData.DeviceRequest.wValue == 0) //配置值不对,设备进入未配置状态
C51 COMPILER V7.50   CHAPTER9                                                              03/24/2008 11:06:13 PAGE 8   

 422   1              {                       
 423   2                      single_transmit(0, 0);                                                          //发向一个空包响应
 424   2                      bEPPflags.bits.configuration = 0;                                       //标记未配置
 425   2                      init_unconfig();                                                                        //进入地址状态,禁止0除外的所有端点

⌨️ 快捷键说明

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