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

📄 usbcore.c

📁 针对飞利浦LPC214x的虚拟串口程序
💻 C
📖 第 1 页 / 共 2 页
字号:
						USB_DeviceStatus |=  USB_GETSTATUS_SELF_POWERED;
					} else {
						USB_DeviceStatus &= ~USB_GETSTATUS_SELF_POWERED;
					}
				} else {
					(BYTE *)pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
					continue;
				}
				break;
			case USB_INTERFACE_DESCRIPTOR_TYPE:
				alt = ((USB_INTERFACE_DESCRIPTOR *)pD)->bAlternateSetting;
				break;
			case USB_ENDPOINT_DESCRIPTOR_TYPE:
				if (alt == 0) {
					n = ((USB_ENDPOINT_DESCRIPTOR *)pD)->bEndpointAddress & 0x8F;
					m = (n & 0x80) ? ((1 << 16) << n) : (1 << n);
					USB_EndPointMask |= m;
					USB_ConfigEP((USB_ENDPOINT_DESCRIPTOR *)pD);
					USB_EnableEP(n);
					USB_ResetEP(n);
				}
				break;
			}
			(BYTE *)pD += pD->bLength;
		}
	}
	else {
		USB_Configuration = 0;
		for (n = 1; n < 16; n++) {
			if (USB_EndPointMask & (1 << n)) {
				USB_DisableEP(n);
			}
			if (USB_EndPointMask & ((1 << 16) << n)) {
				USB_DisableEP(n | 0x80);
			}
		}
		USB_EndPointMask  = 0x00010001;
		USB_EndPointHalt  = 0x00000000;
		USB_Configure(FALSE);
	}
	
	if (USB_Configuration == SetupPacket.wValue.WB.L) {
		return (TRUE);
	} else {
		return (FALSE);
	}
}


/*
*  Set Interface USB Request
*    Parameters:      None (global SetupPacket)
*    Return Value:    TRUE - Success, FALSE - Error
*/

__inline BOOL USB_SetInterface (void) {
	USB_COMMON_DESCRIPTOR *pD;
	DWORD                  ifn, alt, old, msk, n, m;
	BOOL                   set;
	
	if (USB_Configuration == 0) return (FALSE);
	
	set = FALSE;
	pD  = (USB_COMMON_DESCRIPTOR *)USB_ConfigDescriptor;
	while (pD->bLength) {
		switch (pD->bDescriptorType) {
		case USB_CONFIGURATION_DESCRIPTOR_TYPE:
			if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bConfigurationValue != USB_Configuration) {
				(BYTE *)pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
				continue;
			}
			break;
		case USB_INTERFACE_DESCRIPTOR_TYPE:
			ifn = ((USB_INTERFACE_DESCRIPTOR *)pD)->bInterfaceNumber;
			alt = ((USB_INTERFACE_DESCRIPTOR *)pD)->bAlternateSetting;
			msk = 0;
			if ((ifn == SetupPacket.wIndex.WB.L) && (alt == SetupPacket.wValue.WB.L)) {
				set = TRUE;
				old = USB_AltSetting[ifn];
				USB_AltSetting[ifn] = (BYTE)alt;
			}
			break;
		case USB_ENDPOINT_DESCRIPTOR_TYPE:
			if (ifn == SetupPacket.wIndex.WB.L) {
				n = ((USB_ENDPOINT_DESCRIPTOR *)pD)->bEndpointAddress & 0x8F;
				m = (n & 0x80) ? ((1 << 16) << n) : (1 << n);
				if (alt == SetupPacket.wValue.WB.L) {
					USB_EndPointMask |=  m;
					USB_EndPointHalt &= ~m;
					USB_ConfigEP((USB_ENDPOINT_DESCRIPTOR *)pD);
					USB_EnableEP(n);
					USB_ResetEP(n);
					msk |= m;
				}
				else if ((alt == old) && ((msk & m) == 0)) {
					USB_EndPointMask &= ~m;
					USB_EndPointHalt &= ~m;
					USB_DisableEP(n);
				}
			}
			break;
		}
		(BYTE *)pD += pD->bLength;
	}
	return (set);
}


/*
*  USB Endpoint 0 Event Callback
*    Parameter:       event
*/

