lpc1768usb端點響應(yīng)以及描述符定義
#ifndef __USBEP1_H_
#define __USBEP1_H_
#include "usb.h"
#include "usbhw.h"
extern s8 sendBuffer[4]; //鼠標(biāo)數(shù)據(jù)發(fā)送緩沖區(qū)
extern u8 mouse_connect; //鼠標(biāo)連接標(biāo)志
void usb_ep1_in_process(void);
void usb_ep1_out_process(void);
#endif
#include "usbep1.h"
s8 sendBuffer[4]={0};//鼠標(biāo)數(shù)據(jù)發(fā)送緩沖區(qū)
u8 mouse_connect=0; //鼠標(biāo)連接標(biāo)志
//針對接收的,暫時用不到
u8 readBuffer[4]={0};
u8 readLength=0;
void usb_ep1_in_process(void)
{
mouse_connect=1;
USB_WriteEP(HID_EP_IN,(u8*)sendBuffer,sizeof(sendBuffer));
sendBuffer[0]=0;
sendBuffer[1]=0;
sendBuffer[2]=0;
sendBuffer[3]=0;
}
void usb_ep1_out_process(void)
{
readLength=USB_ReadEP(HID_EP_OUT,readBuffer);
usb_debug_printf("usb ep1 outrn");
}
#ifndef __USBDESC_H__
#define __USBDESC_H__
#include "usb.h"
#include "usbcfg.h"
#include "hid.h"
#define WBVAL(x) (x & 0xFF),((x >> 8) & 0xFF)
#define USB_DEVICE_DESC_SIZE (sizeof(USB_DEVICE_DESCRIPTOR))
#define USB_CONFIGUARTION_DESC_SIZE (sizeof(USB_CONFIGURATION_DESCRIPTOR))
#define USB_INTERFACE_DESC_SIZE (sizeof(USB_INTERFACE_DESCRIPTOR))
#define USB_ENDPOINT_DESC_SIZE (sizeof(USB_ENDPOINT_DESCRIPTOR))
#define HID_DESC_OFFSET 0x0012
#define HID_DESC_SIZE (sizeof(HID_DESCRIPTOR))
#define HID_REPORT_DESC_SIZE (sizeof(HID_ReportDescriptor))
extern const U8 USB_DeviceDescriptor[];
extern const U8 USB_ConfigDescriptor[];
extern const U8 USB_StringDescriptor[];
extern const U8 HID_ReportDescriptor[];
extern const U16 HID_ReportDescSize;
#endif
#include "usbdesc.h"
//usb標(biāo)準(zhǔn)設(shè)備描述符
const U8 USB_DeviceDescriptor[]={
USB_DEVICE_DESC_SIZE, //bLength字段。設(shè)備描述符的長度為18(0x12)字節(jié)
USB_DEVICE_DESCRIPTOR_TYPE, //bDescriptorType字段。設(shè)備描述符的編號為0x01
WBVAL(0x0110), //bcdUSB字段。這里設(shè)置版本為USB1.1,即0x0110。
0x00, //bDeviceClass字段。我們不在設(shè)備描述符中定義設(shè)備類,
0x00, //bDeviceSubClass字段。bDeviceClass字段為0時,該字段也為0。
0x00, //bDeviceProtocol字段。bDeviceClass字段為0時,該字段也為0。
USB_MAX_PACKET0, //bMaxPacketSize0字段。端點0的最大包長度。
WBVAL(0x3849), //idVender字段。廠商ID號,我們這里取0x8888,僅供實驗用。
WBVAL(0x1433), //idProduct字段。產(chǎn)品ID號,由于是第一個實驗,我們這里取0x0001。。
WBVAL(0x0100), // 設(shè)備的版本
0x01, //iManufacturer字段。廠商字符串的索引值,為了方便記憶和管理
0x02, //iProduct字段。產(chǎn)品字符串的索引值。剛剛用了1,這里就取2吧。
0x03, //iSerialNumber字段。設(shè)備的序列號字符串索引值。
0x01 //bNumConfigurations字段。該設(shè)備所具有的配置數(shù)。
};
//USB報告描述符的定義
const u8 HID_ReportDescriptor[]=
{
//每行開始的第一字節(jié)為該條目的前綴,前綴的格式為:
//D7~D4:bTag。D3~D2:bType;D1~D0:bSize。以下分別對每個條目注釋。
//這是一個全局(bType為1)條目,選擇用途頁為普通桌面Generic Desktop Page(0x01)
//后面跟一字節(jié)數(shù)據(jù)(bSize為1),后面的字節(jié)數(shù)就不注釋了,
//自己根據(jù)bSize來判斷。
0x05,0x01,// USAGE_PAGE (Generic Desktop)
//這是一個局部(bType為2)條目,說明接下來的應(yīng)用集合用途用于鼠標(biāo)
0x09,0x02,// USAGE (Mouse)
//這是一個主條目(bType為0)條目,開集合,后面跟的數(shù)據(jù)0x01表示
//該集合是一個應(yīng)用集合。它的性質(zhì)在前面由用途頁和用途定義為
//普通桌面用的鼠標(biāo)。
0xa1,0x01,// COLLECTION (Application)
//這是一個局部條目。說明用途為指針集合
0x09,0x01,// USAGE (Pointer)
//這是一個主條目,開集合,后面跟的數(shù)據(jù)0x00表示該集合是一個
//物理集合,用途由前面的局部條目定義為指針集合。
0xa1,0x00,// COLLECTION (Physical)
//這是一個全局條目,選擇用途頁為按鍵(Button Page(0x09))
0x05,0x09,// USAGE_PAGE (Button)
//這是一個局部條目,說明用途的最小值為1。實際上是鼠標(biāo)左鍵。
0x19,0x01,// USAGE_MINIMUM (Button 1)
//這是一個局部條目,說明用途的最大值為3。實際上是鼠標(biāo)中鍵。
0x29,0x03,// USAGE_MAXIMUM (Button 3)
//這是一個全局條目,說明返回的數(shù)據(jù)的邏輯值(就是我們返回的數(shù)據(jù)域的值啦)
//最小為0。因為我們這里用Bit來表示一個數(shù)據(jù)域,因此最小為0,最大為1。
0x15,0x00,// LOGICAL_MINIMUM (0)
//這是一個全局條目,說明邏輯值最大為1。
0x25,0x01,// LOGICAL_MAXIMUM (1)
//這是一個全局條目,說明數(shù)據(jù)域的數(shù)量為三個。
0x95,0x03,// REPORT_COUNT (3)
//這是一個全局條目,說明每個數(shù)據(jù)域的長度為1個bit。
0x75,0x01,// REPORT_SIZE (1)
//這是一個主條目,說明有3個長度為1bit的數(shù)據(jù)域(數(shù)量和長度
//由前面的兩個全局條目所定義)用來做為輸入,
//屬性為:Data,Var,Abs。Data表示這些數(shù)據(jù)可以變動,Var表示
//這些數(shù)據(jù)域是獨立的,每個域表示一個意思。Abs表示絕對值。
//這樣定義的結(jié)果就是,第一個數(shù)據(jù)域bit0表示按鍵1(左鍵)是否按下,
//第二個數(shù)據(jù)域bit1表示按鍵2(右鍵)是否按下,第三個數(shù)據(jù)域bit2表示
//按鍵3(中鍵)是否按下。
0x81,0x02,// INPUT (Data,Var,Abs)
//這是一個全局條目,說明數(shù)據(jù)域數(shù)量為1個
0x95,0x01,// REPORT_COUNT (1)
//這是一個全局條目,說明每個數(shù)據(jù)域的長度為5bit。
0x75,0x05,// REPORT_SIZE (5)
//這是一個主條目,輸入用,由前面兩個全局條目可知,長度為5bit,
//數(shù)量為1個。它的屬性為常量(即返回的數(shù)據(jù)一直是0)。
//這個只是為了湊齊一個字節(jié)(前面用了3個bit)而填充的一些數(shù)據(jù)
//而已,所以它是沒有實際用途的。
0x81,0x03,// INPUT (Cnst,Var,Abs)
//這是一個全局條目,選擇用途頁為普通桌面Generic Desktop Page(0x01)
0x05,0x01,// USAGE_PAGE (Generic Desktop)
//這是一個局部條目,說明用途為X軸
0x09, 0x30, //