📄 usb.c
字号:
/******************************************************************************
* Filename: usb.c
* Author: Tan Dewen
* Date: 2004.07.04
* This file contains USB standard request
******************************************************************************/
#include "usb.h"
#include "44b.h"
extern U8 DeviceDescriptor[];
extern U8 ConfigurationDescriptorGroup[];
extern U8 HidDescriptor[];
extern U8 HidReport[];
extern EPPFLAGS bEPPflags;
extern CONTROL_XFER ControlData;
extern U8 GenEpBuf[200];
void (*StandardFunctionTable[])(void) =
{
GetStatus, ClearFeature, USB_Reserved, SetFeature,
USB_Reserved, SetAddress, GetDescriptor, SetDescriptor,
GetConfiguration, SetConfiguration, GetInterface,
SetInterface, SyncFrame
};
void (*ClassFunctionTable[])(void) =
{
USB_Reserved, GetReport, GetIdle, GetProtocol,
USB_Reserved, USB_Reserved, USB_Reserved, USB_Reserved,
USB_Reserved, SetReport, SetIdle, SetProtocol
};
U8 DatBuf[2];
void GetStatus(void)
{
U8 endp;
ControlData.pData = DatBuf;
if( ControlData.DeviceRequest.wValue!=0 )
{
StallEndpoint0();
return;
}
if( ControlData.DeviceRequest.wLength!=2 )
{
StallEndpoint0();
return;
}
ControlData.wCount = 0;
switch( ControlData.DeviceRequest.bmRequestType & USB_REQ_TYPE_RECIP_MASK )
{
case USB_REQ_TYPE_DEVICE:
if( ControlData.DeviceRequest.wIndex!=0 )
{
StallEndpoint0();
return;
}
ControlData.wLength = 2;
DatBuf[0] = 1;//DEVICE_STATUS_SELF_POWER;
DatBuf[1] = 0;
//bEPPflags.bits.control_state = USB_TRANSMIT;
break;
case USB_REQ_TYPE_INTERFACE:
if( ControlData.DeviceRequest.wIndex!=0 )
{
StallEndpoint0();
return;
}
ControlData.wLength = 2;
DatBuf[0] = 0;
DatBuf[1] = 0;
//bEPPflags.bits.control_state = USB_TRANSMIT;
break;
case USB_REQ_TYPE_ENDPOINT:
endp = (U8)(ControlData.DeviceRequest.wIndex&3);
if( ControlData.DeviceRequest.wIndex &EP_DESC_ADDR_DIR_IN )
DatBuf[0] = D12_SelectEndpoint(endp*2+1);
else
DatBuf[0]= D12_SelectEndpoint(endp*2);
DatBuf[0] >>= 1;
DatBuf[0] &= 0x01;
DatBuf[1] = 0;
ControlData.wLength = 2;
break;
case USB_REQ_TYPE_OTHER:
default:
StallEndpoint0();
break;
}
}
//
void ClearFeature(void)
{
U8 endp;
switch( ControlData.DeviceRequest.bmRequestType & USB_REQ_TYPE_RECIP_MASK )
{
case USB_REQ_TYPE_DEVICE:
if( ControlData.DeviceRequest.wValue == FEATURE_REMOTE_WAKEUP )
{
bEPPflags.bits.remote_wakeup &= ~CFG_DESC_ATTR_REMOTE_WAKE;
TransmitNullResponseOnEp0();
}
break;
case USB_REQ_TYPE_ENDPOINT:
if( ControlData.DeviceRequest.wValue == FEATURE_ENDPOINT_STALL )
{
endp = (U8)(ControlData.DeviceRequest.wIndex);
if( ControlData.DeviceRequest.wIndex & EP_DESC_ADDR_DIR_IN )
D12_SetEndpointStatus(endp*2+1, 0);
else
D12_SetEndpointStatus(endp*2, 0);
TransmitNullResponseOnEp0();
}
break;
default:
StallEndpoint0();
}
return;
}
//
void SetFeature(void)
{
U8 endp;
switch( ControlData.DeviceRequest.bmRequestType & USB_REQ_TYPE_RECIP_MASK )
{
case USB_REQ_TYPE_DEVICE:
if( ControlData.DeviceRequest.wValue == FEATURE_REMOTE_WAKEUP )
{
bEPPflags.bits.remote_wakeup |= CFG_DESC_ATTR_REMOTE_WAKE;
TransmitNullResponseOnEp0();
}
break;
case USB_REQ_TYPE_ENDPOINT:
if( ControlData.DeviceRequest.wValue == FEATURE_ENDPOINT_STALL )
{
endp = (U8)(ControlData.DeviceRequest.wIndex);
if( ControlData.DeviceRequest.wIndex & EP_DESC_ADDR_DIR_IN )
D12_SetEndpointStatus(endp*2+1, 1);
else
D12_SetEndpointStatus(endp*2, 1);
TransmitNullResponseOnEp0();
}
break;
default:
StallEndpoint0();
}
return;
}
//
void SetAddress(void)
{
if( (ControlData.DeviceRequest.bmRequestType&USB_REQ_TYPE_RECIP_MASK)!=USB_REQ_TYPE_DEVICE )
{
StallEndpoint0();
return;
}
if( ControlData.DeviceRequest.wLength!=0 )
{
StallEndpoint0();
return;
}
if( ControlData.DeviceRequest.wIndex!=0 )
{
StallEndpoint0();
return;
}
if( ControlData.DeviceRequest.wValue<128 )
{
D12_SetAddressEnable( (U8)ControlData.DeviceRequest.wValue, 0x80);
TransmitNullResponseOnEp0();
init_config();
}
else
{
StallEndpoint0();
}
}
//
void GetDescriptor(void)
{
U8 i;
if( ControlData.DeviceRequest.wLength==0 )
{
StallEndpoint0();
return;
}
i = (U8)((ControlData.DeviceRequest.wValue>>8)&0xff);
switch(i)
{
case DESC_TYPE_DEVICE:
if( ControlData.DeviceRequest.wLength>SIZEOF_DEVICE_DESCRIPTOR )
ControlData.wLength = SIZEOF_DEVICE_DESCRIPTOR;
else
ControlData.wLength = ControlData.DeviceRequest.wLength;
ControlData.pData = DeviceDescriptor;
break;
case DESC_TYPE_CONFIG:
if( ControlData.DeviceRequest.wLength>SIZEOF_CONFIG_DESC_GROUP )
ControlData.wLength = SIZEOF_CONFIG_DESC_GROUP;
else
ControlData.wLength = ControlData.DeviceRequest.wLength;
ControlData.pData = ConfigurationDescriptorGroup;
break;
case DESC_TYPE_HID:
if( ControlData.DeviceRequest.wLength>SIZEOF_HID_DESCRIPTOR )
ControlData.wLength = SIZEOF_HID_DESCRIPTOR;
else
ControlData.wLength = ControlData.DeviceRequest.wLength;
ControlData.pData = HidDescriptor;
break;
case DESC_TYPE_REPORT:
if( ControlData.DeviceRequest.wLength>SIZEOF_REPORT_DESCRIPTOR )
ControlData.wLength = SIZEOF_REPORT_DESCRIPTOR;
else
ControlData.wLength = ControlData.DeviceRequest.wLength;
ControlData.pData = HidReport;
break;
case DESC_TYPE_STRING:
case DESC_TYPE_INTERFACE:
case DESC_TYPE_ENDPOINT:
default:
StallEndpoint0();
}
}
//
void SetDescriptor(void)
{
StallEndpoint0();
}
//
void GetConfiguration(void)
{
// check if recipient is device
if( (ControlData.DeviceRequest.bmRequestType&USB_REQ_TYPE_RECIP_MASK)!=USB_REQ_TYPE_DEVICE )
{
StallEndpoint0();
return;
}
// check if wIndex = 0x00
if( ControlData.DeviceRequest.wIndex!=0 )
{
StallEndpoint0();
return;
}
// check if wValue = 0
if( ControlData.DeviceRequest.wValue!=0 )
{
StallEndpoint0();
return;
}
// check if wLength = 1
if( ControlData.DeviceRequest.wLength!=1 )
{
StallEndpoint0();
return;
}
ControlData.wLength = 1;
ControlData.pData = &bEPPflags.bits.configuration;
}
//
void SetConfiguration(void)
{
// check if recipient is device
if( (ControlData.DeviceRequest.bmRequestType&USB_REQ_TYPE_RECIP_MASK)!=USB_REQ_TYPE_DEVICE )
{
StallEndpoint0();
return;
}
// check if wIndex = 0x00
if( ControlData.DeviceRequest.wIndex!=0 )
{
StallEndpoint0();
return;
}
// check if wLength = 0x00
if( ControlData.DeviceRequest.wLength!=0 )
{
StallEndpoint0();
return;
}
if( ControlData.DeviceRequest.wValue==0 )
{
TransmitNullResponseOnEp0();
bEPPflags.bits.configuration = 0;
init_unconfig();
return;
}
else if( ControlData.DeviceRequest.wValue==1 )
{
TransmitNullResponseOnEp0();
bEPPflags.bits.configuration = 1;
// init_unconfig();
init_config();
}
else
StallEndpoint0();
}
//
void GetInterface(void)
{
DatBuf[0] = 0;
ControlData.wLength = 1;
ControlData.wCount = 0;
ControlData.pData = DatBuf;
return;
}
//
void SetInterface(void)
{
if( ControlData.DeviceRequest.wValue ==0 && ControlData.DeviceRequest.wIndex==0 )
TransmitNullResponseOnEp0();
else
StallEndpoint0();
return;
}
//
void SyncFrame(void)
{
StallEndpoint0();
return;
}
//
void GetReport(void)
{
StallEndpoint0();
return;
}
//
void SetReport(void)
{
StallEndpoint0();
return;
}
//
void GetIdle(void)
{
StallEndpoint0();
return;
}
//
void SetIdle(void)
{
StallEndpoint0();
return;
}
//
void GetProtocol(void)
{
StallEndpoint0();
return;
}
//
void SetProtocol(void)
{
StallEndpoint0();
return;
}
//
void USB_Reserved(void)
{
StallEndpoint0();
return;
}
// Dispatch Device Request
void ControlHandler(void)
{
U8 type, req;
type = ControlData.DeviceRequest.bmRequestType&USB_REQ_TYPE_MASK;
req = ControlData.DeviceRequest.bRequest;
if( type == USB_REQ_TYPE_STANDARD )
(*StandardFunctionTable[req])();
else if( type == USB_REQ_TYPE_CLASS )
{
(*ClassFunctionTable[req])();
}
else
StallEndpoint0();
}
//
void StallEndpoint0(void)
{
D12_SetEndpointStatus(SELECT_CTR_OUT,1);
D12_SetEndpointStatus(SELECT_CTR_IN,1);
return;
}
//
void TransmitNullResponseOnEp0(void)
{
ControlData.wLength = 0;
ControlData.wCount = 0;
D12_WriteEndpoint(1, 0, 0);
}
void init_unconfig(void)
{
//unsigned char i;
D12_SetEndpointEnable(0); /* Disable all endpoints but EPP0. */
}
void init_config(void)
{
D12_SetEndpointEnable(1); /* Enable generic/iso endpoints. */
// D12_SetEndpointStatus(2, 0);
// D12_SetEndpointStatus(3, 0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -