📄 chap9.c
字号:
//===================================================================//
// Augest, 25, 2002 The Last Modified Date
// Modified by Dai LiZHou, HIT (dailizhou@0451.com)
//===================================================================//
#include "AvrUsb.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 AVRUSBFLAGS bAvrUsbFlags;
const USB_DEVICE_DESCRIPTOR DeviceDescr =
{
sizeof(USB_DEVICE_DESCRIPTOR), // bLength
USB_DEVICE_DESCRIPTOR_TYPE, // bDescriptorType
0x0110, // bcdUSB
0xff, // bDeviceClass
0xff, // bDeviceSubClass
0xff, // bDeviceProtocol
EP0_PACKET_SIZE, // bMaxPacketSize
0x0471, // idVendor
0x1801, // idProduct
0x0010, // bcdDevice
1, // iManufacturer
2, // iProduct
3, // iSerialNumber
1 // bNumConfigurations
};
const USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
{
sizeof(USB_CONFIGURATION_DESCRIPTOR), // bLength
USB_CONFIGURATION_DESCRIPTOR_TYPE, // bDescriptorType
CONFIG_DESCRIPTOR_LENGTH, // wTotalLength
1, // bNumInterfaces
1, // bConfigurationValue
4, // iConfiguration
0x80, // bmAttributes
50 // MaxPower
};
const USB_INTERFACE_DESCRIPTOR InterfaceDescr =
{
sizeof(USB_INTERFACE_DESCRIPTOR), // bLength
USB_INTERFACE_DESCRIPTOR_TYPE, // bDescriptorLength
0, // bInterfaceNumber
0, // bAlternateSetting
NUM_ENDPOINTS, // bNumEndpoints
0xff, // bInterfaceClass
0xff, // bInterfaceSubClass
0xff, // bInterfaceProtocol
5 // iInterface
};
const USB_ENDPOINT_DESCRIPTOR EP1_TXDescr =
{
sizeof(USB_ENDPOINT_DESCRIPTOR), // bLength
USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType
0x81, // bEndpointAddress
USB_ENDPOINT_TYPE_BULK, // bmAttributes
EP1_PACKET_SIZE, // wMaxPacketSize
10 // bInterval
};
const USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
{
sizeof(USB_ENDPOINT_DESCRIPTOR), // bLength
USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType
0x01, // bEndpointAddress
USB_ENDPOINT_TYPE_BULK, // bmAttributes
EP1_PACKET_SIZE, // wMaxPacketSize
10 // bInterval
};
const USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
{
sizeof(USB_ENDPOINT_DESCRIPTOR), // bLength
USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType
0x82, // bEndpointAddress
USB_ENDPOINT_TYPE_BULK, // bmAttributes
EP2_TX_FIFO_SIZE, // wMaxPacketSize
10 // bInterval
};
const USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
{
sizeof(USB_ENDPOINT_DESCRIPTOR), // bLength
USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType
0x2, // bEndpointAddress
USB_ENDPOINT_TYPE_BULK, // bmAttributes
EP2_RX_FIFO_SIZE, // wMaxPacketSize
10 // bInterval
};
const unsigned char USBString[] =
{
4, // bLength
USB_STRING_DESCRIPTOR_TYPE, // bDescriptorType
0x09, 0x04//SWAP(0x0409) // wLANGID
};
//*************************************************************************
// USB Protocol Layer
// USB standard device requests
//*************************************************************************
void reserved(void)
{
USB_Stall_EP0();
}
void USBClassRequest_GetStatus(void)
{
unsigned char endp, txdat[2];
unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
unsigned char c;
if (bRecipient == USB_RECIPIENT_DEVICE) {
if(bAvrUsbFlags.bits.bRemote_Wakeup == 1)
txdat[0] = 3;
else
txdat[0] = 1;
txdat[1]=0;
USB_Single_Transmit(txdat, 2);
} else if (bRecipient == USB_RECIPIENT_INTERFACE) {
txdat[0]=0;
txdat[1]=0;
USB_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 = USBD12_SelectEndpoint(endp*2 + 1); /* Control-in */
else
c = USBD12_SelectEndpoint(endp*2); /* Control-out */
if(c & USBD12_STALL)
txdat[0] = 1;
else
txdat[0] = 0;
txdat[1] = 0;
USB_Single_Transmit(txdat, 2);
} else
USB_Stall_EP0();
}
void USBClassRequest_ClearFeature(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_INTERRUPTS;
bAvrUsbFlags.bits.bRemote_Wakeup = 0;
ENABLE_INTERRUPTS;
USB_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. */
USBD12_SetEndpointStatus(endp*2 + 1, 0);
else
/* clear RX stall for OUT on EPn. */
USBD12_SetEndpointStatus(endp*2, 0);
USB_Single_Transmit(0, 0);
} else
USB_Stall_EP0();
}
void USBClassRequest_SetFeature(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_INTERRUPTS;
bAvrUsbFlags.bits.bRemote_Wakeup = 1;
ENABLE_INTERRUPTS;
USB_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. */
USBD12_SetEndpointStatus(endp*2 + 1, 1);
else
/* clear RX stall for OUT on EPn. */
USBD12_SetEndpointStatus(endp*2, 1);
USB_Single_Transmit(0, 0);
} else
USB_Stall_EP0();
}
void USBClassRequest_SetAddress(void)
{
USBD12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
DEVICE_ADDRESS_MASK), 1);
USB_Single_Transmit(0, 0);
}
void USBClassRequest_GetDescriptor(void)
{
unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
if(bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE)
{
USB_Code_Transmit((const unsigned char *)(&DeviceDescr), sizeof(USB_DEVICE_DESCRIPTOR));
}
else if(bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)
{
USB_Code_Transmit((const unsigned char *)(&ConfigDescr), CONFIG_DESCRIPTOR_LENGTH);
}
else if(bDescriptor == USB_STRING_DESCRIPTOR_TYPE)
{
switch(LSB(ControlData.DeviceRequest.wValue))
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
default:
USB_Code_Transmit(USBString, USBString[0]);
break;
}
}
else
{
USB_Stall_EP0();
}
}
void USBClassRequest_GetConfiguration(void)
{
unsigned char c = bAvrUsbFlags.bits.bConfiguration;
USB_Single_Transmit(&c, 1);
}
void USBClassRequest_SetConfiguration(void)
{
if (ControlData.DeviceRequest.wValue == 0) {
/* put device in unconfigured state */
USB_Single_Transmit(0, 0);
DISABLE_INTERRUPTS;
bAvrUsbFlags.bits.bConfiguration = 0;
ENABLE_INTERRUPTS;
USB_Init_Unconfig();
} else if (ControlData.DeviceRequest.wValue == 1) {
/* Configure device */
USB_Single_Transmit(0, 0);
USB_Init_Unconfig();
USB_Init_Config();
DISABLE_INTERRUPTS;
bAvrUsbFlags.bits.bConfiguration = 1;
ENABLE_INTERRUPTS;
} else
USB_Stall_EP0();
}
void USBClassRequest_GetInterface(void)
{
unsigned char txdat = 0; /* Only/Current interface = 0 */
USB_Single_Transmit(&txdat, 1);
}
void USBClassRequest_SetInterface(void)
{
if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
USB_Single_Transmit(0, 0);
else
USB_Stall_EP0();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -