📄 chap_9e.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)
struct DEVICE { BYTE bLength;
BYTE bDescriptorType;
WORD bcdUSB;
BYTE bDeviceClass;
BYTE bDeviceSubClass;
BYTE bDeviceProtocol;
BYTE bMaxPacketSize;
WORD idVendor;
WORD idProduct;
WORD bcdDevice;
BYTE iManufacturer;
BYTE iProduct;
BYTE iSerialNumber;
BYTE bNumConfigurations;
};
struct CONFIGURATION { BYTE bLength;
BYTE bDescriptorType;
BYTE wTotalLength;
BYTE wZero;
BYTE bNumInterfaces;
BYTE bConfigurationValue;
BYTE iConfiguration;
BYTE bmAttributes;
BYTE MaxPower;
};
struct INTERFACE { BYTE bLength;
BYTE bDescriptionType;
BYTE bInterfaceNumber;
BYTE bAlternateSetting;
BYTE bNumEndpoints;
BYTE bInterfaceClass;
BYTE bInterfaceSubClass;
BYTE bInterfaceProtocol;
BYTE iInterface;
};
struct ENDPOINT { BYTE bLength;
BYTE bDescriptorType;
BYTE bEndpointAddress;
BYTE bmAttributes;
WORD wMaxPacketSize;
BYTE bInterval;
};
struct HIDDESC {
BYTE bLength;
BYTE bDescriptorType;
WORD bcdHID;
BYTE bCountryCode;
BYTE bNumDescriptors;
BYTE bReportDescriptorType;
WORD wItemLength;
};
struct CONFIG { struct CONFIGURATION sConfig;
struct INTERFACE sInterface;
struct HIDDESC sHIDDesc;
struct ENDPOINT sEndpoint1;
};
//sDevice sConfiguration
//sizeof(struct CONFIGURATION)
//sizeof( struct DEVICE)
struct DEVICE code sDevice= { sizeof( struct DEVICE),//BYTE bLength
0x01, //BYTE bDescriptorType
0x0a01,//WORD bcdUSB
0xff, //Byte bDeviceClass
0xff, //BYTE bDeviceSubClass
0xff, //BYTE bDeviceProtocol
0x08, //BYTE bMaxPacketSize of 8
0x7104,//WORD idVendor
0x0211,//WORD idProduct, For Philips Hub mouse
0x0a01,//WORD bcdDevice
0x01, //BYTE iManufacturer
0x02, //BYTE iProduct
0x00, //BYTE iSerialNumber
0x01 };//BYTE bNumConfigurations
struct CONFIG code sConfiguration= {sizeof(struct CONFIGURATION), //BYTE bLength
0x02, //BYTE bDescriptorType //Assigned by USB
sizeof( struct CONFIG), //BYTE wTotalLength
0x00, //BYTE wZero, always 00
0x01, //BYTE bNumInterfaces
0x01, //BYTE bConfigurationValue
0x00, //BYTE iConfiguration
0x0a0, //BYTE bmAttributes, Bus powered and remote wakeup
0x05, //BYTE MaxPower
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
sizeof(struct HIDDESC),//BYTE bLength;
0x21, //BYTE bDescriptorType;
0x0001,//WORD bcdHID;
0x00,//BYTE bCountryCode;
0x01,//BYTE bNumDescriptors;
0x22,//BYTE bReportDescriptorType;
0x3200,//WORD wItemLength;
sizeof(struct ENDPOINT), //BYTE bLength
0x05, //BYTE bDescriptorType, assigned by USB
0x81, //BYTE bEndpointAddress, IN endpoint, endpoint 1
0x03, //BYTE bmAttributes, Interrupt endpoint
0x0800, //WORD wMaxPacketSize
0x0A, //Polling Time
}; //Interval
unsigned char code REPORT_DESCRIPTOR[50] = {0x05,
0x01,
0x09,
0x02,
0xA1,
0x01,
0x09,
0x01,
0xA1,
0x00,
0x05,
0x09,
0x19,
0x01,
0x29,
0x03,
0x15,
0x00,
0x25,7
0x01,
0x95,
0x03,
0x75,
0x01,
0x81,
0x02,
0x95,
0x01,
0x75,
0x05,
0x81,
0x01,
0x05,
0x01,
0x09,
0x30,
0x09,
0x31,
0x15,
0x81,
0x25,
0x7F,
0x75,
0x08,
0x95,
0x02,
0x81,
0x06,
0xC0,
0xC0,
};
unsigned char code LANG_ID[4] = {0x04, //4 bytes
0x03, //bDescriptorType = String Desc
0x09, //Lang ID for English = 0x0409
0x04,};
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)
{
bD13flags.bits.remote_wakeup = 0;
Chap9_SingleTransmitEP0(0, 0);
}
else
Chap9_StallEP0InControlWrite();
break;
case USB_RECIPIENT_ENDPOINT:
if(wFeature == USB_FEATURE_ENDPOINT_STALL)
{
if( ControlData.DeviceRequest.wIndex == 0x00 )
{
endp = 0;
Hal4D13_SetEndpointStatus(endp, 0);
Chap9_SingleTransmitEP0(0, 0);
}
else
{
Chap9_StallEP0InControlWrite();
break;
}
}
else
Chap9_StallEP0InControlWrite();
break;
default:
Chap9_StallEP0InControlWrite();
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -