/******************************************************************
本程序只供学习使用,未经作者许可,不得用于其它任何用途
欢迎访问我的USB专区:http://group.ednchina.com/93/
欢迎访问我的blog: http://www.ednchina.com/blog/computer00
http://computer00.21ic.org
感谢PCB赞助商——电子园: http://bbs.cepark.com/
UsbCore.c file
作者:电脑圈圈
建立日期: 2008.06.29
修改日期: 2008.07.10
版本:V1.1
版权所有,盗版必究。
Copyright(C) 电脑圈圈 2008-2018
All rights reserved
*******************************************************************/
#include "config.h"
#include "pdiusbd12.h"
#include "uart.h"
#include "usbcore.h"
idata uint8 Buffer[16]; //读端点0用的缓冲区
//USB设备请求的各字段
uint8 bmRequestType;
uint8 bRequest;
uint16 wValue;
uint16 wIndex;
uint16 wLength;
//当前发送数据的位置
uint8 * pSendData;
//需要发送数据的长度
uint16 SendLength;
//是否需要发送0数据包的标志。在USB控制传输的数据过程中,
//当返回的数据包字节数少于最大包长时,会认为数据过程结束。
//当请求的字节数比实际需要返回的字节数长,而实际返回的字节
//数又刚好是端点0大小的整数倍时,就需要返回一个0长度的数据包
//来结束数据过程。因此这里增加一个标志,供程序决定是否需要返回
//一个0长度的数据包。
uint8 NeedZeroPacket;
//当前的配置值。只有在设置非0配置后
uint8 ConfigValue;
//端点1缓冲是否忙的标志。当缓冲区中有数据时,该标志为真。
//当缓冲区中空闲时,该标志为假。
uint8 Ep1InIsBusy;
//USB设备描述符的定义
code uint8 DeviceDescriptor[0x12]= //设备描述符为18字节
{
//bLength字段。设备描述符的长度为18(0x12)字节
0x12,
//bDescriptorType字段。设备描述符的编号为0x01
0x01,
//bcdUSB字段。这里设置版本为USB1.1,即0x0110。
//由于是小端结构,所以低字节在先,即0x10,0x01。
0x10,
0x01,
//bDeviceClass字段。我们不在设备描述符中定义设备类,
//而在接口描述符中定义设备类,所以该字段的值为0。
0x00,
//bDeviceSubClass字段。bDeviceClass字段为0时,该字段也为0。
0x00,
//bDeviceProtocol字段。bDeviceClass字段为0时,该字段也为0。
0x00,
//bMaxPacketSize0字段。PDIUSBD12的端点0大小的16字节。
0x10,
//idVender字段。厂商ID号,我们这里取0x8888,仅供实验用。
//实际产品不能随便使用厂商ID号,必须跟USB协会申请厂商ID号。
//注意小端模式,低字节在先。
0x88,
0x88,
//idProduct字段。产品ID号,由于是第一个实验,我们这里取0x0001。
//注意小端模式,低字节应该在前。
0x01,
0x00,
//bcdDevice字段。我们这个USB鼠标刚开始做,就叫它1.0版吧,即0x0100。
//小端模式,低字节在先。
0x00,
0x01,
//iManufacturer字段。厂商字符串的索引值,为了方便记忆和管理,
//字符串索引就从1开始吧。
0x01,
//iProduct字段。产品字符串的索引值。刚刚用了1,这里就取2吧。
//注意字符串索引值不要使用相同的值。
0x02,
//iSerialNumber字段。设备的序列号字符串索引值。
//这里取3就可以了。
0x03,
//bNumConfigurations字段。该设备所具有的配置数。
//我们只需要一种配置就行了,因此该值设置为1。
0x01
};
//////////////////////////设备描述符完毕//////////////////////////////
//USB报告描述符的定义
code uint8 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中应该要按照上面的格式返回实际的
//鼠标数据。
///////////////////////////报告描述符完毕////////////////////////////
//USB配置描述符集合的定义
//配置描述符总长度为9+9+9+7字节
code uint8 ConfigurationDescriptor[9+9+9+7]=
{
/***************配置描述符***********************/
//bLength字段。配置描述符的长度为9字节。
0x09,
//bDescriptorType字段。配置描述符编号为0x02。
0x02,
//wTotalLength字段。配置描述符集合的总长度,
//包括配置描述符本身、接口描述符、类描述符、端点描述符等。
sizeof(ConfigurationDescriptor)&0xFF, //低字节
(sizeof(ConfigurationDescriptor)>>8)&0xFF, //高字节
//bNumInterfaces字段。该配置包含的接口数,只有一个接口。
0x01,
//bConfiguration字段。该配置的值为1。
0x01,
//iConfigurationz字段,该配置的字符串索引。这里没有,为0。
0x00,
//bmAttributes字段,该设备的属性。由于我们的板子是总线供电的,
//并且我们不想实现远程唤醒
没有合适的资源?快使用搜索试试~ 我知道了~
用51单位片机做USB鼠标
共35个文件
h:7个
lst:6个
obj:6个
4星 · 超过85%的资源 需积分: 15 34 下载量 200 浏览量
2009-07-22
19:36:26
上传
评论
收藏 127KB RAR 举报
温馨提示
用51单片机加PDIUSBD12做USB鼠标的全部原程序代码加电路图 用51单片机加PDIUSBD12做USB鼠标的全部原程序代码加电路图
资源推荐
资源详情
资源评论
收起资源包目录
UsbMouse.rar (35个子文件)
原理图.pdf 26KB
UsbMouse
STARTUP.LST 11KB
UART.LST 8KB
PDIUSBD12.LST 14KB
UsbMouse.hex 16KB
UART.OBJ 9KB
MyType.h 973B
UsbMouse.Uv2 2KB
UsbMouse.lnp 142B
UsbCore.h 2KB
Main.c 6KB
PDIUSBD12.h 3KB
Main.LST 9KB
STARTUP.A51 5KB
Key.OBJ 6KB
config.h 825B
Key.c 3KB
Main.OBJ 17KB
UsbMouse.M51 47KB
Key.LST 6KB
UsbMouse_Opt.Bak 3KB
PDIUSBD12.OBJ 16KB
UsbCore.LST 62KB
UART.h 881B
UsbCore.c 31KB
STARTUP.OBJ 749B
UsbMouse.Opt 3KB
LED.h 1KB
UsbCore.OBJ 25KB
UsbMouse_Uv2.Bak 2KB
PDIUSBD12.c 9KB
UART.c 5KB
Key.h 1KB
UsbMouse 64KB
UsbMouse.plg 212B
共 35 条
- 1
资源评论
- 嗯比2013-04-07好,太好啦!,对学习很有帮助
- Jefferson2502014-09-24相比其他资料挺详细了,但是如果能把各个芯片的作用说明一下就好了
- taotian832011-11-04资料比较完整,包含电路原理图和全套代码。对我学习USB鼠标确实有帮助,希望再增加些说明。
longonly120
- 粉丝: 4
- 资源: 17
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功