⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbcore.lst

📁 USB多媒体键盘鼠标原程序代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 15:59:49 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE USBCORE
OBJECT MODULE PLACED IN UsbCore.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE UsbCore.c BROWSE DEBUG OBJECTEXTEND TABS(1)

stmt level    source

   1          /******************************************************************
   2             本程序只供学习使用,未经作者许可,不得用于其它任何用途
   3             
   4                  欢迎访问我的USB专区:http://group.ednchina.com/93/
   5                  欢迎访问我的blog:   http://www.ednchina.com/blog/computer00
   6                                       http://computer00.21ic.org
   7          
   8                  感谢PCB赞助商——电子园: http://bbs.cepark.com/
   9          
  10          UsbCore.c file
  11          
  12          作者:电脑圈圈
  13          建立日期: 2008.06.29
  14          修改日期: 2008.07.15
  15          版本:V1.1
  16          版权所有,盗版必究。
  17          Copyright(C) 电脑圈圈 2008-2018
  18          All rights reserved            
  19          *******************************************************************/
  20          
  21          #include "config.h"
  22          #include "pdiusbd12.h"
  23          #include "uart.h"
  24          #include "usbcore.h"
  25          #include "led.h"
  26          
  27          idata uint8 Buffer[16];  //读端点0用的缓冲区
  28          
  29          //USB设备请求的各字段
  30          uint8  bmRequestType;
  31          uint8  bRequest;
  32          uint16 wValue;
  33          uint16 wIndex;
  34          uint16 wLength;
  35          //当前发送数据的位置
  36          uint8 * pSendData;
  37          //需要发送数据的长度
  38          uint16 SendLength;
  39          //是否需要发送0数据包的标志。在USB控制传输的数据过程中,
  40          //当返回的数据包字节数少于最大包长时,会认为数据过程结束。
  41          //当请求的字节数比实际需要返回的字节数长,而实际返回的字节
  42          //数又刚好是端点0大小的整数倍时,就需要返回一个0长度的数据包
  43          //来结束数据过程。因此这里增加一个标志,供程序决定是否需要返回
  44          //一个0长度的数据包。
  45          uint8 NeedZeroPacket;
  46          
  47          //当前的配置值。只有在设置非0配置后
  48          uint8 ConfigValue;
  49          
  50          //端点1缓冲是否忙的标志。当缓冲区中有数据时,该标志为真。
  51          //当缓冲区中空闲时,该标志为假。
  52          uint8 Ep1InIsBusy;
  53          
  54          //USB设备描述符的定义
  55          code uint8 DeviceDescriptor[0x12]=  //设备描述符为18字节
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 15:59:49 PAGE 2   

  56          {
  57          //bLength字段。设备描述符的长度为18(0x12)字节
  58           0x12,
  59           
  60          //bDescriptorType字段。设备描述符的编号为0x01
  61           0x01,
  62           
  63          //bcdUSB字段。这里设置版本为USB1.1,即0x0110。
  64          //由于是小端结构,所以低字节在先,即0x10,0x01。
  65           0x10,
  66           0x01,
  67           
  68          //bDeviceClass字段。我们不在设备描述符中定义设备类,
  69          //而在接口描述符中定义设备类,所以该字段的值为0。
  70           0x00,
  71           
  72          //bDeviceSubClass字段。bDeviceClass字段为0时,该字段也为0。
  73           0x00,
  74           
  75          //bDeviceProtocol字段。bDeviceClass字段为0时,该字段也为0。
  76           0x00,
  77           
  78          //bMaxPacketSize0字段。PDIUSBD12的端点0大小的16字节。
  79           0x10,
  80           
  81          //idVender字段。厂商ID号,我们这里取0x8888,仅供实验用。
  82          //实际产品不能随便使用厂商ID号,必须跟USB协会申请厂商ID号。
  83          //注意小端模式,低字节在先。
  84           0x88,
  85           0x88,
  86           
  87          //idProduct字段。产品ID号,由于是第五个实验,我们这里取0x0005。
  88          //注意小端模式,低字节应该在前。
  89           0x05,
  90           0x00,
  91           
  92          //bcdDevice字段。取1.0版,即0x0100。
  93          //小端模式,低字节在先。
  94           0x00,
  95           0x01,
  96           
  97          //iManufacturer字段。厂商字符串的索引值,为了方便记忆和管理,
  98          //字符串索引就从1开始。
  99           0x01,
 100          
 101          //iProduct字段。产品字符串的索引值。刚刚用了1,这里就取2吧。
 102          //注意字符串索引值不要使用相同的值。
 103           0x02,
 104           
 105          //iSerialNumber字段。设备的序列号字符串索引值。
 106          //这里取3就可以了。
 107           0x03,
 108          
 109          //bNumConfigurations字段。该设备所具有的配置数。
 110          //我们只需要一种配置就行了,因此该值设置为1。
 111           0x01
 112          };
 113          //////////////////////////设备描述符完毕//////////////////////////////
 114          
 115          //USB报告描述符的定义
 116          //该报告描述符定义了两个顶层应用集合——键盘和用户控制设备。
 117          code uint8 ReportDescriptor[]=
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 15:59:49 PAGE 3   

 118          {
 119           //每行开始的第一字节为该条目的前缀,前缀的格式为:
 120           //D7~D4:bTag。D3~D2:bType;D1~D0:bSize。以下分别对每个条目注释。
 121           
 122          /************************USB键盘部分报告描述符**********************/
 123          /*******************************************************************/
 124           //这是一个全局(bType为1)条目,将用途页选择为普通桌面Generic Desktop Page(0x01)
 125           //后面跟一字节数据(bSize为1),后面的字节数就不注释了,
 126           //自己根据bSize来判断。
 127           0x05, 0x01, // USAGE_PAGE (Generic Desktop)
 128           
 129           //这是一个局部(bType为2)条目,说明接下来的集合用途用于键盘
 130           0x09, 0x06, // USAGE (Keyboard)
 131           
 132           //这是一个主条目(bType为0)条目,开集合,后面跟的数据0x01表示
 133           //该集合是一个应用集合。它的性质在前面由用途页和用途定义为
 134           //普通桌面用的键盘。
 135           0xa1, 0x01, // COLLECTION (Application)
 136           
 137           //报告ID,这里定义键盘报告的ID为1(报告ID 0是保留的)
 138           0x85, 0x01, //Report ID (1)
 139           
 140           //这是一个全局条目,选择用途页为键盘(Keyboard/Keypad(0x07))
 141           0x05, 0x07, //     USAGE_PAGE (Keyboard/Keypad)
 142          
 143           //这是一个局部条目,说明用途的最小值为0xe0。实际上是键盘左Ctrl键。
 144           //具体的用途值可在HID用途表中查看。
 145           0x19, 0xe0, //     USAGE_MINIMUM (Keyboard LeftControl)
 146           
 147           //这是一个局部条目,说明用途的最大值为0xe7。实际上是键盘右GUI键。
 148           0x29, 0xe7, //     USAGE_MAXIMUM (Keyboard Right GUI)
 149           
 150           //这是一个全局条目,说明返回的数据的逻辑值(就是我们返回的数据域的值)
 151           //最小为0。因为我们这里用Bit来表示一个数据域,因此最小为0,最大为1。
 152           0x15, 0x00, //     LOGICAL_MINIMUM (0)
 153           
 154           //这是一个全局条目,说明逻辑值最大为1。
 155           0x25, 0x01, //     LOGICAL_MAXIMUM (1)
 156           
 157           //这是一个全局条目,说明数据域的数量为八个。
 158           0x95, 0x08, //     REPORT_COUNT (8)
 159           
 160           //这是一个全局条目,说明每个数据域的长度为1个bit。
 161           0x75, 0x01, //     REPORT_SIZE (1)
 162           
 163           //这是一个主条目,说明有8个长度为1bit的数据域(数量和长度
 164           //由前面的两个全局条目所定义)用来做为输入,
 165           //属性为:Data,Var,Abs。Data表示这些数据可以变动,Var表示
 166           //这些数据域是独立的,每个域表示一个意思。Abs表示绝对值。
 167           //这样定义的结果就是,当某个域的值为1时,就表示对应的键按下。
 168           //bit0就对应着用途最小值0xe0,bit7对应着用途最大值0xe7。
 169           0x81, 0x02, //     INPUT (Data,Var,Abs)
 170           
 171           //这是一个全局条目,说明数据域数量为1个
 172           0x95, 0x01, //     REPORT_COUNT (1)
 173           
 174           //这是一个全局条目,说明每个数据域的长度为8bit。
 175           0x75, 0x08, //     REPORT_SIZE (8)
 176           
 177           //这是一个主条目,输入用,由前面两个全局条目可知,长度为8bit,
 178           //数量为1个。它的属性为常量(即返回的数据一直是0)。
 179           //该字节是保留字节(保留给OEM使用)。
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 15:59:49 PAGE 4   

 180           0x81, 0x03, //     INPUT (Cnst,Var,Abs)
 181           
 182           //这是一个全局条目。定义位域数量为6个。
 183           0x95, 0x06, //   REPORT_COUNT (6)
 184           
 185           //这是一个全局条目。定义每个位域长度为8bit。
 186           //其实这里这个条目不要也是可以的,因为在前面已经有一个定义
 187           //长度为8bit的全局条目了。
 188           0x75, 0x08, //   REPORT_SIZE (8)
 189           
 190           //这是一个全局条目,定义逻辑最小值为0。
 191           //同上,这里这个全局条目也是可以不要的,因为前面已经有一个
 192           //定义逻辑最小值为0的全局条目了。
 193           0x15, 0x00, //   LOGICAL_MINIMUM (0)
 194           
 195           //这是一个全局条目,定义逻辑最大值为255。
 196           0x25, 0xFF, //   LOGICAL_MAXIMUM (255)
 197           
 198           //这是一个全局条目,选择用途页为键盘。
 199           //前面已经选择过用途页为键盘了,所以该条目不要也可以。
 200           0x05, 0x07, //   USAGE_PAGE (Keyboard/Keypad)
 201           
 202           //这是一个局部条目,定义用途最小值为0(0表示没有键按下)
 203           0x19, 0x00, //   USAGE_MINIMUM (Reserved (no event indicated))
 204           
 205           //这是一个局部条目,定义用途最大值为0x65
 206           0x29, 0x65, //   USAGE_MAXIMUM (Keyboard Application)
 207           
 208           //这是一个主条目。它说明这六个8bit的数据域是输入用的,
 209           //属性为:Data,Ary,Abs。Data说明数据是可以变的,Ary说明
 210           //这些数据域是一个数组,即每个8bit都可以表示某个键值,
 211           //如果按下的键太多(例如超过这里定义的长度或者键盘本身无法
 212           //扫描出按键情况时),则这些数据返回全1(二进制),表示按键无效。
 213           //Abs表示这些值是绝对值。
 214           0x81, 0x00, //     INPUT (Data,Ary,Abs)
 215          
 216           //以下为输出报告的描述
 217           //逻辑最小值前面已经有定义为0了,这里可以省略。 
 218           //这是一个全局条目,说明逻辑值最大为1。
 219           0x25, 0x01, //     LOGICAL_MAXIMUM (1)
 220           
 221           //这是一个全局条目,说明数据域数量为5个。 
 222           0x95, 0x05, //   REPORT_COUNT (5)
 223           
 224           //这是一个全局条目,说明数据域的长度为1bit。
 225           0x75, 0x01, //   REPORT_SIZE (1)
 226           
 227           //这是一个全局条目,说明使用的用途页为指示灯(LED)
 228           0x05, 0x08, //   USAGE_PAGE (LEDs)
 229           
 230           //这是一个局部条目,说明用途最小值为数字键盘灯。
 231           0x19, 0x01, //   USAGE_MINIMUM (Num Lock)
 232           
 233           //这是一个局部条目,说明用途最大值为Kana灯。
 234           0x29, 0x05, //   USAGE_MAXIMUM (Kana)
 235           
 236           //这是一个主条目。定义输出数据,即前面定义的5个LED。
 237           0x91, 0x02, //   OUTPUT (Data,Var,Abs)
 238           
 239           //这是一个全局条目。定义位域数量为1个。
 240           0x95, 0x01, //   REPORT_COUNT (1)
 241           
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 15:59:49 PAGE 5   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -