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

📄 usbcore.lst

📁 2010年新增TX-1C程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
C51 COMPILER V8.02   USBCORE                                                               06/17/2010 09:52:10 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE USBCORE
OBJECT MODULE PLACED IN UsbCore.OBJ
COMPILER INVOKED BY: D:\处理软件\keil\C51\BIN\C51.EXE UsbCore.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /******************************************************************
   2             本程序只供学习使用,未经作者许可,不得用于其它任何用途
   3                                           
   4                                           欢迎光临天祥电子  www.txmcu.cn
   5                    
   6          *******************************************************************/
   7          
   8          #include "config.h"
   9          #include "pdiusbd12.h"
  10          #include "uart.h"
  11          #include "usbcore.h"
  12          
  13          idata uint8 Buffer[16];  //读端点0用的缓冲区
  14          
  15          //USB设备请求的各字段
  16          uint8  bmRequestType;
  17          uint8  bRequest;
  18          uint16 wValue;
  19          uint16 wIndex;
  20          uint16 wLength;
  21          //当前发送数据的位置
  22          uint8 * pSendData;
  23          //需要发送数据的长度
  24          uint16 SendLength;
  25          //是否需要发送0数据包的标志。在USB控制传输的数据过程中,
  26          //当返回的数据包字节数少于最大包长时,会认为数据过程结束。
  27          //当请求的字节数比实际需要返回的字节数长,而实际返回的字节
  28          //数又刚好是端点0大小的整数倍时,就需要返回一个0长度的数据包
  29          //来结束数据过程。因此这里增加一个标志,供程序决定是否需要返回
  30          //一个0长度的数据包。
  31          uint8 NeedZeroPacket;
  32          
  33          //当前的配置值。只有在设置非0配置后
  34          uint8 ConfigValue;
  35          
  36          //端点1缓冲是否忙的标志。当缓冲区中有数据时,该标志为真。
  37          //当缓冲区中空闲时,该标志为假。
  38          uint8 Ep1InIsBusy;
  39          
  40          //USB设备描述符的定义
  41          code uint8 DeviceDescriptor[0x12]=  //设备描述符为18字节
  42          {
  43          //bLength字段。设备描述符的长度为18(0x12)字节
  44           0x12,
  45           
  46          //bDescriptorType字段。设备描述符的编号为0x01
  47           0x01,
  48           
  49          //bcdUSB字段。这里设置版本为USB1.1,即0x0110。
  50          //由于是小端结构,所以低字节在先,即0x10,0x01。
  51           0x10,
  52           0x01,
  53           
  54          //bDeviceClass字段。我们不在设备描述符中定义设备类,
  55          //而在接口描述符中定义设备类,所以该字段的值为0。
C51 COMPILER V8.02   USBCORE                                                               06/17/2010 09:52:10 PAGE 2   

  56           0x00,
  57           
  58          //bDeviceSubClass字段。bDeviceClass字段为0时,该字段也为0。
  59           0x00,
  60           
  61          //bDeviceProtocol字段。bDeviceClass字段为0时,该字段也为0。
  62           0x00,
  63           
  64          //bMaxPacketSize0字段。PDIUSBD12的端点0大小的16字节。
  65           0x10,
  66           
  67          //idVender字段。厂商ID号,我们这里取0x8888,仅供实验用。
  68          //实际产品不能随便使用厂商ID号,必须跟USB协会申请厂商ID号。
  69          //注意小端模式,低字节在先。
  70           0x88,
  71           0x88,
  72           
  73          //idProduct字段。产品ID号,由于是第一个实验,我们这里取0x0001。
  74          //注意小端模式,低字节应该在前。
  75           0x01,
  76           0x00,
  77           
  78          //bcdDevice字段。我们这个USB鼠标刚开始做,就叫它1.0版吧,即0x0100。
  79          //小端模式,低字节在先。
  80           0x00,
  81           0x01,
  82           
  83          //iManufacturer字段。厂商字符串的索引值,为了方便记忆和管理,
  84          //字符串索引就从1开始吧。
  85           0x01,
  86          
  87          //iProduct字段。产品字符串的索引值。刚刚用了1,这里就取2吧。
  88          //注意字符串索引值不要使用相同的值。
  89           0x02,
  90           
  91          //iSerialNumber字段。设备的序列号字符串索引值。
  92          //这里取3就可以了。
  93           0x03,
  94          
  95          //bNumConfigurations字段。该设备所具有的配置数。
  96          //我们只需要一种配置就行了,因此该值设置为1。
  97           0x01
  98          };
  99          //////////////////////////设备描述符完毕//////////////////////////////
 100          
 101          //USB报告描述符的定义
 102          code uint8 ReportDescriptor[]=
 103          {
 104           //每行开始的第一字节为该条目的前缀,前缀的格式为:
 105           //D7~D4:bTag。D3~D2:bType;D1~D0:bSize。以下分别对每个条目注释。
 106           
 107           //这是一个全局(bType为1)条目,选择用途页为普通桌面Generic Desktop Page(0x01)
 108           //后面跟一字节数据(bSize为1),后面的字节数就不注释了,
 109           //自己根据bSize来判断。
 110           0x05, 0x01, // USAGE_PAGE (Generic Desktop)
 111           
 112           //这是一个局部(bType为2)条目,说明接下来的应用集合用途用于鼠标
 113           0x09, 0x02, // USAGE (Mouse)
 114           
 115           //这是一个主条目(bType为0)条目,开集合,后面跟的数据0x01表示
 116           //该集合是一个应用集合。它的性质在前面由用途页和用途定义为
 117           //普通桌面用的鼠标。
C51 COMPILER V8.02   USBCORE                                                               06/17/2010 09:52:10 PAGE 3   

 118           0xa1, 0x01, // COLLECTION (Application)
 119           
 120           //这是一个局部条目。说明用途为指针集合
 121           0x09, 0x01, //   USAGE (Pointer)
 122           
 123           //这是一个主条目,开集合,后面跟的数据0x00表示该集合是一个
 124           //物理集合,用途由前面的局部条目定义为指针集合。
 125           0xa1, 0x00, //   COLLECTION (Physical)
 126           
 127           //这是一个全局条目,选择用途页为按键(Button Page(0x09))
 128           0x05, 0x09, //     USAGE_PAGE (Button)
 129           
 130           //这是一个局部条目,说明用途的最小值为1。实际上是鼠标左键。
 131           0x19, 0x01, //     USAGE_MINIMUM (Button 1)
 132           
 133           //这是一个局部条目,说明用途的最大值为3。实际上是鼠标中键。
 134           0x29, 0x03, //     USAGE_MAXIMUM (Button 3)
 135           
 136           //这是一个全局条目,说明返回的数据的逻辑值(就是我们返回的数据域的值啦)
 137           //最小为0。因为我们这里用Bit来表示一个数据域,因此最小为0,最大为1。
 138           0x15, 0x00, //     LOGICAL_MINIMUM (0)
 139           
 140           //这是一个全局条目,说明逻辑值最大为1。
 141           0x25, 0x01, //     LOGICAL_MAXIMUM (1)
 142           
 143           //这是一个全局条目,说明数据域的数量为三个。
 144           0x95, 0x03, //     REPORT_COUNT (3)
 145           
 146           //这是一个全局条目,说明每个数据域的长度为1个bit。
 147           0x75, 0x01, //     REPORT_SIZE (1)
 148           
 149           //这是一个主条目,说明有3个长度为1bit的数据域(数量和长度
 150           //由前面的两个全局条目所定义)用来做为输入,
 151           //属性为:Data,Var,Abs。Data表示这些数据可以变动,Var表示
 152           //这些数据域是独立的,每个域表示一个意思。Abs表示绝对值。
 153           //这样定义的结果就是,第一个数据域bit0表示按键1(左键)是否按下,
 154           //第二个数据域bit1表示按键2(右键)是否按下,第三个数据域bit2表示
 155           //按键3(中键)是否按下。
 156           0x81, 0x02, //     INPUT (Data,Var,Abs)
 157           
 158           //这是一个全局条目,说明数据域数量为1个
 159           0x95, 0x01, //     REPORT_COUNT (1)
 160           
 161           //这是一个全局条目,说明每个数据域的长度为5bit。
 162           0x75, 0x05, //     REPORT_SIZE (5)
 163           
 164           //这是一个主条目,输入用,由前面两个全局条目可知,长度为5bit,
 165           //数量为1个。它的属性为常量(即返回的数据一直是0)。
 166           //这个只是为了凑齐一个字节(前面用了3个bit)而填充的一些数据
 167           //而已,所以它是没有实际用途的。
 168           0x81, 0x03, //     INPUT (Cnst,Var,Abs)
 169           
 170           //这是一个全局条目,选择用途页为普通桌面Generic Desktop Page(0x01)
 171           0x05, 0x01, //     USAGE_PAGE (Generic Desktop)
 172           
 173           //这是一个局部条目,说明用途为X轴
 174           0x09, 0x30, //     USAGE (X)
 175           
 176           //这是一个局部条目,说明用途为Y轴
 177           0x09, 0x31, //     USAGE (Y)
 178           
 179           //这是一个局部条目,说明用途为滚轮
C51 COMPILER V8.02   USBCORE                                                               06/17/2010 09:52:10 PAGE 4   

 180           0x09, 0x38, //     USAGE (Wheel)
 181           
 182           //下面两个为全局条目,说明返回的逻辑最小和最大值。
 183           //因为鼠标指针移动时,通常是用相对值来表示的,
 184           //相对值的意思就是,当指针移动时,只发送移动量。
 185           //往右移动时,X值为正;往下移动时,Y值为正。
 186           //对于滚轮,当滚轮往上滚时,值为正。
 187           0x15, 0x81, //     LOGICAL_MINIMUM (-127)
 188           0x25, 0x7f, //     LOGICAL_MAXIMUM (127)
 189           
 190           //这是一个全局条目,说明数据域的长度为8bit。
 191           0x75, 0x08, //     REPORT_SIZE (8)
 192           
 193           //这是一个全局条目,说明数据域的个数为3个。
 194           0x95, 0x03, //     REPORT_COUNT (3)
 195           
 196           //这是一个主条目。它说明这三个8bit的数据域是输入用的,
 197           //属性为:Data,Var,Rel。Data说明数据是可以变的,Var说明
 198           //这些数据域是独立的,即第一个8bit表示X轴,第二个8bit表示
 199           //Y轴,第三个8bit表示滚轮。Rel表示这些值是相对值。
 200           0x81, 0x06, //     INPUT (Data,Var,Rel)
 201           
 202           //下面这两个主条目用来关闭前面的集合用。
 203           //我们开了两个集合,所以要关两次。bSize为0,所以后面没数据。
 204           0xc0,       //   END_COLLECTION
 205           0xc0        // END_COLLECTION
 206          };
 207          //通过上面的报告描述符的定义,我们知道返回的输入报告具有4字节。
 208          //第一字节的低3位用来表示按键是否按下的,高5位为常数0,无用。
 209          //第二字节表示X轴改的变量,第三字节表示Y轴的改变量,第四字节表示
 210          //滚轮的改变量。我们在中断端点1中应该要按照上面的格式返回实际的
 211          //鼠标数据。
 212          ///////////////////////////报告描述符完毕////////////////////////////
 213          
 214          //USB配置描述符集合的定义
 215          //配置描述符总长度为9+9+9+7字节
 216          code uint8 ConfigurationDescriptor[9+9+9+7]=
 217          {
 218           /***************配置描述符***********************/
 219           //bLength字段。配置描述符的长度为9字节。
 220           0x09,
 221           
 222           //bDescriptorType字段。配置描述符编号为0x02。
 223           0x02,
 224           
 225           //wTotalLength字段。配置描述符集合的总长度,
 226           //包括配置描述符本身、接口描述符、类描述符、端点描述符等。
 227           sizeof(ConfigurationDescriptor)&0xFF, //低字节
 228           (sizeof(ConfigurationDescriptor)>>8)&0xFF, //高字节
 229           
 230           //bNumInterfaces字段。该配置包含的接口数,只有一个接口。
 231           0x01,
 232           
 233           //bConfiguration字段。该配置的值为1。
 234           0x01,
 235           
 236           //iConfigurationz字段,该配置的字符串索引。这里没有,为0。
 237           0x00,
 238           
 239           //bmAttributes字段,该设备的属性。由于我们的板子是总线供电的,
 240           //并且我们不想实现远程唤醒的功能,所以该字段的值为0x80。
 241           0x80,
C51 COMPILER V8.02   USBCORE                                                               06/17/2010 09:52:10 PAGE 5   

 242           
 243           //bMaxPower字段,该设备需要的最大电流量。由于我们的板子
 244           //需要的电流不到100mA,因此我们这里设置为100mA。由于每单位
 245           //电流为2mA,所以这里设置为50(0x32)。

⌨️ 快捷键说明

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