void USB_EndPoint0 (DWORD event) {
	
	BYTE UARTSettingCmd, UARTSettingData;
	
	switch (event) {
    case USB_EVT_SETUP:
		USB_SetupStage();
		USB_DirCtrlEP(SetupPacket.bmRequestType.BM.Dir);
		EP0Data.Count = SetupPacket.wLength;
		switch (SetupPacket.bmRequestType.BM.Type) {
			
        case REQUEST_STANDARD:
			switch (SetupPacket.bRequest) {
				
            case USB_REQUEST_GET_STATUS:
				if (!USB_GetStatus()) {
					goto stall_i;
				}
				break;
				
            case USB_REQUEST_CLEAR_FEATURE:
				if (!USB_SetClrFeature(0)) {
					goto stall_i;
				}
				USB_StatusInStage();
#if USB_FEATURE_EVENT
				USB_Feature_Event();
#endif
				break;              
				
            case USB_REQUEST_SET_FEATURE:
				if (!USB_SetClrFeature(1)) {
					goto stall_i;
				}
				USB_StatusInStage();
#if USB_FEATURE_EVENT
				USB_Feature_Event();
#endif
				break;              
				
            case USB_REQUEST_SET_ADDRESS:
				switch (SetupPacket.bmRequestType.BM.Recipient) {
                case REQUEST_TO_DEVICE:
					USB_DeviceAddress = 0x80 | SetupPacket.wValue.WB.L;
					USB_StatusInStage();
					break;
                default:
					goto stall_i;
				}
				break;
				
				case USB_REQUEST_GET_DESCRIPTOR:
					if (!USB_GetDescriptor()) {
						goto stall_i;
					}                  
					break;              
					
				case USB_REQUEST_SET_DESCRIPTOR:
					/*stall_o:*/  USB_SetStallEP(0x00);
					EP0Data.Count = 0;
					break;
					
				case USB_REQUEST_GET_CONFIGURATION:
					switch (SetupPacket.bmRequestType.BM.Recipient) {
					case REQUEST_TO_DEVICE:
						EP0Data.pData = &USB_Configuration;
						USB_DataInStage();
						break;
					default:
						goto stall_i;
					}
					break;
					
					case USB_REQUEST_SET_CONFIGURATION:
						switch (SetupPacket.bmRequestType.BM.Recipient) {
						case REQUEST_TO_DEVICE:
							if (!USB_SetConfiguration()) {
								goto stall_i;
							}
							USB_StatusInStage();
#if USB_CONFIGURE_EVENT
							USB_Configure_Event();
#endif
							break;
						default:
							goto stall_i;
						}
						break;              
						
						case USB_REQUEST_GET_INTERFACE:
							switch (SetupPacket.bmRequestType.BM.Recipient) {
							case REQUEST_TO_INTERFACE:
								if ((USB_Configuration != 0) && 
									(SetupPacket.wIndex.WB.L < USB_NumInterfaces)) {
									EP0Data.pData = USB_AltSetting + SetupPacket.wIndex.WB.L;
									USB_DataInStage();
								} else {
									goto stall_i;
								}
								break;
							default:
								goto stall_i;
							}
							break;              
							
							case USB_REQUEST_SET_INTERFACE:
								switch (SetupPacket.bmRequestType.BM.Recipient) {
								case REQUEST_TO_INTERFACE:
									if (!USB_SetInterface()) {
										goto stall_i;
									}
									USB_StatusInStage();
#if USB_INTERFACE_EVENT
									USB_Interface_Event();
#endif
									break;
								default:
									goto stall_i;
								}
								break;              
								
								default:
									goto stall_i;
									
          }
          break;
		  
        case REQUEST_CLASS:
#if USB_CLASS
			switch (SetupPacket.bmRequestType.BM.Recipient) {
            case REQUEST_TO_INTERFACE:
				//            break;              
            default:
				goto stall_i;
			}              
#else
			goto stall_i;
#endif  /* USB_CLASS */
			
			case REQUEST_VENDOR:
#if USB_VCOM
				UARTSettingCmd = SetupPacket.bRequest & 0xFF;
				UARTSettingData = SetupPacket.wValue.WB.L;
				if (!VCOM_SetSIOSetup( UARTSettingCmd, UARTSettingData )) {
					goto stall_i;
				}
				USB_DataInStage();
#endif      
				break;
				
			default:
stall_i:  USB_SetStallEP(0x80);
          EP0Data.Count = 0;
          break;
		  
      }
      break;
	  
    case USB_EVT_OUT:
		if (SetupPacket.bmRequestType.BM.Dir == 0) {
			if (EP0Data.Count) {
				USB_DataOutStage();
				if (EP0Data.Count == 0) {
					switch (*((WORD *)&SetupPacket)) {
					default:
						goto stall_i;
					}
					USB_StatusInStage();
				}
			}
		} else {
			USB_StatusOutStage();
		}
		break;
		
    case USB_EVT_IN:
		if (SetupPacket.bmRequestType.BM.Dir == 1) {
			if (EP0Data.Count) {
				USB_DataInStage();
			}
		} else {
			if (USB_DeviceAddress & 0x80) {
				USB_DeviceAddress &= 0x7F;
				USB_SetAddress(USB_DeviceAddress);
			}
		}
		break;
		
    case USB_EVT_IN_STALL:
		USB_ClrStallEP(0x80);
		break;
		
    case USB_EVT_OUT_STALL:
		USB_ClrStallEP(0x00);
		break;
		
  }
}

⌨️ 快捷键说明

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