USB自定义HID设备实现-LPC1768

发布者:Qianfeng最新更新时间:2017-01-12 来源: eefocus关键字:USB  HID设备  LPC1768 手机看文章 扫描二维码
随时随地手机看文章

首先在之前鼠标的基础上修改设备描述符

#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(0x8888),                       //idVender字段。厂商ID号,我们这里取0x8888,仅供实验用。

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

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

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

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

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

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

};

 

 

 

//USB报告描述符的定义

const u8 HID_ReportDescriptor[]=

{

 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)

};

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

//输出报告也有64字节。至于这64字节的数据是干什么用的,就要由用户

//自己来决定了。

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

 

 

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(500),                  //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。,

   

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

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

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

                                            //但这里我们是自定义的HID设备,所以不使用子类。

   

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

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

                                            //自定义的HID设备,也不使用协议。

 

    0x00,                                   //iConfiguration字段。该接口的字符串索引值。这里没有,为0。

 

    /*********************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,

};

 

 

 

 

然后直接就可以在端点处理函数中处理数据了usbep1.c

#include "usbep1.h"

 

//发送完成置1 发送未完成置0

u8 sendOk = 1;

//接收到数据该设置为1,数据处理完成之后修改为0

u8 ReceiveOk = 0;

 

void usb_ep1_in_process(void)

{

    //设备向主机发送数据的回调函数

    sendOk = 1;//发送成功为1

}

 

 

void usb_ep1_out_process(void)

{

    ReceiveOk = 1;//有数据标志为1

}

 

发送数据和接收数据的函数如下

#include "usb_data_process.h"

 

 

//HID发送数据

//返回1发送失败 返回0发送成功

u8 HID_Send_Data(u8* buffer,u8 length)

{

    if(sendOk == 1)

    {

        if(length == 0)

        {

           

        }

        else

        {

            USB_WriteEP(HID_EP_IN, (u8*)buffer, length);

            sendOk = 0;//设置发送未完成状态,等待发送回调函数将数据发送到主机

        }

        return 0;

    }

    else

    {

        return 1;//上一次的数据还没发送出去,所以这次发送失败

    }

}

 

 

//HID接收数据处理

u8 HID_Receive_Data(u8* buffer)

{

    u16 length = 0;//获取接收到的数据长度

    u8 i = 0;

    if(ReceiveOk == 1)//有数据

    {

        length = USB_ReadEP(HID_EP_OUT,buffer);

        if(length == 0)return 0;

        else

        {

            ReceiveOk = 0;

            printf("hid receive : ");

            for(i = 0; i < length; i++)

            {

                printf("%c ",buffer[i]);

            }

            printf("\r\n");

           

            return length;//返回接收到的数据

        }

    }

    else

    {

        //没有数据,直接为0

        return 0;

    }

}

 

 

具体代码见链接

 http://download.csdn.net/detail/dengrengong/8523433


关键字:USB  HID设备  LPC1768 引用地址:USB自定义HID设备实现-LPC1768

上一篇:stm32-ucos移植lwip-1(raw)
下一篇:lpc1768usb使用-配置

推荐阅读最新更新时间:2024-03-16 15:30

USB的字符串描述
这个字符串描述理解得有点费劲,另外拿来说说! 以下是协议中的内容 9.6.7 String String descriptors are optional. As noted previously, if a device does not support string descriptors, all references to string descriptors within device, configuration, and interface descriptors must be reset to zero. String descriptors use UNICODE encodings as defined by
[嵌入式]
基于CY7C68013芯片高速USB数据采集系统方案设计
在图像处理、瞬态信号测量等一些高速、高精度的应用中,需要进行高速数据采集。USB 2.0接口以其高速率等优点渐有取代传统ISA及PCI数据总线的趋势,热插拔特性也使其成为各种PC外设的首选接口。EZ-USB FX2是Cypress公司推出的集成USB 2.0的 微处理器 ,它集成了USB 2.0收发器、SIE(串行接口引擎)、增强的8051 微控制器 和可编程的外围接口。本文将介绍基于EZ-USB FX2系列CY7C68013芯片的高速数据采集系统的设计,该系统具有限幅保护功能,固件和驱动程序的编写简便,能够完成对数据的高速采集和传送。   数据采集系统方案设计   数据采集系统的框图如图1所示,硬件电路如图2所示。其中,AD1
[嵌入式]
基于USB2.0的高速无线数传接收设备的数据接收存储方法
摘要:介绍了一种利用USB2.0接口芯片ISP1581并配合FPGA芯片EP1K30T144和DSP芯片TMS320F206实现无线数传接收设备中数据接收存储的方法。这种方法具有接口简单、使用方便等特点。 关键词:位同步 帧同步 USB2.0 差错控制 数据接收存储技术革新是信号采集处理领域内的一个重要课题。利用这种技术,可以把信号的实时采集和精确处理在时间上分为两个阶段,有利于获得令人更满意的处理结果。在无线数传接收设备中应用数据接收存储方法时,除了要满足数据传输速率和差错控制方面的要求外,还需要考虑如何使设备易于携带、接口简单、使用方便。 传统外设接口技术不但数据传输速率较低,独占中断、I/O地址、DMA通道等计算机系
[网络通信]
精通USB 2.0集线器电源管理
  USB集线器不仅可向下游的USB端口提供数据和电源,还允许主机通过软件对连接到下游端口的设备进行电源管理。USB 2.0集线器系统中的电源分配与管理堪称决定系统是否完全符合USB规范(2.0版)的主要因素。    电源分配   所有连接到USB端口的设备可配置成低功率或高功率,这取决于设备的电压和电流要求(如表1和表2所示)。      首先将所有USB设备枚举为低功率器件。主机在枚举完成后检查设备配置描述符的bMaxPower字段。如果bMaxPower表明该设备属于高功率,并且可提供相应电源,那么主机会允许将该设备转为高功率。   USB设备可被分为自供电和总线供电。图1给出了这两种集线器配置。       总线供电集线
[电源管理]
精通<font color='red'>USB</font> 2.0集线器电源管理
tiny6410无法使用usb下载问题
开发板:友善之臂Tiny6410 superboot: http://download.csdn.net/detail/u012016202/8564895 主机操作系统:Debian 7 两点声明: 1. 配套光盘里的superboot-6410是烧不进去的,原因不明,用上面的链接中的那个可以。 2. 至今依旧没有解决minitools无法连上开发板的问题,笔者使用的是superboot中的下载运行功能,习惯终端操作,这样反而更方便些。 正文: 我使用的是dnw工具,这里记录下整个折腾流程吧,不愿意往下看的读者也可以直接在这里 点击http://download.csdn.net/detail/u012016202
[单片机]
tiny6410无法使用<font color='red'>usb</font>下载问题
AMD、Nvidia欲建USB3.0 用户将受损
  6月9日消息,预计明年推出的USB 3.0标准被业界寄予厚望,而AMD和Nvidia指责英特尔在该标准的制定过程中排挤其它竞争对手,为此它们试图联手另起炉灶,创建第二套USB 3.0标准标准,然而这一“无奈”之举只能使用户受损。 据国外媒体报道,英特尔去年曾展示过USB 3.0连接器和附加卡。USB 3.0 是下一代高速连接标准,预计将于2009年推出。该标准的重要意义在于,未来的几乎所有的PC及外设之间的连接都必须遵循这一标准,该标准下的数据传输速率可达目前广泛采用的USB 2.0的10倍,即每秒达5GB。 早在1995年,USB标准的制定和推广机构——“USB执行论坛”就是由Intel联合微软等业界巨头组建的
[焦点新闻]
关于stm32 的 USB 转串口 virtual_Com_Port的例程的一些问题
当从虚拟串口到真实串口发数据时,没有错误,但发送一个稍微大一点的文件时(如1M),误码率很高。不知是为什么? 其中: int main(void) { #ifdef DEBUG debug(); #endif Set_System(); Set_USBClock(); USB_Interrupts_Config(); USB_Init(); while (1) { if (count_out != 0) { USB_To_USART_Send_Data(&buffer_out , count_out);//这句是发数据的函数,原型如下。 count_out = 0;
[单片机]
USB-GPIB控制器的硬件电路设计
引 言   USB是PC体系中一套全新的工业标准,通用可编程接口GPIB(General Programmable Interface BUS),是Cy-press公司在其EZ-USB FX以及FX2系列单片机里设计的一个可由用户编程的接口,具有快速、灵活等特点;可使用多种协议完成与外围器件的无缝连接,如EIDE/ATAPI、IEEE1284、Utopia等。对其可以根据需要进行编程,且运行中不需要CPU的干预,仅通过一些CPU标志和中断与增强型8051内核通信。作为自动化测试仪器的互联标准历史悠久,使用广泛,组建费用低廉且操作方便,特别是连接台式机的时候尤其显得灵活高效。在很多对测试速度要求不高以及对测试仪器体积不作要求的情况下
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved