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

📄 usb.c

📁 44b0板上的usb固件及上位机程序
💻 C
字号:
/******************************************************************************
* Filename: usb.c
* Author: Tan Dewen
* Date: 2004.07.04
* This file contains USB standard request
******************************************************************************/
#include "usb.h"
#include "44b.h"

extern U8 DeviceDescriptor[];
extern U8 ConfigurationDescriptorGroup[];
extern U8 HidDescriptor[];
extern U8 HidReport[];

extern EPPFLAGS bEPPflags;
extern CONTROL_XFER ControlData;
extern U8 GenEpBuf[200];

void (*StandardFunctionTable[])(void) = 
{
	GetStatus, ClearFeature, USB_Reserved, SetFeature,
	USB_Reserved, SetAddress, GetDescriptor, SetDescriptor,
	GetConfiguration, SetConfiguration, GetInterface,
	SetInterface, SyncFrame
};

void (*ClassFunctionTable[])(void) =
{
	USB_Reserved, GetReport, GetIdle, GetProtocol,
	USB_Reserved, USB_Reserved, USB_Reserved, USB_Reserved,
	USB_Reserved, SetReport, SetIdle, SetProtocol
};

U8 DatBuf[2]; 

void GetStatus(void)
{
	U8 endp;
	
	ControlData.pData = DatBuf;

	if( ControlData.DeviceRequest.wValue!=0 )
	{
		StallEndpoint0();
		return;
	}
	
	if( ControlData.DeviceRequest.wLength!=2 )
	{
		StallEndpoint0();
		return;
	}
	
	ControlData.wCount = 0;
	switch( ControlData.DeviceRequest.bmRequestType & USB_REQ_TYPE_RECIP_MASK )
	{
		case USB_REQ_TYPE_DEVICE:
			if( ControlData.DeviceRequest.wIndex!=0 )
			{
				StallEndpoint0();
				return;
			}
			ControlData.wLength = 2;
			DatBuf[0] = 1;//DEVICE_STATUS_SELF_POWER;
			DatBuf[1] = 0;
			//bEPPflags.bits.control_state = USB_TRANSMIT;
			break;
		
		case USB_REQ_TYPE_INTERFACE:
			if( ControlData.DeviceRequest.wIndex!=0 )
			{
				StallEndpoint0();
				return;
			}
			ControlData.wLength = 2;
			DatBuf[0] = 0;
			DatBuf[1] = 0;
			//bEPPflags.bits.control_state = USB_TRANSMIT;
			break;
		
		case USB_REQ_TYPE_ENDPOINT:
			endp = (U8)(ControlData.DeviceRequest.wIndex&3);
			if( ControlData.DeviceRequest.wIndex &EP_DESC_ADDR_DIR_IN )
				DatBuf[0] = D12_SelectEndpoint(endp*2+1);
			else
				DatBuf[0]= D12_SelectEndpoint(endp*2);
			DatBuf[0] >>= 1;
			DatBuf[0] &= 0x01;
			DatBuf[1] = 0;
			ControlData.wLength = 2;
			break;
		case USB_REQ_TYPE_OTHER:
		default:
			StallEndpoint0();
			break;
	}
}

//
void ClearFeature(void)
{
	U8 endp;
	
	switch( ControlData.DeviceRequest.bmRequestType & USB_REQ_TYPE_RECIP_MASK )
	{
		case USB_REQ_TYPE_DEVICE:
			if( ControlData.DeviceRequest.wValue == FEATURE_REMOTE_WAKEUP )
			{
				bEPPflags.bits.remote_wakeup &= ~CFG_DESC_ATTR_REMOTE_WAKE;
				TransmitNullResponseOnEp0();
			}
			break;
		case USB_REQ_TYPE_ENDPOINT:
			if( ControlData.DeviceRequest.wValue ==	FEATURE_ENDPOINT_STALL )
			{
				endp = (U8)(ControlData.DeviceRequest.wIndex);
				if( ControlData.DeviceRequest.wIndex & EP_DESC_ADDR_DIR_IN )
					D12_SetEndpointStatus(endp*2+1, 0);
				else
					D12_SetEndpointStatus(endp*2, 0);
				TransmitNullResponseOnEp0();
			}
			break;
		default:
			StallEndpoint0();
	}
	return;
}
	
