📄 usbchap9.c
字号:
/************************************************************************
*File : Usbchap9.c *
*By : hugang, hgx2000@mail.china.com *
************************************************************************/
#include "armusb.h"
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#define CONFIG_DESCRIPTOR_LENGTH sizeof(USB_CONFIGURATION_DESCRIPTOR) \
+ sizeof(USB_INTERFACE_DESCRIPTOR) \
+ (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR))
extern CONTROL_XFER ControlData;
extern IO_REQUEST ioRequest;
extern ARMUSBFLAGS bUSBFlags;
/******************************************以下为配置描述符**********************************************/
//设备描述符
USB_DEVICE_DESCRIPTOR DeviceDescr =
{
sizeof(USB_DEVICE_DESCRIPTOR), // 设备描述符长度, =0x12
USB_DEVICE_DESCRIPTOR_TYPE, // 设备描述符类型, =0x01
0x0110, // 协议版本, =1.10
USB_DEVICE_CLASS_RESERVED, // 设备类型
0, // 设备子类
0, // 设备协议
EP0_PACKET_SIZE, // 端点0最大数据包大小, =0x10
0x0471, // PHILIPS公司的设备ID
0x0888, // 设备制造商定的产品ID
0x0100, // 设备系列号
0, // iManufacturer
0, // iProduct
0, // iSerialNumber
1 // 可能配置数
};
//配置描述符
USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
{
sizeof(USB_CONFIGURATION_DESCRIPTOR), // 配置描述符的长度, =0x09
USB_CONFIGURATION_DESCRIPTOR_TYPE, // 配置描述符的类型, =0x02
CONFIG_DESCRIPTOR_LENGTH, // 描述符总长度 =0x2e
1, // 只支持1个接口
1, // 配置值
0, // 字符串描述符指针(无)
0x40, // 自供电
0x32 // 最大功耗(100mA)
};
//接口描述符
USB_INTERFACE_DESCRIPTOR InterfaceDescr =
{
sizeof(USB_INTERFACE_DESCRIPTOR), // 接口描述符长度, =0x09
USB_INTERFACE_DESCRIPTOR_TYPE, // 接口描述符类型, =0x04
0, // 接口数,只有1个
0, // 可选配置,只有1个
NUM_ENDPOINTS, // 除端点0的端点索引数目 =0x04
USB_CLASS_MASS_STORAGE, // 设备类型
USB_SUBCLASS_MASS_STORAGE, // 子类代码
USB_PROTOCOL_MASS_STORAGE, // 协议代码
0 // 字符串描述符指针(无)
};
//端点1发送描述符
USB_ENDPOINT_DESCRIPTOR EP1_TXDescr =
{
sizeof(USB_ENDPOINT_DESCRIPTOR), // 端点描述符长度, =0x07
USB_ENDPOINT_DESCRIPTOR_TYPE, // 端点描述符类型, =0x05
0x81, // 端点1IN
USB_ENDPOINT_TYPE_INTERRUPT, // 中断传输, =0x03
EP1_PACKET_SIZE, // 端点最大包的大小, =0x10
10 // 传输间隔时间, =10ms
};
//端点1接收描述符
USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
{
sizeof(USB_ENDPOINT_DESCRIPTOR), // 端点描述符长度, =0x07
USB_ENDPOINT_DESCRIPTOR_TYPE, // 端点描述符类型, =0x05
0x01, // 端点1OUT
USB_ENDPOINT_TYPE_INTERRUPT, // 中断传输, =0x03
EP1_PACKET_SIZE, // 端点最大包的大小, =0x10
10 // 传输间隔时间, =10ms
};
//端点2发送描述符
USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
{
sizeof(USB_ENDPOINT_DESCRIPTOR), // 端点描述符长度, =0x07
USB_ENDPOINT_DESCRIPTOR_TYPE, // 端点描述符类型, =0x05
0x82, // 端点2IN
USB_ENDPOINT_TYPE_BULK, // 批量传输, =0x02
EP2_PACKET_SIZE, // 端点最大包的大小, =0x40
10 // 批量传输时该设置无效
};
//端点2接收描述符
USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
{
sizeof(USB_ENDPOINT_DESCRIPTOR), // 端点描述符长度, =0x07
USB_ENDPOINT_DESCRIPTOR_TYPE, // 端点描述符类型, =0x05
0x02, // 端点2OUT
USB_ENDPOINT_TYPE_BULK, // 批量传输, =0x02
EP2_PACKET_SIZE, // 端点最大包的大小, =0x40
10 // 批量传输时该设置无效
};
USB_TOTAL_DESCRIPTOR TotalDescriptor=
{
sizeof(USB_CONFIGURATION_DESCRIPTOR), // 配置描述符的长度, =0x09
USB_CONFIGURATION_DESCRIPTOR_TYPE, // 配置描述符的类型, =0x02
CONFIG_DESCRIPTOR_LENGTH, // 描述符总长度 =0x2e
1, // 只支持1个接口
1, // 配置值
0, // 字符串描述符指针(无)
0x40, // 自供电
0x32, // 最大功耗(100mA)
sizeof(USB_INTERFACE_DESCRIPTOR), // 接口描述符长度, =0x09
USB_INTERFACE_DESCRIPTOR_TYPE, // 接口描述符类型, =0x04
0, // 接口数,只有1个
0, // 可选配置,只有1个
NUM_ENDPOINTS, // 除端点0的端点索引数目 =0x04
0xdc,//USB_CLASS_MASS_STORAGE, // 设备类型
0xa0,//USB_SUBCLASS_MASS_STORAGE, // 子类代码
0xb0,//USB_PROTOCOL_MASS_STORAGE, // 协议代码
0, // 字符串描述符指针(无)
sizeof(USB_ENDPOINT_DESCRIPTOR), // 端点描述符长度, =0x07
USB_ENDPOINT_DESCRIPTOR_TYPE, // 端点描述符类型, =0x05
0x81, // 端点1IN
USB_ENDPOINT_TYPE_INTERRUPT, // 中断传输, =0x03
EP1_PACKET_SIZE, // 端点最大包的大小, =0x10
10, // 传输间隔时间,
sizeof(USB_ENDPOINT_DESCRIPTOR), // 端点描述符长度, =0x07
USB_ENDPOINT_DESCRIPTOR_TYPE, // 端点描述符类型, =0x05
0x01, // 端点1OUT
USB_ENDPOINT_TYPE_INTERRUPT, // 中断传输, =0x03
EP1_PACKET_SIZE, // 端点最大包的大小, =0x10
10, // 传输间隔时间,
sizeof(USB_ENDPOINT_DESCRIPTOR), // 端点描述符长度, =0x07
USB_ENDPOINT_DESCRIPTOR_TYPE, // 端点描述符类型, =0x05
0x82, // 端点2IN
USB_ENDPOINT_TYPE_INTERRUPT, // 中断传输, =0x03
EP2_PACKET_SIZE, // 端点最大包的大小, =0x40
10, // 批量传输时该设置无效
sizeof(USB_ENDPOINT_DESCRIPTOR), // 端点描述符长度, =0x07
USB_ENDPOINT_DESCRIPTOR_TYPE, // 端点描述符类型, =0x05
0x02, // 端点2OUT
USB_ENDPOINT_TYPE_INTERRUPT, // 中断传输, =0x03
EP2_PACKET_SIZE, // 端点最大包的大小, =0x40
10 // 批量传输时该设置无效
};
/******************************以下为USB标准请求程序调用到的子程序***************************************/
/********************************************************************************************************
*保留子程序 *
********************************************************************************************************/
void reserved(void)
{
UsbStallEp0();
}
/********************************************************************************************************
*类型:1000-0000,0001,0010 *
*请求:获取状态 *
*值 :0 *
*索引:设备,接口,端点 *
*长度:2 *
*数据:设备,接口或端点的状态 *
********************************************************************************************************/
void UsbClassRequestGetStatus(void)
{
unsigned char endp, txdat[2];
// 读取请求类型中的接收方
unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT_MASK;
unsigned char c;
if (bRecipient == USB_RECIPIENT_DEVICE)
{ // 返回设备状态
if(bUSBFlags.bits.bRemote_Wakeup == 1)
txdat[0] = 3; // 支持远程唤醒,自供电
else
txdat[0] = 1; // 支持自供电
txdat[1]=0;
UsbSingleTransmit(txdat, 2);
DEBUGF(USB_CHAP9_DEBUG, ("GetStatus Device\n"));
}
else if (bRecipient == USB_RECIPIENT_INTERFACE)
{ // 返回接口状态
txdat[0]=0;
txdat[1]=0;
UsbSingleTransmit(txdat, 2); // 发送数据
DEBUGF(USB_CHAP9_DEBUG, ("GetStatus Interface\n"));
}
else if (bRecipient == USB_RECIPIENT_ENDPOINT)
{ // 返回端点状态
endp = (unsigned char)(ControlData.DeviceRequest.wIndex & USB_ENDPOINT_NUMBER_MASK);
if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
c = UsbSelectEndpoint(endp*2 + 1); // 读取输入端点状态
else
c = UsbSelectEndpoint(endp*2); // 读取输出端点状态
if(c & USB_D12_STALL)
txdat[0] = 1; // 端点禁止
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -