zoukankan      html  css  js  c++  java
  • lpc1768usb端点响应以及描述符定义

    #ifndef __USBEP1_H_

    #define __USBEP1_H_

     

    #include "usb.h"

    #include "usbhw.h"

    extern s8 sendBuffer[4];    //鼠标数据发送缓冲区

    extern u8 mouse_connect;    //鼠标连接标志

     

    void usb_ep1_in_process(void);

     

    void usb_ep1_out_process(void);

     

    #endif

    #include "usbep1.h"

     

     

    s8 sendBuffer[4] = {0}; //鼠标数据发送缓冲区

    u8 mouse_connect = 0;   //鼠标连接标志

     

    //针对接收的,暂时用不到

    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 out ");

    }

     

    #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标准设备描述符

    const U8 USB_DeviceDescriptor[] = {

     

        USB_DEVICE_DESC_SIZE,               //bLength字段。设备描述符的长度为18(0x12)字节

        USB_DEVICE_DESCRIPTOR_TYPE,         //bDescriptorType字段。设备描述符的编号为0x01

        WBVAL(0x0110),                      //bcdUSB字段。这里设置版本为USB1.1,即0x0110。

        0x00,                               //bDeviceClass字段。我们不在设备描述符中定义设备类,

        0x00,                               //bDeviceSubClass字段。bDeviceClass字段为0时,该字段也为0。

        0x00,                               //bDeviceProtocol字段。bDeviceClass字段为0时,该字段也为0。

        USB_MAX_PACKET0,                    //bMaxPacketSize0字段。端点0的最大包长度。

        WBVAL(0x3849),                      //idVender字段。厂商ID号,我们这里取0x8888,仅供实验用。

        WBVAL(0x1433),                      //idProduct字段。产品ID号,由于是第一个实验,我们这里取0x0001。。

        WBVAL(0x0100),                      // 设备的版本

        0x01,                               //iManufacturer字段。厂商字符串的索引值,为了方便记忆和管理

        0x02,                               //iProduct字段。产品字符串的索引值。刚刚用了1,这里就取2吧。

        0x03,                               //iSerialNumber字段。设备的序列号字符串索引值。

        0x01                                //bNumConfigurations字段。该设备所具有的配置数。

    };

     

     

     

    //USB报告描述符的定义

    const u8 HID_ReportDescriptor[]=

    {

     //每行开始的第一字节为该条目的前缀,前缀的格式为:

     //D7~D4:bTag。D3~D2:bType;D1~D0:bSize。以下分别对每个条目注释。

     

     //这是一个全局(bType为1)条目,选择用途页为普通桌面Generic Desktop Page(0x01)

     //后面跟一字节数据(bSize为1),后面的字节数就不注释了,

     //自己根据bSize来判断。

     0x05, 0x01, // USAGE_PAGE (Generic Desktop)

     

     //这是一个局部(bType为2)条目,说明接下来的应用集合用途用于鼠标

     0x09, 0x02, // USAGE (Mouse)

     

     //这是一个主条目(bType为0)条目,开集合,后面跟的数据0x01表示

     //该集合是一个应用集合。它的性质在前面由用途页和用途定义为

     //普通桌面用的鼠标。

     0xa1, 0x01, // COLLECTION (Application)

     

     //这是一个局部条目。说明用途为指针集合

     0x09, 0x01, //   USAGE (Pointer)

     

     //这是一个主条目,开集合,后面跟的数据0x00表示该集合是一个

     //物理集合,用途由前面的局部条目定义为指针集合。

     0xa1, 0x00, //   COLLECTION (Physical)

     

     //这是一个全局条目,选择用途页为按键(Button Page(0x09))

     0x05, 0x09, //     USAGE_PAGE (Button)

     

     //这是一个局部条目,说明用途的最小值为1。实际上是鼠标左键。

     0x19, 0x01, //     USAGE_MINIMUM (Button 1)

     

     //这是一个局部条目,说明用途的最大值为3。实际上是鼠标中键。

     0x29, 0x03, //     USAGE_MAXIMUM (Button 3)

     

     //这是一个全局条目,说明返回的数据的逻辑值(就是我们返回的数据域的值啦)

     //最小为0。因为我们这里用Bit来表示一个数据域,因此最小为0,最大为1。

     0x15, 0x00, //     LOGICAL_MINIMUM (0)

     

     //这是一个全局条目,说明逻辑值最大为1。

     0x25, 0x01, //     LOGICAL_MAXIMUM (1)

     

     //这是一个全局条目,说明数据域的数量为三个。

     0x95, 0x03, //     REPORT_COUNT (3)

     

     //这是一个全局条目,说明每个数据域的长度为1个bit。

     0x75, 0x01, //     REPORT_SIZE (1)

     

     //这是一个主条目,说明有3个长度为1bit的数据域(数量和长度

     //由前面的两个全局条目所定义)用来做为输入,

     //属性为:Data,Var,Abs。Data表示这些数据可以变动,Var表示

     //这些数据域是独立的,每个域表示一个意思。Abs表示绝对值。

     //这样定义的结果就是,第一个数据域bit0表示按键1(左键)是否按下,

     //第二个数据域bit1表示按键2(右键)是否按下,第三个数据域bit2表示

     //按键3(中键)是否按下。

     0x81, 0x02, //     INPUT (Data,Var,Abs)

     

     //这是一个全局条目,说明数据域数量为1个

     0x95, 0x01, //     REPORT_COUNT (1)

     

     //这是一个全局条目,说明每个数据域的长度为5bit。

     0x75, 0x05, //     REPORT_SIZE (5)

     

     //这是一个主条目,输入用,由前面两个全局条目可知,长度为5bit,

     //数量为1个。它的属性为常量(即返回的数据一直是0)。

     //这个只是为了凑齐一个字节(前面用了3个bit)而填充的一些数据

     //而已,所以它是没有实际用途的。

     0x81, 0x03, //     INPUT (Cnst,Var,Abs)

     

     //这是一个全局条目,选择用途页为普通桌面Generic Desktop Page(0x01)

     0x05, 0x01, //     USAGE_PAGE (Generic Desktop)

     

     //这是一个局部条目,说明用途为X轴

     0x09, 0x30, //     USAGE (X)

     

     //这是一个局部条目,说明用途为Y轴

     0x09, 0x31, //     USAGE (Y)

     

     //这是一个局部条目,说明用途为滚轮

     0x09, 0x38, //     USAGE (Wheel)

     

     //下面两个为全局条目,说明返回的逻辑最小和最大值。

     //因为鼠标指针移动时,通常是用相对值来表示的,

     //相对值的意思就是,当指针移动时,只发送移动量。

     //往右移动时,X值为正;往下移动时,Y值为正。

     //对于滚轮,当滚轮往上滚时,值为正。

     0x15, 0x81, //     LOGICAL_MINIMUM (-127)

     0x25, 0x7f, //     LOGICAL_MAXIMUM (127)

     

     //这是一个全局条目,说明数据域的长度为8bit。

     0x75, 0x08, //     REPORT_SIZE (8)

     

     //这是一个全局条目,说明数据域的个数为3个。

     0x95, 0x03, //     REPORT_COUNT (3)

     

     //这是一个主条目。它说明这三个8bit的数据域是输入用的,

     //属性为:Data,Var,Rel。Data说明数据是可以变的,Var说明

     //这些数据域是独立的,即第一个8bit表示X轴,第二个8bit表示

     //Y轴,第三个8bit表示滚轮。Rel表示这些值是相对值。

     0x81, 0x06, //     INPUT (Data,Var,Rel)

     

     //下面这两个主条目用来关闭前面的集合用。

     //我们开了两个集合,所以要关两次。bSize为0,所以后面没数据。

     0xc0,       //   END_COLLECTION

     0xc0        // END_COLLECTION

    };

    //通过上面的报告描述符的定义,我们知道返回的输入报告具有4字节。

    //第一字节的低3位用来表示按键是否按下的,高5位为常数0,无用。

    //第二字节表示X轴改的变量,第三字节表示Y轴的改变量,第四字节表示

    //滚轮的改变量。我们在中断端点1中应该要按照上面的格式返回实际的

    //鼠标数据。

    ///////////////////////////报告描述符完毕////////////////////////////

     

     

    const U16 HID_ReportDescSize = sizeof(HID_ReportDescriptor);

     

     

    //usb配置描述符

    const U8 USB_ConfigDescriptor[] = {

        /***************配置描述符***********************/

        USB_CONFIGUARTION_DESC_SIZE,       //bLength字段。配置描述符的长度为9字节。

        USB_CONFIGURATION_DESCRIPTOR_TYPE, //bDescriptorType字段。配置描述符编号为0x02。

        //wTotalLength字段。配置描述符集合的总长度,

        //包括配置描述符本身、接口描述符、类描述符、端点描述符等。

        WBVAL( 

        USB_CONFIGUARTION_DESC_SIZE +           //配置描述符

        USB_INTERFACE_DESC_SIZE     +           //接口1描述符

        9                           +           //hid描述符

        USB_ENDPOINT_DESC_SIZE      +           //端点描述符

        USB_ENDPOINT_DESC_SIZE                  //端点描述符

        ),

        0x01,                                   //bNumInterfaces字段。该配置包含的接口数,只有一个接口。

        0x01,                                   //bConfiguration字段。该配置的值为1。

        0x00,                                   //iConfigurationz字段,该配置的字符串索引。这里没有,为0。

        USB_CONFIG_BUS_POWERED ,                //bmAttributes字段,该设备的属性

        USB_CONFIG_POWER_MA(100),               //bMaxPower字段,该设备需要的最大电流量

     

        /*********************第一个接口描述符,hid设备**********************/

        USB_INTERFACE_DESC_SIZE,                //bLength字段。接口描述符的长度为9字节。

        USB_INTERFACE_DESCRIPTOR_TYPE,          //bDescriptorType字段。接口描述符的编号为0x04。

        0x00,                                   //bInterfaceNumber字段。该接口的编号,第一个接口,编号为0。

        0x00,                                   //bAlternateSetting字段。该接口的备用编号,为0。

        0x02,                                   //bNumEndpoints字段。非0端点的数目。该接口有2个批量端点

     

        USB_DEVICE_CLASS_HUMAN_INTERFACE,       //bInterfaceClass字段。该接口所使用的类。大容量存储设备接口类的代码为0x08。,

        0x01,                                   //bInterfaceSubClass字段,该接口所使用的子类。在HID1.1协议中,

                                                //只规定了一种子类:支持BIOS引导启动的子类。

                                                //USB键盘、鼠标属于该子类,子类代码为0x01。

        0x02,                                   ////bInterfaceProtocol字段。如果子类为支持引导启动的子类,

                                                //则协议可选择鼠标和键盘。键盘代码为0x01,鼠标代码为0x02。

        0x00,                                   //iConfiguration字段。

     

        /*********************HID报告描述符*************************/

        //bLength字段。本HID描述符下只有一个下级描述符。所以长度为9字节。

         0x09,

        

         //bDescriptorType字段。HID描述符的编号为0x21。

         0x21,

        

         //bcdHID字段。本协议使用的HID1.1协议。注意低字节在先。

         0x10,

         0x01,

        

         //bCountyCode字段。设备适用的国家代码,这里选择为美国,代码0x21。

         0x21,

        

         //bNumDescriptors字段。下级描述符的数目。我们只有一个报告描述符。

         0x01,

        

         //bDescriptorType字段。下级描述符的类型,为报告描述符,编号为0x22。

         0x22,

        

         //bDescriptorLength字段。下级描述符的长度。下级描述符为报告描述符。

         sizeof(HID_ReportDescriptor)&0xFF,

         (sizeof(HID_ReportDescriptor)>>8)&0xFF,

        /*********************端点描述符**********************************/

        /* 端点描述符 */

        USB_ENDPOINT_DESC_SIZE,                 //bLength字段。端点描述符长度为7字节。

        USB_ENDPOINT_DESCRIPTOR_TYPE,           //bDescriptorType字段。端点描述符编号为0x05。

        USB_ENDPOINT_IN(1),                     //bEndpointAddress字段。端点的地址。我们使用D12的输入端点1。

        USB_ENDPOINT_TYPE_INTERRUPT,            //bmAttributes字段。D1~D0为端点传输类型选择。

        WBVAL(0x0040),                          //wMaxPacketSize字段。该端点的最大包长。最大包长为64字节。

        0x01,                                   //bInterval字段。端点查询的时间,端点查询的时间,此处无意义。

        /***********************端点描述符*******************************************/

        USB_ENDPOINT_DESC_SIZE,                 //bLength字段。端点描述符长度为7字节。

        USB_ENDPOINT_DESCRIPTOR_TYPE,           //bDescriptorType字段。端点描述符编号为0x05。

        USB_ENDPOINT_OUT(1),                    //bEndpointAddress字段。端点的地址。我们使用D12的输入端点1。

        USB_ENDPOINT_TYPE_INTERRUPT,            //bmAttributes字段。D1~D0为端点传输类型选择。

        WBVAL(0x0040),                          //wMaxPacketSize字段。该端点的最大包长。最大包长为64字节。

        0x01,                                   //bInterval字段。端点查询的时间,端点查询的时间,此处无意义。

        //配置描述符扩充

        0x00

    };

     

    //usb字符串描述符

    const U8 USB_StringDescriptor[] = {

      0x04,                              /* bLength */

      USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */

      WBVAL(0x0409), /* US English */    /* wLANGID */

    /* Index 0x04: Manufacturer */

      0x1C,                              /* bLength */

      USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */

      'C',0,

      'E',0,

      'W',0,

      'A',0,

      'Y',0,

      ' ',0,

      'T',0,

      'E',0,

      'C',0,

      ' ',0,

      ' ',0,

      ' ',0,

      ' ',0,

    /* Index 0x20: Product */

      0x28,                              /* bLength */

      USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */

      'S',0,

      'Y',0,

      'S',0,

      'T',0,

      'E',0,

      'M',0,

      'T',0,

      'E',0,

      'S',0,

      'T',0,

      ' ',0,

      ' ',0,

      'G',0,

      'R',0,

      'O',0,

      'U',0,

      'P',0,

      '1',0,

      ' ',0,

    /* Index 0x48: Serial Number */

      0x1A,                              /* bLength */

      USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */

      'D',0,

      'E',0,

      'N',0,

      'G',0,

      'X',0,

      'I',0,

      'A',0,

      'O',0,

      'J',0,

      'U',0,

      'N',0,

      '0',0,

    /* Index 0x62: Interface 0, Alternate Setting 0 */

      0x0E,                              /* bLength */

      USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */

      'D',0,

      'E',0,

      'V',0,

      'I',0,

      'C',0,

      'E',0,

    };

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    SASS教程sass超详细教程
    浅谈angular2+ionic2
    深入理解JSON对象
    浅谈闭包
    响应式开发入门
    CSS之float属性归纳探讨
    新学期加油
    Good moring!
    async await的前世今生
    ASP.NET配置KindEditor文本编辑器-图文实例
  • 原文地址:https://www.cnblogs.com/dengxiaojun/p/4338696.html
Copyright © 2011-2022 走看看