📄 chap9.c
字号:
//============================================================================//
// 文件名: chap9.c
// 描 述: 处理USB协议的相关代码,用于PC机枚举USB外设时用
// 日 期: 2003/04/03
// 库文件: NONE
//=============================================================================//
#include "usbmain.h"
#include "usb11.h"
#include "D12CI.H"
#include "chap9.h"
extern void single_transmit(unsigned int * buf, unsigned int len);
extern void code_transmit(unsigned int * pRomData, unsigned long int len);
extern void stall_ep0(void);
extern void init_unconfig(void);
extern void init_config(void);
extern void init_config(void);
extern CONTROL_XFER ControlData;
extern EPPFLAGS bEPPflags;
#define NUM_ENDPOINTS 4
#define CONFIG_DESCRIPTOR_LENGTH (unsigned long int)(sizeof(USB_CONFIGURATION_DESCRIPTOR)+ sizeof(USB_INTERFACE_DESCRIPTOR)+(NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR)))
USB_DEVICE_DESCRIPTOR DeviceDescr =
{
sizeof(USB_DEVICE_DESCRIPTOR),
USB_DEVICE_DESCRIPTOR_TYPE,
0x00010000,
USB_CLASS_CODE_TEST_CLASS_DEVICE,
0,
0,
EP0_PACKET_SIZE,
0x00040071,
0x00060066,
0x00010000,
0, //Manufactory
0, //Product
0, //Serial Number
25 //Number of possible configurations
};
USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
{
sizeof(USB_CONFIGURATION_DESCRIPTOR),
USB_CONFIGURATION_DESCRIPTOR_TYPE,
CONFIG_DESCRIPTOR_LENGTH,
1,
1,
0,
0xa0,
//0x60,
0xf0
};
USB_INTERFACE_DESCRIPTOR InterfaceDescr =
{
sizeof(USB_INTERFACE_DESCRIPTOR),
USB_INTERFACE_DESCRIPTOR_TYPE,
0,
0,
NUM_ENDPOINTS,
USB_CLASS_CODE_TEST_CLASS_DEVICE,
USB_SUBCLASS_CODE_TEST_CLASS_D12,
USB_PROTOCOL_CODE_TEST_CLASS_D12,
0
};
USB_ENDPOINT_DESCRIPTOR EP1_TXDescr =
{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x81,
USB_ENDPOINT_TYPE_INTERRUPT,
EP1_PACKET_SIZE,
10
};
USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x1,
USB_ENDPOINT_TYPE_INTERRUPT,
EP1_PACKET_SIZE,
10
};
USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x82,
USB_ENDPOINT_TYPE_BULK,
EP2_PACKET_SIZE,
10
};
USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x2,
USB_ENDPOINT_TYPE_BULK,
EP2_PACKET_SIZE,
10
};
//=====================================================================
// 函数: reserved
// 语法: void reserved(void)
// 描述: 端点0禁通
// 参数: 无
// 返回: 无
//=====================================================================
void reserved(void)
{
stall_ep0();
}
//=====================================================================
// 函数: get_status
// 语法: void get_status(void)
// 描述: PC机获取USB设备的状态
// 参数: 无
// 返回: 无
//=====================================================================
void get_status(void)
{
unsigned int endp, txdat[2];
unsigned int bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
unsigned int c;
if(bRecipient == USB_RECIPIENT_DEVICE)
{
if(bEPPflags.bits.remote_wakeup == 1)
txdat[0] = 3;
else
txdat[0] = 1;
txdat[1]=0;
single_transmit(txdat, 2);
}
else if(bRecipient == USB_RECIPIENT_INTERFACE)
{
txdat[0]=0;
txdat[1]=0;
single_transmit(txdat, 2);
}
else if(bRecipient == USB_RECIPIENT_ENDPOINT)
{
endp = (unsigned int)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
if(ControlData.DeviceRequest.wIndex & (unsigned int)USB_ENDPOINT_DIRECTION_MASK)
c = D12_SelectEndpoint(endp*2 + 1); /* Control-in */
else
c = D12_SelectEndpoint(endp*2); /* Control-out */
if(c & D12_STALL)
txdat[0] = 1;
else
txdat[0] = 0;
txdat[1] = 0;
single_transmit(txdat, 2);
}
else
stall_ep0();
}
//=====================================================================
// 函数: clear_feature
// 语法: void clear_feature(void)
// 描述: 清除USB设备的特性
// 参数: 无
// 返回: 无
//=====================================================================
void clear_feature(void)
{
unsigned int endp;
unsigned int bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
if(bRecipient == USB_RECIPIENT_DEVICE&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
{
Interrupt_Off();
bEPPflags.bits.remote_wakeup = 0;
Interrupt_On();
single_transmit(0, 0);
}
else if(bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
{
endp = (unsigned int)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
if(ControlData.DeviceRequest.wIndex & (unsigned int)USB_ENDPOINT_DIRECTION_MASK)
// clear TX stall for IN on EPn.
D12_SetEndpointStatus(endp*2 + 1, 0);
else
// clear RX stall for OUT on EPn.
D12_SetEndpointStatus(endp*2, 0);
single_transmit(0, 0);
}
else
stall_ep0();
}
//=====================================================================
// 函数: set_feature
// 语法: void set_feature(void)
// 描述: 设置USB设备的特性
// 参数: 无
// 返回: 无
//=====================================================================
void set_feature(void)
{
unsigned int endp;
unsigned int bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
if (bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
{
Interrupt_Off();
bEPPflags.bits.remote_wakeup = 1;
Interrupt_On();
single_transmit(0, 0);
}
else if (bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
{
endp = (unsigned int)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
if (ControlData.DeviceRequest.wIndex & (unsigned int)USB_ENDPOINT_DIRECTION_MASK)
// clear TX stall for IN on EPn.
D12_SetEndpointStatus(endp*2 + 1, 1);
else
// clear RX stall for OUT on EPn.
D12_SetEndpointStatus(endp*2, 1);
single_transmit(0, 0);
}
else
stall_ep0();
}
//=====================================================================
// 函数: set_address
// 语法: void set_address(void)
// 描述: 设置USB设备的地址
// 参数: 无
// 返回: 无
//=====================================================================
void set_address(void)
{
D12_SetAddressEnable((unsigned int)(ControlData.DeviceRequest.wValue & DEVICE_ADDRESS_MASK), 1);
single_transmit(0, 0);
}
//=====================================================================
// 函数: get_descriptor
// 语法: void get_descriptor(void)
// 描述: 获取描述符
// 参数: 无
// 返回: 无
//=====================================================================
void get_descriptor(void)
{
unsigned int bDescriptor = MSB(ControlData.DeviceRequest.wValue);
if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) //0x01
{
code_transmit((unsigned int *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
}
else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)
{
code_transmit((unsigned int *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
}
else
stall_ep0();
}
//=====================================================================
// 函数: get_configuration
// 语法: void get_configuration(void)
// 描述: 获取配置值
// 参数: 无
// 返回: 无
//=====================================================================
void get_configuration(void)
{
unsigned int c = bEPPflags.bits.configuration;
single_transmit(&c, 1);
}
//=====================================================================
// 函数: set_configuration
// 语法: void set_configuration(void)
// 描述: 设置配置值
// 参数: 无
// 返回: 无
//=====================================================================
void set_configuration(void)
{
if (ControlData.DeviceRequest.wValue == 0)
{
//* put device in unconfigured state
single_transmit(0, 0);
Interrupt_Off();
bEPPflags.bits.configuration = 0;
Interrupt_On();
init_unconfig();
}
else if (ControlData.DeviceRequest.wValue == 1)
{
// Configure device
single_transmit(0, 0);
init_unconfig();
init_config();
Interrupt_Off();
bEPPflags.bits.configuration = 1;
Interrupt_On();
}
else
stall_ep0();
}
//=====================================================================
// 函数: get_interface
// 语法: void get_interface(void)
// 描述: PC获取接口值
// 参数: 无
// 返回: 无
//=====================================================================
void get_interface(void)
{
unsigned int txdat = 0; // Only/Current interface = 0
single_transmit(&txdat, 1);
}
//=====================================================================
// 函数: set_interface
// 语法: void set_interface(void)
// 描述: PC设置接口值
// 参数: 无
// 返回: 无
//=====================================================================
void set_interface(void)
{
if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
single_transmit(0, 0);
else
stall_ep0();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -