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

📄 chap_99.c

📁 参加今年的比赛肯定要用的。谢谢支持。祝大家好运!
💻 C
📖 第 1 页 / 共 2 页
字号:

#include <stdio.h>
#include <string.h>
#include "BasicTyp.h"
#include "common.h"
#include "usb.h"
#include "chap_9.h"
#include "Hal4D13.h"
#include "ISO.H"

// *************************************************************************
// Public Data
// *************************************************************************

extern D13FLAGS bD13flags;
extern USBCHECK_DEVICE_STATES bUSBCheck_Device_State;
extern CONTROL_XFER ControlData;

UCHAR ALTERNATIVE_SETTING = 0;

// *************************************************************************
// USB Device Descriptor
// *************************************************************************

#define NUM_ENDPOINTS	4

#define NUM_INTERFACE	2
#define NUM_ALTINTERFACE	2

#define USB_CLASS_CODE_TEST_CLASS_DEVICE                    0xdc
#define USB_SUBCLASS_CODE_TEST_CLASS_D12                    0xA0
#define USB_PROTOCOL_CODE_TEST_CLASS_D12                    0xB0

#define EP0_TX_FIFO_SIZE   64//16
#define EP0_RX_FIFO_SIZE   64//16
#define EP0_PACKET_SIZE    64//16

#define EP1_TX_FIFO_SIZE   16
#define EP1_RX_FIFO_SIZE   16
#define EP1_PACKET_SIZE    16

#define EP2_TX_FIFO_SIZE   64
#define EP2_RX_FIFO_SIZE   64
#define EP2_PACKET_SIZE    64

//#define CONFIG_DESCRIPTOR_LENGTH    NUM_ALTINTERFACE * sizeof(USB_CONFIGURATION_DESCRIPTOR) + NUM_ALTINTERFACE * sizeof(USB_INTERFACE_DESCRIPTOR) + NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR)

//#define CONFIG_DESCRIPTOR_LENGTH    sizeof( USB_CONFIGURATION_DESCRIPTOR)//NUM_ALTINTERFACE * sizeof(USB_CONFIGURATION_DESCRIPTOR) +NUM_ALTINTERFACE * sizeof(USB_INTERFACE_DESCRIPTOR) +4 * NUM_ALTINTERFACE * sizeof(USB_ENDPOINT_DESCRIPTOR) 

#define CONFIG_DESCRIPTOR_LENGTH    0x2e //sizeof( USB_CONFIGURATION_DESCRIPTOR)//NUM_ALTINTERFACE * sizeof(USB_CONFIGURATION_DESCRIPTOR) +NUM_ALTINTERFACE * sizeof(USB_INTERFACE_DESCRIPTOR) +4 * NUM_ALTINTERFACE * sizeof(USB_ENDPOINT_DESCRIPTOR) 

USB_DEVICE_DESCRIPTOR DeviceDescr =
{
  /*
                    sizeof(USB_DEVICE_DESCRIPTOR),
                     0x01,  //BYTE bDescriptorType
                     //SWAP(0x100),//WORD bcdUSB
                     SWAP(0x100),//WORD bcdUSB
                     
                     0xff,  //Byte bDeviceClass
                     0xff,  //BYTE bDeviceSubClass
                     0xff,  //BYTE bDeviceProtocol
                     0x40,  //BYTE bMaxPacketSize of 8
                     SWAP(0x0471),//WORD idVendor
                     SWAP(0x1102),//WORD idProduct, For Philips Hub mouse
                     SWAP(0x010a),//WORD bcdDevice
                     0x01,  //BYTE iManufacturer
                     0x02,  //BYTE iProduct
                     0x00,  //BYTE iSerialNumber
                     0x01 

*/
  sizeof(USB_DEVICE_DESCRIPTOR),
  USB_DEVICE_DESCRIPTOR_TYPE,
  SWAP(0x100),  //usb spec1.1
  0xdc,
  0,
  0,
  EP0_PACKET_SIZE,
  SWAP(0x0471),
  SWAP(0x0666), //0x1A61: ISA kit, 0x1A62: PCI kit, 0X1A65: Cotulla kit
  SWAP(0x0100),

  STR_INDEX_MANUFACTURER,
  STR_INDEX_PRODUCT,
  STR_INDEX_SERIALNUMBER,
  0x1

};

USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
{
  /*
					          9,//sizeof(struct CONFIGURATION), //BYTE bLength
                    0x02, //BYTE bDescriptorType //Assigned by USB
                    SWAP(0x0022),//sizeof(USB_CONFIGURATION_DESCRIPTOR)), //word wTotalLength

                    0x01, //BYTE bNumInterfaces
                    0x01, //BYTE bConfigurationValue
                    0x00, //BYTE iConfiguration
                    0xa0, //BYTE bmAttributes, Bus powered and remote wakeup
                    0x05, //BYTE MaxPower
                    9,//sizeof(struct INTERFACE), //BYTE bLength
                    0x04, //BYTE bDescriptionType, assigned by USB
                    0x00, //BYTE bInterfaceNumber
                    0x00, //BYTE bAlternateSetting
                    0x01, //BYTE bNumEndpoints, uses 1 endpoints
                    0x03, //BYTE bInterfaceClass, HID Class - 0x03
                    0x01, //BYTE bInterfaceSubClass
                    0x01, //BYTE bInterfaceProtocol
                    0x00 ,//BYTE iInterface
			              9,//sizeof(struct HIDDESC),//BYTE bLength;
                    0x21, //BYTE bDescriptorType;
                    SWAP(0x100),//WORD bcdHID;
                    0x00,//BYTE bCountryCode;
                    0x01,//BYTE bNumDescriptors;
		                0x22,//BYTE bReportDescriptorType;
                    SWAP(0x0032),//WORD wItemLength;
                    7,//sizeof(struct ENDPOINT), //BYTE bLength
                    0x05, //BYTE bDescriptorType, assigned by USB
                    0x81, //BYTE bEndpointAddress, IN endpoint, endpoint 1
                    0x03, //BYTE bmAttributes, Interrupt endpoint
                    SWAP(0x0008), //WORD wMaxPacketSize
                    0x0A, //Polling Time

*/


  9,//sizeof(USB_CONFIGURATION_DESCRIPTOR),
  USB_CONFIGURATION_DESCRIPTOR_TYPE,
  SWAP(0x2e),//SWAP(CONFIG_DESCRIPTOR_LENGTH), 
  
  1, //NO OF I/F: 1,
  1,
  STR_INDEX_CONFIGURATION,
  0xC0,// no remote wakeup
  0x1,

  9,//sizeof(USB_INTERFACE_DESCRIPTOR),
  USB_INTERFACE_DESCRIPTOR_TYPE,
  0, //InterfaceNumber
  0, //Alternate Setting
  NUM_ENDPOINTS, // No of Endpoints
  USB_CLASS_CODE_TEST_CLASS_DEVICE,
  USB_SUBCLASS_CODE_TEST_CLASS_D12,
  USB_PROTOCOL_CODE_TEST_CLASS_D12,
  0,
/*
  9,//sizeof(struct HIDDESC),//BYTE bLength;
  0x21, //BYTE bDescriptorType;
  SWAP(0x100),//WORD bcdHID;
  0x00,//BYTE bCountryCode;
  0x01,//BYTE bNumDescriptors;
  0x22,//BYTE bReportDescriptorType;
  SWAP(0x3200),//WORD wItemLength;
  7,//sizeof(struct ENDPOINT), //BYTE bLength
*/ 
  7,//sizeof(USB_ENDPOINT_DESCRIPTOR),
  USB_ENDPOINT_DESCRIPTOR_TYPE,
  0x81,
  USB_ENDPOINT_TYPE_INTERRUPT,
  SWAP(0x0004),//EP1_PACKET_SIZE),
  10,
  
  7,//sizeof(USB_ENDPOINT_DESCRIPTOR),
  USB_ENDPOINT_DESCRIPTOR_TYPE,
  0x1,
  USB_ENDPOINT_TYPE_INTERRUPT,
  SWAP(0x0004),//EP1_PACKET_SIZE),
  10,


  7,//sizeof(USB_ENDPOINT_DESCRIPTOR),
  USB_ENDPOINT_DESCRIPTOR_TYPE,
  0x2,
  USB_ENDPOINT_TYPE_BULK,
  SWAP(0x0040),//EP2_PACKET_SIZE),
  10
  
};


USB_STRING_LANGUAGE_DESCRIPTOR  strLanguage =
{
  sizeof(USB_STRING_LANGUAGE_DESCRIPTOR),
  sizeof(strLanguage),
  USB_STRING_DESCRIPTOR_TYPE,
  SWAP(0x0409)
};



/*
USB_DEVICE_DESCRIPTOR DeviceDescr =
{
	sizeof(USB_DEVICE_DESCRIPTOR),
	USB_DEVICE_DESCRIPTOR_TYPE,
	SWAP(0x200),	//Complient to USB2.0 FullSpeed
	0,//bDeviceClass
	0,//bDeviceSubClass
	0,//bDeviceProtocol
	EP0_PACKET_SIZE,
	SWAP(0x4cc), // Vendor ID for PHILIPS
	SWAP(0x1a62),// Product ID for ISP 1362
	SWAP(0x0100),// Device Release Number 1.0
	0,//STR_INDEX_MANUFACTURER,
	0,//STR_INDEX_PRODUCT,
	0,//STR_INDEX_SERIALNUMBER,
	1
};

USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
{
	sizeof(USB_CONFIGURATION_DESCRIPTOR),
	USB_CONFIGURATION_DESCRIPTOR_TYPE,
	SWAP(CONFIG_DESCRIPTOR_LENGTH),
	1,	//NO OF I/F: 1,
	1,  //bConfigurationValue
	0,//iConfiguration
	0xC0,//bmAttributes =>no remote wakeup
	0x1//Max Power
};

USB_INTERFACE_DESCRIPTOR InterfaceDescr0 =
{
	sizeof(USB_INTERFACE_DESCRIPTOR),
	USB_INTERFACE_DESCRIPTOR_TYPE,
	0,//bInterfaceNumber
	0,//bAlternateSetting
	0,//bNumEndpoints
	USB_CLASS_CODE_UNKNOWN,
	USB_SUBCLASS_CODE_UNKNOWN,
	USB_PROTOCOL_CODE_UNKNOWN,
	0,//STR_INDEX_INTERFACE
};


USB_INTERFACE_DESCRIPTOR InterfaceDescr1 =
{
	sizeof(USB_INTERFACE_DESCRIPTOR),
	USB_INTERFACE_DESCRIPTOR_TYPE,
	0,//bInterfaceNumber
	1,//bAlternateSetting
	NUM_ENDPOINTS,
	USB_CLASS_CODE_UNKNOWN,
	USB_SUBCLASS_CODE_UNKNOWN,
	USB_PROTOCOL_CODE_UNKNOWN,
	0,//STR_INDEX_INTERFACE
};


USB_ENDPOINT_DESCRIPTOR EP_Descr[4] =
{

	{
		sizeof(USB_ENDPOINT_DESCRIPTOR),
		USB_ENDPOINT_DESCRIPTOR_TYPE,
		0x03,//EP03, 0x4, OUT
		USB_ENDPOINT_TYPE_BULK,
		SWAP(NONISO_FIFOSIZE_64),
		0
	},


	{
		sizeof(USB_ENDPOINT_DESCRIPTOR),
		USB_ENDPOINT_DESCRIPTOR_TYPE,
		0x84,// EP4, 0x5, IN
		USB_ENDPOINT_TYPE_BULK,
		SWAP(NONISO_FIFOSIZE_64),
		0
	},


	{
		sizeof(USB_ENDPOINT_DESCRIPTOR),
		USB_ENDPOINT_DESCRIPTOR_TYPE,
		0x05,// EP5 ISO OUT
		USB_ENDPOINT_TYPE_ISOCHRONOUS,
		SWAP(ISO_FIFOSIZE_512),
		1
	},


	{
		sizeof(USB_ENDPOINT_DESCRIPTOR),
		USB_ENDPOINT_DESCRIPTOR_TYPE,
		0x86,// EP6 ISO IN
		USB_ENDPOINT_TYPE_ISOCHRONOUS,
		SWAP(ISO_FIFOSIZE_512),
		1
	},
};



USB_STRING_LANGUAGE_DESCRIPTOR  strLanguage =
{
	sizeof(USB_STRING_LANGUAGE_DESCRIPTOR),
	USB_STRING_DESCRIPTOR_TYPE,
	SWAP(0x0409)
};
*/
USB_STRING_INTERFACE_DESCRIPTOR  strInterface =
{
	sizeof(USB_STRING_INTERFACE_DESCRIPTOR),
	USB_STRING_DESCRIPTOR_TYPE,
	{'I',0,'n',0,'t',0,'e',0,'r',0,'f',0,'a',0,'c',0,'e',0,'0',0,'0',0}
};

USB_STRING_CONFIGURATION_DESCRIPTOR  strConfiguration =
{
	sizeof(USB_STRING_CONFIGURATION_DESCRIPTOR),
	USB_STRING_DESCRIPTOR_TYPE,
	{
	'C',0,
	'o',0,
	'n',0,
	'f',0,
	'i',0,
	'g',0,
	'0',0,
	'0',0
    }
};

USB_STRING_SERIALNUMBER_DESCRIPTOR  strSerialNum =
{
	sizeof(strSerialNum),
	USB_STRING_DESCRIPTOR_TYPE,
   {
	'0',0,
	'0',0,
	'0',0,
	'0',0,

	'0',0,
	'0',0,
	'0',0,
	'0',0,

	'0',0,
	'0',0,
	'0',0,
	'0',0
   }
};
USB_STRING_PRODUCT_DESCRIPTOR  strProduct =
{
	sizeof(USB_STRING_PRODUCT_DESCRIPTOR),
	USB_STRING_DESCRIPTOR_TYPE,
	{
	'P', 0,
	'H', 0,
	'I', 0,
	'L', 0,
	'I', 0,
	'P', 0,
	'S', 0,
	' ', 0,
	'I', 0,
	'S', 0,
	'P', 0,
	'1', 0,
	'1', 0,
	'8', 0,
	'1', 0,
	' ', 0,
	'T', 0,
	'e', 0,
	's', 0,
	't', 0,
	' ', 0,
	' ', 0,
	' ', 0
	}
};

