📄 chap_99.c
字号:
#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 + -