/************************************************************************
*作 者:温子祺 邮箱:k125008301@126.com
*文 件:usb.c
*说 明:代码优化,描述符架构更改为结构体形式
*修改日期:2009/12/06
--------------------------------------------------------------
*说 明:代码优化,修正少许BUG
*修改日期:2009/12/05
--------------------------------------------------------------
*说 明:能够正常发送数据和接收数据
*修改日期:2009/12/02
--------------------------------------------------------------
*创建日期:2009/11/30
*说 明:基本USB可以枚举成功
--------------------------------------------------------------
AVR是小端模式 USB小端模式 51 大端模式
所以要注意高低字节的问题
*************************************************************************/
#include "stc.h"
#include "global.h"
#include "usb.h"
/****************************************************************************************************
*
* 变量区
*
*****************************************************************************************************/
CONST USB_DEVICE_DESCRIPTOR USBDevDescriptor={
//设备描述符
sizeof(USB_DEVICE_DESCRIPTOR), //设备描述符长度,= 12H
USB_DEVICE_DESCRIPTOR_TYPE, //设备描述符类型,= 01H
0x00,0x01, //协议版本,= 1.10
USB_CLASS_CODE_TEST_CLASS_DEVICE, //测试设备类型, = 0DCH
0, 0, //设备子类,设备协议
EP0_PACKET_SIZE, //端点0最大数据包大小,= 10H
0x72,0x04, //PHILIPS公司的设备ID
0x02,0x00, //设备制造商定的产品ID
0x00,0x00, //设备系列号
0x01,0x02,0x03, //索引
1 //可能的配置数
};
CONST USB_DESCRIPTOR USBDescriptor ={
//配置描述符
{
sizeof(USB_CONFIGURATION_DESCRIPTOR), //配置描述符长度,= 09H
USB_CONFIGURATION_DESCRIPTOR_TYPE, //配置描述符类型,= 02H
CONFIG_DESCRIPTOR_LENGTH,0x00, //描述符总长度, = 002EH
1, //只支持1个接口
1, //配置值
0, //字符串描述符指针(无)
0x60, //自供电,支持远程唤醒
0x32 //最大功耗(100mA)
},
//HID类接口描述符
{
sizeof(USB_INTERFACE_DESCRIPTOR), //接口描述符长度,= 09H
USB_INTERFACE_DESCRIPTOR_TYPE, //接口描述符类型
0x00, //识别码
0x00, //代替数值
0x02, //支持的端点数
USB_DEVICE_CLASS_HUMAN_INTERFACE, //类别码,HID设备
HID_SUBCLASS_NONE, //子类别码
HID_PROTOCOL_NONE, //协议码
0x00 //索引
},
//HID描述符结构
{
sizeof(USB_HID_DESCRIPTOR), //描述符长度, = 09H
0x21, //描述符类型, = 21H
0x00, 0x01, //HID规范版本号, = 0100H
0x00, //国家代码
0x01, //所支持的其他类描述符个数,1个
0x22, //从属描述符类型,22H 表示报告描述符
0x34, 0x00 //从属描述符长度,0034H
},
{
// 逻辑端点 2 输入
{
sizeof(USB_ENDPOINT_DESCRIPTOR), // 端点描述符长度,= 07H
USB_ENDPOINT_DESCRIPTOR_TYPE, // 端点描述符类型,= 05H
0x82, // 端点2 IN
USB_ENDPOINT_TYPE_INTERRUPT, // 中断传输,= 03H
EP2_PACKET_SIZE,0x00, // 端点最大包的大小,= 0040H
10 // 批量传输时该值无效
},
// 逻辑端点 2 输出
{
sizeof(USB_ENDPOINT_DESCRIPTOR), // 端点描述符长度,= 07H
USB_ENDPOINT_DESCRIPTOR_TYPE, // 端点描述符类型,= 05H
0x2, // 端点2 OUT
USB_ENDPOINT_TYPE_INTERRUPT, // 中断传输,= 03H
EP2_PACKET_SIZE,0x00, // 端点最大包的大小,= 0040H
10 // 批量传输时该值无效
}
}
};
CONST UINT8 acUSBHidReportDescriptor[52] =
{
0x06,0xA0,0xFF, //用法页(FFA0h, vendor defined)
0x09, 0x01, //用法(vendor defined)
0xA1, 0x01, //集合(Application)
0x09, 0x02 , //用法(vendor defined)
0xA1, 0x00, //集合(Physical)
0x06,0xA1,0xFF, //用法页(vendor defined)
//输入报告
0x09, 0x03 , //用法(vendor defined)
0x09, 0x04, //用法(vendor defined)
0x15, 0x80, //逻辑最小值(0x80 or -128)
0x25, 0x7F, //逻辑最大值(0x7F or 127)
0x35, 0x00, //物理最小值(0)
0x45, 0xFF, //物理最大值(255)
0x75, 0x08, //报告长度Report size (8位)
0x95, 0x40, //报告数值(64 fields)
0x81, 0x02, //输入(data, variable, absolute)
//输出报告
0x09, 0x05, //用法(vendor defined)
0x09, 0x06, //用法(vendor defined)
0x15, 0x80, //逻辑最小值(0x80 or -128)
0x25, 0x7F, //逻辑最大值(0x7F or 127)
0x35, 0x00, //物理最小值(0)
0x45, 0xFF, //物理最大值(255)
0x75, 0x08, //报告长度(8位)
0x95, 0x40, //报告数值(64 fields)
0x91, 0x02, //输出(data, variable, absolute)
0xC0, //集合结束(Physical)
0xC0 //集合结束(Application)
};
//定义USB 标准设备请求 结构体
CONST FUNCTION_ARRAY StandardDeviceRequest[16]={
{USBPcGetStatus, "[00H]USB 标准设备请求:获取状态\r\n "},
{USBPcClearFeature, "[01H]USB 标准设备请求:清除特性\r\n "},
{NULL, "NULL "},
{USBPcSetFeature, "[03H]USB 标准设备请求:设置特性\r\n "},
{NULL, "NULL "},
{USBPcSetAddress, "[05H]USB 标准设备请求:设置地址\r\n "},
{USBPcGetDescriptor, "[06H]USB 标准设备请求:获取描述符\r\n"},
{USBPcSetDescriptor, "[07H]USB 标准设备请求:设置描述符\r\n"},
{USBPcGetConfiguration,"[08H]USB 标准设备请求:获取配置\r\n "},
{USBPcSetConfiguration,"[09H]USB 标准设备请求:设置配置\r\n "},
{USBPcGetInterface, "[0AH]USB 标准设备请求:获取接口\r\n "},
{USBPcSetInterface, "[0BH]USB 标准设备请求:设置接口\r\n "},
{NULL, "NULL "},
{NULL, "NULL "},
{NULL, "NULL "},
{NULL, "NULL "}
};
//定义USB HID类请求 结构体
CONST FUNCTION_ARRAY HidClassRequest[16]={
{USBPcGetReport, "[00H]USB HID类请求:获取报告\r\n "},
{USBPcGetIdle, "[01H]USB HID类请求:获取空闲状态\r\n "},
{USBPcGetProtocol, "[02H]USB HID类请求:获取协议\r\n "},
{NULL, "NULL "},
{NULL, "NULL "},
{NULL, "NULL "},
{NULL, "NULL "},
{NULL, "NULL "},
{NULL, "NULL "},
{USBPcSetReport, "[08H]USB HID类请求:设置报告\r\n "},
{USBPcSetIdle, "[09H]USB HID类请求:设置空闲状态\r\n "},
{USBPcSetProtocol, "[0AH]USB HID类请求:设置协议\r\n "},
{NULL, "NULL "},
{NULL, "NULL "},
{NULL, "NULL "},
{NULL, "NULL "}
};
//语言描述符
UINT8 CONST acUSBLanguageDesCriptor[4]={0x04,0x03,0x09,0x04};
//字符串描述符
UINT8 CONST acUSBSerialDesriptor[18] ={0x12,0x03,'C',0,'H',0,'3',0,'7',0,'2',0,'U',0,'S',0,'B',0};
//字符串描述符所用的语言种类
CONST UINT8 acUSBLanguageID[4]={0x04,0x03,0x09,0x04};
//设备序列号
CONST UINT8 acUSBDeviceSerialNumber[22]=
{22,0x03,'2',0,'0',0,'0',0,'7',0,'-',0,'0',0,'3',0,'-',0,'2',0,'3',0};
//厂商字符串
CONST UINT
评论4
最新资源