www.pudn.com > HID firmware for the EZ-USB FX2 in C.zip > CHAP_9.C


/* 
   //************************************************************************* 
   // 
   //                  P H I L I P S   P R O P R I E T A R Y 
   // 
   //           COPYRIGHT (c)   1997 BY PHILIPS SINGAPORE. 
   //                     --  ALL RIGHTS RESERVED  -- 
   // 
   // File Name:	CHAP_9.C 
   // Author:		Wenkai Du 
   // Created:		19 Dec 97 
   // Modified: 
   // Revision:		3.0 
   // 
   //************************************************************************* 
*/ 
 
#include  
#include  
 
#include                 /* special function register declarations   */ 
 
#include "epphal.h" 
#include "d12ci.h" 
#include "mainloop.h" 
#include "usb100.h" 
#include "chap_9.h" 
 
#define NUM_ENDPOINTS	4 
 
#define CONFIG_DESCRIPTOR_LENGTH    sizeof(USB_CONFIGURATION_DESCRIPTOR) \ 
									+ sizeof(USB_INTERFACE_DESCRIPTOR) \ 
									+ (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR)) 
 
extern CONTROL_XFER ControlData; 
extern IO_REQUEST idata ioRequest; 
extern EPPFLAGS bEPPflags; 
 
code USB_DEVICE_DESCRIPTOR DeviceDescr = 
{ 
	sizeof(USB_DEVICE_DESCRIPTOR), 
    USB_DEVICE_DESCRIPTOR_TYPE, 
    SWAP(0x0100), 
    USB_CLASS_CODE_TEST_CLASS_DEVICE, 
    0, 0, 
	EP0_PACKET_SIZE, 
	SWAP(0x0471), 
	SWAP(0x0666), 
	SWAP(0x0100), 
    0, 0, 0, 
	25 
}; 
 
code USB_CONFIGURATION_DESCRIPTOR ConfigDescr = 
{ 
    sizeof(USB_CONFIGURATION_DESCRIPTOR), 
    USB_CONFIGURATION_DESCRIPTOR_TYPE, 
    SWAP(CONFIG_DESCRIPTOR_LENGTH), 
	1, 
	1, 
    0, 
	0x60, 
	0x1 
}; 
 
code USB_INTERFACE_DESCRIPTOR InterfaceDescr = 
{ 
    sizeof(USB_INTERFACE_DESCRIPTOR), 
    USB_INTERFACE_DESCRIPTOR_TYPE, 
    0, 
    0, 
	NUM_ENDPOINTS, 
	USB_CLASS_CODE_TEST_CLASS_DEVICE, 
	USB_SUBCLASS_CODE_TEST_CLASS_D12, 
	USB_PROTOCOL_CODE_TEST_CLASS_D12, 
	0 
}; 
 
code USB_ENDPOINT_DESCRIPTOR EP1_TXDescr = 
{ 
	sizeof(USB_ENDPOINT_DESCRIPTOR), 
	USB_ENDPOINT_DESCRIPTOR_TYPE, 
	0x81, 
	USB_ENDPOINT_TYPE_INTERRUPT, 
	SWAP(EP1_PACKET_SIZE), 
	10 
}; 
 
code USB_ENDPOINT_DESCRIPTOR EP1_RXDescr = 
{ 
	sizeof(USB_ENDPOINT_DESCRIPTOR), 
	USB_ENDPOINT_DESCRIPTOR_TYPE, 
	0x1, 
	USB_ENDPOINT_TYPE_INTERRUPT, 
	SWAP(EP1_PACKET_SIZE), 
	10 
}; 
 
code USB_ENDPOINT_DESCRIPTOR EP2_TXDescr = 
{ 
	sizeof(USB_ENDPOINT_DESCRIPTOR), 
	USB_ENDPOINT_DESCRIPTOR_TYPE, 
	0x82, 
	USB_ENDPOINT_TYPE_BULK, 
	SWAP(EP2_PACKET_SIZE), 
	10 
}; 
 
code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr = 
{ 
	sizeof(USB_ENDPOINT_DESCRIPTOR), 
	USB_ENDPOINT_DESCRIPTOR_TYPE, 
	0x2, 
	USB_ENDPOINT_TYPE_BULK, 
	SWAP(EP2_PACKET_SIZE), 
	10 
}; 
 
/* 
   //************************************************************************* 
   // USB Protocol Layer 
   //************************************************************************* 
*/ 
 
void reserved(void) 
{ 
	stall_ep0(); 
} 
 
/* 
   //************************************************************************* 
   // USB standard device requests 
   //************************************************************************* 
*/ 
 
void get_status(void) 
{ 
	unsigned char endp, txdat[2]; 
	unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT; 
	unsigned char c; 
 
	if (bRecipient == USB_RECIPIENT_DEVICE) { 
		if(bEPPflags.bits.remote_wakeup == 1) 
			txdat[0] = 3; 
		else 
			txdat[0] = 1; 
		txdat[1]=0; 
		single_transmit(txdat, 2); 
	} else if (bRecipient == USB_RECIPIENT_INTERFACE) { 
		txdat[0]=0; 
		txdat[1]=0; 
		single_transmit(txdat, 2); 
	} else if (bRecipient == USB_RECIPIENT_ENDPOINT) { 
		endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS); 
		if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) 
			c = D12_SelectEndpoint(endp*2 + 1);	/* Control-in */ 
		else 
			c = D12_SelectEndpoint(endp*2);	/* Control-out */ 
		if(c & D12_STALL) 
			txdat[0] = 1; 
		else 
			txdat[0] = 0; 
		txdat[1] = 0; 
		single_transmit(txdat, 2); 
	} else 
		stall_ep0(); 
} 
 
void clear_feature(void) 
{ 
	unsigned char endp; 
	unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT; 
 
	if (bRecipient == USB_RECIPIENT_DEVICE 
		&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) { 
		DISABLE; 
		bEPPflags.bits.remote_wakeup = 0; 
		ENABLE; 
		single_transmit(0, 0); 
	} 
	else if (bRecipient == USB_RECIPIENT_ENDPOINT 
		&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) { 
		endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS); 
		if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) 
			/* clear TX stall for IN on EPn. */ 
			D12_SetEndpointStatus(endp*2 + 1, 0); 
		else 
			/* clear RX stall for OUT on EPn. */ 
			D12_SetEndpointStatus(endp*2, 0); 
		single_transmit(0, 0); 
	} else 
		stall_ep0(); 
} 
 
void set_feature(void) 
{ 
	unsigned char endp; 
	unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT; 
 
	if (bRecipient == USB_RECIPIENT_DEVICE 
		&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) { 
		DISABLE; 
		bEPPflags.bits.remote_wakeup = 1; 
		ENABLE; 
		single_transmit(0, 0); 
	} 
	else if (bRecipient == USB_RECIPIENT_ENDPOINT 
		&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) { 
		endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS); 
		if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) 
			/* clear TX stall for IN on EPn. */ 
			D12_SetEndpointStatus(endp*2 + 1, 1); 
		else 
			/* clear RX stall for OUT on EPn. */ 
			D12_SetEndpointStatus(endp*2, 1); 
		single_transmit(0, 0); 
	} else 
		stall_ep0(); 
} 
 
void set_address(void) 
{ 
	D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue & 
		DEVICE_ADDRESS_MASK), 1); 
	single_transmit(0, 0); 
} 
 
void get_descriptor(void) 
{ 
	unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue); 
 
	if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) { 
		code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR)); 
	} else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) { 
		code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH); 
	} else 
		stall_ep0(); 
} 
 
void get_configuration(void) 
{ 
	unsigned char c = bEPPflags.bits.configuration; 
 
	single_transmit(&c, 1); 
} 
 
void set_configuration(void) 
{ 
	if (ControlData.DeviceRequest.wValue == 0) { 
		/* put device in unconfigured state */ 
		single_transmit(0, 0); 
		DISABLE; 
		bEPPflags.bits.configuration = 0; 
		ENABLE; 
		init_unconfig(); 
	} else if (ControlData.DeviceRequest.wValue == 1) { 
		/* Configure device */ 
		single_transmit(0, 0); 
 
		init_unconfig(); 
		init_config(); 
		 
		DISABLE; 
		bEPPflags.bits.configuration = 1; 
		ENABLE; 
	} else 
		stall_ep0(); 
} 
 
void get_interface(void) 
{ 
	unsigned char txdat = 0;        /* Only/Current interface = 0 */ 
	single_transmit(&txdat, 1); 
} 
 
void set_interface(void) 
{ 
	if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0) 
		single_transmit(0, 0); 
	else 
		stall_ep0(); 
}