//
void SetFeature(void)
{
	U8 endp;
	
	switch( ControlData.DeviceRequest.bmRequestType & USB_REQ_TYPE_RECIP_MASK )
	{
		case USB_REQ_TYPE_DEVICE:
			if( ControlData.DeviceRequest.wValue == FEATURE_REMOTE_WAKEUP )
			{
				bEPPflags.bits.remote_wakeup |= CFG_DESC_ATTR_REMOTE_WAKE;
				TransmitNullResponseOnEp0();
			}
			break;
		case USB_REQ_TYPE_ENDPOINT:
			if( ControlData.DeviceRequest.wValue ==	FEATURE_ENDPOINT_STALL )
			{
				endp = (U8)(ControlData.DeviceRequest.wIndex);
				if( ControlData.DeviceRequest.wIndex & EP_DESC_ADDR_DIR_IN )
					D12_SetEndpointStatus(endp*2+1, 1);
				else
					D12_SetEndpointStatus(endp*2, 1);
				TransmitNullResponseOnEp0();
			}
			break;
		default:
			StallEndpoint0();
	}
	return;
}

// 
void SetAddress(void)
{
	if( (ControlData.DeviceRequest.bmRequestType&USB_REQ_TYPE_RECIP_MASK)!=USB_REQ_TYPE_DEVICE )
	{
		StallEndpoint0();
		return;
	}
	if( ControlData.DeviceRequest.wLength!=0 )
	{
		StallEndpoint0();
		return;
	}
	if( ControlData.DeviceRequest.wIndex!=0 )
	{
		StallEndpoint0();
		return;
	}
	if( ControlData.DeviceRequest.wValue<128 )
	{
		D12_SetAddressEnable( (U8)ControlData.DeviceRequest.wValue, 0x80);
		TransmitNullResponseOnEp0(); 
		init_config();
	}
	else
	{
		StallEndpoint0();
	}
}

// 
void GetDescriptor(void)
{
	U8 i;
	
	if( ControlData.DeviceRequest.wLength==0 )
	{
		StallEndpoint0();
		return;
	}
	
	i = (U8)((ControlData.DeviceRequest.wValue>>8)&0xff);
	switch(i)
	{
		case DESC_TYPE_DEVICE:
			if( ControlData.DeviceRequest.wLength>SIZEOF_DEVICE_DESCRIPTOR )
				ControlData.wLength = SIZEOF_DEVICE_DESCRIPTOR;
			else
				ControlData.wLength = ControlData.DeviceRequest.wLength;
			ControlData.pData = DeviceDescriptor;
			break;
			
		case DESC_TYPE_CONFIG:
			if( ControlData.DeviceRequest.wLength>SIZEOF_CONFIG_DESC_GROUP )
				ControlData.wLength = SIZEOF_CONFIG_DESC_GROUP;
			else
				ControlData.wLength = ControlData.DeviceRequest.wLength;
			ControlData.pData = ConfigurationDescriptorGroup;
			break;
			
		case DESC_TYPE_HID:
			if( ControlData.DeviceRequest.wLength>SIZEOF_HID_DESCRIPTOR )
				ControlData.wLength = SIZEOF_HID_DESCRIPTOR;
			else
				ControlData.wLength = ControlData.DeviceRequest.wLength;
			ControlData.pData = HidDescriptor;
			break;
			
		case DESC_TYPE_REPORT:
			if( ControlData.DeviceRequest.wLength>SIZEOF_REPORT_DESCRIPTOR )
				ControlData.wLength = SIZEOF_REPORT_DESCRIPTOR;
			else
				ControlData.wLength = ControlData.DeviceRequest.wLength;
			ControlData.pData = HidReport;
			break;
			
		case DESC_TYPE_STRING:
		case DESC_TYPE_INTERFACE:
		case DESC_TYPE_ENDPOINT:
		default:
			StallEndpoint0();
	}
}

// 
void SetDescriptor(void)
{
	StallEndpoint0();	
}