USB_STRING_MANUFACTURER_DESCRIPTOR  strManufacturer =
{
	sizeof(USB_STRING_MANUFACTURER_DESCRIPTOR),
	USB_STRING_DESCRIPTOR_TYPE,
	{
	'P', 0,
	'H', 0,
	'I', 0,
	'L', 0,
	'I', 0,
	'P', 0,
	'S', 0,
	' ', 0,
	'S', 0,
	'e', 0,
	'm', 0,
	'i', 0,
	'c', 0,
	'o', 0,
	'n', 0,
	'd', 0,
	'u', 0,
	'c', 0,
	't', 0,
	'o', 0,
	'r', 0,
	's', 0,
	' ', 0,
	'A', 0,
	'P', 0,
	'I', 0,
	'C', 0}
};

// *************************************************************************
// USB Protocol Layer
// ************************************************************************



// *************************************************************************
// USB standard device requests
// *************************************************************************

void Chap9_GetStatus(void)
{
	UCHAR   endp, txdat[2];
	UCHAR   c;
	UCHAR   bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;


	if(bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE)
	{
	switch(bRecipient)
			{
			case USB_RECIPIENT_DEVICE:
					if(bD13flags.bits.remote_wakeup == 1)
						txdat[0] = DEVSTS_SELFPOWERED|DEVSTS_REMOTEWAKEUP;   /* remote wakeup and Self-powered */
					else
						txdat[0] = DEVSTS_SELFPOWERED;   /* Self-powered*/
					txdat[1]=0;

					Chap9_SingleTransmitEP0(txdat, 2);
					break;

			case USB_RECIPIENT_INTERFACE:

					Chap9_StallEP0InControlRead();
					break;

			case USB_RECIPIENT_ENDPOINT:

					if( ControlData.DeviceRequest.wIndex == 0x00 )
					{
						endp = -1;
						c = Hal4D13_GetEndpointStatusWOInteruptClear(endp + 1);
						if(c & D13REG_EPSTS_STALL)
							txdat[0] = ENDPSTS_HALT;   /* Halt */
						else
							txdat[0] = 0;

						txdat[1] = 0;

						Chap9_SingleTransmitEP0(txdat, 2);
					}
					else
						Chap9_StallEP0InControlRead();

					break;

			default:
					Chap9_StallEP0InControlRead();
					break;
			}
	}


	else
	{
		if(ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wLength == 2 )
		{
			switch(bRecipient)
			{
			case USB_RECIPIENT_DEVICE:
					if(bD13flags.bits.remote_wakeup == 1)
						txdat[0] = DEVSTS_SELFPOWERED|DEVSTS_REMOTEWAKEUP;   /* remote wakeup and Self-powered */
					else
						txdat[0] = DEVSTS_SELFPOWERED;   /* Self-powered*/
					txdat[1]=0;

					Chap9_SingleTransmitEP0(txdat, 2);
					break;

			case USB_RECIPIENT_INTERFACE:
					txdat[0]=0;
					txdat[1]=0;

					Chap9_SingleTransmitEP0(txdat, 2);
					break;

			case USB_RECIPIENT_ENDPOINT:

					if( ControlData.DeviceRequest.wIndex == 0x00 )
						endp = -1;
					else
						endp = (UCHAR)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);

					c = Hal4D13_GetEndpointStatusWOInteruptClear(endp + 1);
					if(c & D13REG_EPSTS_STALL)
						txdat[0] = ENDPSTS_HALT;   /* Halt */
					else
						txdat[0] = 0;

					txdat[1] = 0;

					Chap9_SingleTransmitEP0(txdat, 2);
					break;

			default:
					Chap9_StallEP0InControlRead();
					break;
			}
		}
	}

}

void Chap9_ClearFeature(void)
{
	UCHAR   endp;
	UCHAR   bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
	USHORT  wFeature = ControlData.DeviceRequest.wValue;

	if(bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE)
	{
		if( ControlData.DeviceRequest.wLength == 0 )
		{
			switch(bRecipient)
			{
			case USB_RECIPIENT_DEVICE:
						if(wFeature == USB_FEATURE_REMOTE_WAKEUP)
						{

⌨️ 快捷键说明

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