本帖最后由 zdx818 于 2013-1-31 13:47 编辑
说了半天,都没有上程序
参考下我以前8位机的吧。
// From "USB Device Class Definition for Human Interface Devices (HID)".
// Section 7.1:
// "When a Get_Descriptor(Configuration) request is issued,
// it returns the Configuration descriptor, all Interface descriptors,
// all Endpoint descriptors, and the HID descriptor for each interface."
code const hid_configuration_descriptor HIDCONFIGDESC =
{
{ //配置描述符
0x09, // bLength //描述符大小(字节)
0x02, // bDescriptorType //常数(02h)
#ifdef _USER_EndPoint3_ //使用端点3
0x3000, //48个字节 // wTotalLength (= 9+9+9+7+7+7)//此配置传回的所有数据大小(字节)
#else
0x2900, //41个字节 // wTotalLength (= 9+9+9+7+7)/此配置传回的所有数据大小(字节)
#endif
0x01, // bNumInterfaces //此配置支持的接口数目
0x01, // bConfigurationValue //Set_Configuration与Get_Configuration要求的标识符
0x00, // iConfiguration //此配置的字符串描述符的索引值
0x80, // bmAttributes //自身电源/总线电源 以及远程唤醒设置
//0xfe // MaxPower (in 2mA units) //需要总线电源,表示法为(最大毫安/2)
0xc8 // MaxPower (in 2mA units) //需要总线电源,表示法为(最大毫安/2)
},
{ //接口描述符
0x09, // bLength //描述符大小(字节)
0x04, // bDescriptorType //常数(04h)
0x00, // bInterfaceNumber //识别此接口的数字
0x00, // bAlternateSetting //用来选择一个替代设置的数值
#ifdef _USER_EndPoint3_ //使用端点3
0x03, // bNumEndpoints //除了端点0外,支持的端点数值 1,2,3
#else
0x02, // bNumEndpoints //除了端点0外,支持的端点数值 1,2
#endif
0x03, // bInterfaceClass (3 = HID)//类别码
0x00, // bInterfaceSubClass //子类别码
0x00, // bInterfaceProcotol //协议码
0x00 // iInterface //此接口的字符串描述符的索引值
},
{ //HID类别描述符
0x09, // bLength //描述符大小(字节)
0x21, // bDescriptorType //常数(21h)表示HID类别
0x0101, // bcdHID //HID规范版本号码
0x00, // bCountryCode //硬件目的国家的识别数字(00)表示不支持的国家
0x01, // bNumDescriptors //支持的附属描述符数目
0x22, //报表 // bDescriptorType //类别描述符的类型(报表或实体)
HID_REPORT_DESCRIPTOR_SIZE_LE // wItemLength (tot. len. of report descriptor)//报表描述符的总长度
// 可选
}
,{ //端点1描述符,方向输出
0x07, // bLength //描述符大小(字节)
0x05, // bDescriptorType //常数(05h)
0x01, //OUT_EP1 // bEndpointAddress //端点数目与方向,位7是端点方向:Out等于0,In等于1
0x03, // bmAttributes //支持的传输类型,中断传输
EP1_PACKET_SIZE_LE, // MaxPacketSize (LITTLE ENDIAN)//支持的最大信息包
2 // bInterval //最大延迟/轮询时距/NAK速率
}
,{ // 端点2描述符,方向输入
0x07, // bLength //描述符大小(字节)
0x05, // bDescriptorType //常数(05h)
0x82, //IN_EP2 // bEndpointAddress //端点数目与方向,位7是端点方向:Out等于0,In等于1
0x03, // bmAttributes //支持的传输类型,中断传输
EP2_PACKET_SIZE_LE, // MaxPacketSize (LITTLE ENDIAN)//支持的最大信息包
3 // bInterval //最大延迟/轮询时距/NAK速率
}
#ifdef _USER_EndPoint3_ //使用端点3
,{ // 端点3描述符,方向输入
0x07, // bLength //描述符大小(字节)
0x05, // bDescriptorType //常数(05h)
0x83, //IN_EP3 // bEndpointAddress //端点数目与方向,位7是端点方向:Out等于0,In等于1
0x03, // bmAttributes //支持的传输类型,中断传输
EP3_PACKET_SIZE_LE, // MaxPacketSize (LITTLE ENDIAN)//支持的最大信息包
4 // bInterval //最大延迟/轮询时距/NAK速率
}
#endif
};
//报表
code const hid_report_descriptor HIDREPORTDESC =
{
0x06, //0000 0110 项目类型 01:Global 项目的数据字节数目 10:两字节
0x00, 0xff, // USAGE_PAGE (Vendor Defined Page 1)//未定义
0x09, 0x01, // USAGE (Vendor Usage 1) //保留
0xA1, 0x01, // COLLECTION (Application) //有共同用途
//OUTPUT 项目
0x85, Out_Report_ID, // Report ID //报表号码标识符ID
0x95, Out_Report_Size, // REPORT_COUNT () //项目的数据域位的数目 长度
0x75, 0x08, // REPORT_SIZE (8) //项目字段的大小(8位)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) //报表项目的最大数值
0x15, 0x00, // LOGICAL_MINIMUM (0) //报表项目的最小数值
0x09, 0x01, // USAGE (Vendor Usage 1)
0x91, 0x02, // OUTPUT (Data,Var,Abs) //输出:数据,变量,绝对
//INPUT 项目
0x85, In_Report_ID, // Report ID //报表号码标识符ID
0x95, In_Report_Size, // REPORT_COUNT () //项目的数据域位的数目 长度
0x75, 0x08, // REPORT_SIZE (8) //项目字段的大小(8位)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) //报表项目的最大数值
0x15, 0x00, // LOGICAL_MINIMUM (0) //报表项目的最小数值
0x09, 0x01, // USAGE (Vendor Usage 1)
0x81, 0x02, // INPUT (Data,Var,Abs) //输入:数据,变量,绝对
//FEATURE 项目
0x85, Feature_Report_ID, // Report ID //报表号码标识符ID
0x95, Feature_Report_Size, // REPORT_COUNT () //项目的数据域位的数目 长度
0x75, 0x08, // REPORT_SIZE (8) //项目字段的大小(8位)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) //报表项目的最大数值
0x15, 0x00, // LOGICAL_MINIMUM (0) //报表项目的最小数值
0x09, 0x01, // USAGE (Vendor Usage 1)
0xB1, 0x02, // FEATURE (Data,Var,Abs) //特征:数据,变量,绝对
0xC0 // end Application Collection
};
#define STR0LEN 4
code const unsigned char String0Desc [STR0LEN] =
{
STR0LEN, // bLength //描述符大小(字节)
0x03, // bDescriptorType //常数(03h)
#ifdef _USER_Chinese_PRC //0x0804表示中国
0x08, 0x04 //16位的语言码,0x0409表示English(United States)
#else
0x09, 0x04 //16位的语言码,0x0409表示English(United States)
#endif
}; // End of String0Desc
#define STR1LEN sizeof ("成都公司") * 2
code const unsigned char String1Desc [STR1LEN] =
{
STR1LEN+2, // bLength //描述符大小(字节)
0x03, // bDescriptorType //常数(03h)
0x10,0x62,0xFD,0x90,0x74,0x51,0x1A,0x4E,0xC,0x54,0x1B,0x52,0x50,0x96,0x6C,0x51,0xF8,0x53
,0, 0
}; // End of String1Desc
//code const unsigned char String1Desc0 [] ={"四川"};
#define STR2LEN sizeof ("兴业张开发") * 2
code const unsigned char String2Desc [STR2LEN] =
{
STR2LEN+2, // bLength //描述符大小(字节)
0x03, // bDescriptorType //常数(03h)
0x74,0x51,0x1A,0x4E,0xC,0x54,0x1B,0xE3,0x4E,0x65,0x79,0x0,0x5F,0xD1,0x53
,0, 0
}; // End of String2Desc
//#define STR3LEN sizeof ("01335329") * 2
#define STR3LEN sizeof ("兴业") * 2
code const unsigned char String3Desc [STR3LEN] =
{
STR3LEN+2, // bLength //描述符大小(字节)
0x03, // bDescriptorType //常数(03h)
0x74,0x51,0x1A,0x4E,0x1B,0x52
,0, 0
}; // End of String1Desc
unsigned char* const STRINGDESCTABLE [] =
{
String0Desc,
String2Desc,
String1Desc,
String3Desc
};
字符串删除了一些。
|