//
void GetConfiguration(void)
{
	// check if recipient is device
	if( (ControlData.DeviceRequest.bmRequestType&USB_REQ_TYPE_RECIP_MASK)!=USB_REQ_TYPE_DEVICE )
	{
		StallEndpoint0();
		return;
	}
	// check if wIndex = 0x00
	if( ControlData.DeviceRequest.wIndex!=0 )
	{
		StallEndpoint0();
		return;
	}
	// check if wValue = 0
	if( ControlData.DeviceRequest.wValue!=0 )
	{
		StallEndpoint0();
		return;
	}
	// check if wLength = 1
	if( ControlData.DeviceRequest.wLength!=1 )
	{
		StallEndpoint0();
		return;
	}
	ControlData.wLength = 1;
	ControlData.pData = &bEPPflags.bits.configuration;
}

// 
void SetConfiguration(void)
{
	// check if recipient is device
	if( (ControlData.DeviceRequest.bmRequestType&USB_REQ_TYPE_RECIP_MASK)!=USB_REQ_TYPE_DEVICE )
	{
		StallEndpoint0();
		return;
	}
	// check if wIndex = 0x00
	if( ControlData.DeviceRequest.wIndex!=0 )
	{
		StallEndpoint0();
		return;
	}
	// check if wLength = 0x00
	if( ControlData.DeviceRequest.wLength!=0 )
	{
		StallEndpoint0();
		return;
	}
	if( ControlData.DeviceRequest.wValue==0 )
	{
		TransmitNullResponseOnEp0();
		bEPPflags.bits.configuration = 0;
		init_unconfig();
		return;
	}
	else if( ControlData.DeviceRequest.wValue==1 )
	{
		TransmitNullResponseOnEp0();
		bEPPflags.bits.configuration = 1;
//		init_unconfig();
		init_config();
	}
	else
		StallEndpoint0();
}

//
void GetInterface(void)
{
	DatBuf[0] = 0;
	ControlData.wLength = 1;
	ControlData.wCount = 0;
	ControlData.pData = DatBuf;
	return;

}

//
void SetInterface(void)
{
	if( ControlData.DeviceRequest.wValue ==0 && ControlData.DeviceRequest.wIndex==0 )
		TransmitNullResponseOnEp0();
	else
		StallEndpoint0();
	return;

}

//
void SyncFrame(void)
{
	StallEndpoint0();
	return;

}

// 
void GetReport(void)
{
	StallEndpoint0();
	return;
}

//
void SetReport(void)
{
	StallEndpoint0();
	return;
}

// 
void GetIdle(void)
{
	StallEndpoint0();
	return;
}

//
void SetIdle(void)
{
	StallEndpoint0();
	return;
}

//
void GetProtocol(void)
{
	StallEndpoint0();
	return;
}

//
void SetProtocol(void)
{
	StallEndpoint0();
	return;
}

//
void USB_Reserved(void)
{
	StallEndpoint0();
	return;
}

// Dispatch Device Request
void ControlHandler(void)
{
	U8 type, req;
	
	type = ControlData.DeviceRequest.bmRequestType&USB_REQ_TYPE_MASK;
	req = ControlData.DeviceRequest.bRequest;
	if( type == USB_REQ_TYPE_STANDARD )
		(*StandardFunctionTable[req])();
	else if( type == USB_REQ_TYPE_CLASS )
	{
		(*ClassFunctionTable[req])();
	}
	else
		StallEndpoint0();
}

//
void StallEndpoint0(void)
{
	D12_SetEndpointStatus(SELECT_CTR_OUT,1);
	D12_SetEndpointStatus(SELECT_CTR_IN,1);
	return;		
}

//
void TransmitNullResponseOnEp0(void)
{
	ControlData.wLength = 0;
	ControlData.wCount = 0;
	D12_WriteEndpoint(1, 0, 0);
}

void init_unconfig(void)
{
  //unsigned char i;

  D12_SetEndpointEnable(0);	/* Disable all endpoints but EPP0. */
}

void init_config(void)
{
  D12_SetEndpointEnable(1);	/* Enable  generic/iso endpoints. */
//  D12_SetEndpointStatus(2, 0);
//  D12_SetEndpointStatus(3, 0);
}

⌨️ 快捷键说明

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