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

📄 usbcore.lst

📁 USB HID类软固件代码
💻 LST
📖 第 1 页 / 共 4 页
字号:
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 15:59:55 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.14
  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          //返回了多少次报告的计数器
  55          uint32 Count=0;
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 15:59:55 PAGE 2   

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

 118          //USB报告描述符的定义
 119          code uint8 ReportDescriptor[]=
 120          {
 121           //每行开始的第一字节为该条目的前缀,前缀的格式为:
 122           //D7~D4:bTag。D3~D2:bType;D1~D0:bSize。以下分别对每个条目注释。
 123           
 124           //这是一个全局(bType为1)条目,将用途页选择为普通桌面Generic Desktop Page。
 125           //后面跟1字节数据(bSize为1),后面的字节数就不注释了,自己根据bSize来判断。
 126           0x05, 0x01, // USAGE_PAGE (Generic Desktop)
 127           
 128           //这是一个局部(bType为2)条目,用途选择为0x00。在普通桌面页中,
 129           //该用途是未定义的,如果使用该用途来开集合,那么系统将不会把它
 130           //当作标准系统设备,从而就成了一个用户自定义的HID设备。
 131           0x09, 0x00, // USAGE (0)
 132           
 133           //这是一个主条目(bType为0)条目,开集合,后面跟的数据0x01表示
 134           //该集合是一个应用集合。它的性质在前面由用途页和用途定义为
 135           //用户自定义。
 136           0xa1, 0x01, // COLLECTION (Application)
 137          
 138           //这是一个全局条目,说明逻辑值最小值为0。
 139           0x15, 0x00, //     LOGICAL_MINIMUM (0)
 140           
 141           //这是一个全局条目,说明逻辑值最大为255。
 142           0x25, 0xff, //     LOGICAL_MAXIMUM (255)
 143           
 144           //这是一个局部条目,说明用途的最小值为1。
 145           0x19, 0x01, //     USAGE_MINIMUM (1)
 146           
 147           //这是一个局部条目,说明用途的最大值8。
 148           0x29, 0x08, //     USAGE_MAXIMUM (8) 
 149           
 150           //这是一个全局条目,说明数据域的数量为八个。
 151           0x95, 0x08, //     REPORT_COUNT (8)
 152           
 153           //这是一个全局条目,说明每个数据域的长度为8bit,即1字节。
 154           0x75, 0x08, //     REPORT_SIZE (8)
 155           
 156           //这是一个主条目,说明有8个长度为8bit的数据域做为输入。
 157           0x81, 0x02, //     INPUT (Data,Var,Abs)
 158           
 159           //这是一个局部条目,说明用途的最小值为1。
 160           0x19, 0x01, //     USAGE_MINIMUM (1)
 161           
 162           //这是一个局部条目,说明用途的最大值8。
 163           0x29, 0x08, //     USAGE_MAXIMUM (8) 
 164           
 165           //这是一个主条目。定义输出数据(8字节,注意前面的全局条目)。
 166           0x91, 0x02, //   OUTPUT (Data,Var,Abs)
 167           
 168           //下面这个主条目用来关闭前面的集合。bSize为0,所以后面没数据。
 169           0xc0        // END_COLLECTION
 170          };
 171          //通过上面的报告描述符的定义,我们知道返回的输入报告具有8字节。
 172          //输出报告也有8字节。至于这8字节的数据是干什么用的,就要由用户
 173          //自己来决定了。像我们这个实验,输入报告的第一字节用来描述8个按键
 174          //的状态,第二到第五字节返回返回报告的次数(增加一个长整型的变量Count,
 175          //每发送一次报告就加1)。而输出报告的第一字节则用来控制板上8个LED
 176          //的状态,第二字节(非0时)用来清除上面的报告计数器Count。
 177          ///////////////////////////报告描述符完毕////////////////////////////
 178          
 179          //USB配置描述符集合的定义
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 15:59:55 PAGE 4   

 180          //配置描述符总长度为9+9+9+7+7字节
 181          code uint8 ConfigurationDescriptor[9+9+9+7+7]=
 182          {
 183           /***************配置描述符***********************/
 184           //bLength字段。配置描述符的长度为9字节。
 185           0x09,
 186           
 187           //bDescriptorType字段。配置描述符编号为0x02。
 188           0x02,
 189           
 190           //wTotalLength字段。配置描述符集合的总长度,
 191           //包括配置描述符本身、接口描述符、类描述符、端点描述符等。
 192           sizeof(ConfigurationDescriptor)&0xFF, //低字节
 193           (sizeof(ConfigurationDescriptor)>>8)&0xFF, //高字节
 194           
 195           //bNumInterfaces字段。该配置包含的接口数,只有一个接口。
 196           0x01,
 197           
 198           //bConfiguration字段。该配置的值为1。
 199           0x01,
 200           
 201           //iConfigurationz字段,该配置的字符串索引。这里没有,为0。
 202           0x00,
 203           
 204           //bmAttributes字段,该设备的属性。由于我们的板子是总线供电的,
 205           //并且我们不想实现远程唤醒的功能,所以该字段的值为0x80。
 206           0x80,
 207           
 208           //bMaxPower字段,该设备需要的最大电流量。由于我们的板子
 209           //需要的电流不到100mA,因此我们这里设置为100mA。由于每单位
 210           //电流为2mA,所以这里设置为50(0x32)。
 211           0x32,
 212           
 213           /*******************接口描述符*********************/
 214           //bLength字段。接口描述符的长度为9字节。
 215           0x09,
 216           
 217           //bDescriptorType字段。接口描述符的编号为0x04。
 218           0x04,
 219           
 220           //bInterfaceNumber字段。该接口的编号,第一个接口,编号为0。
 221           0x00,
 222           
 223           //bAlternateSetting字段。该接口的备用编号,为0。
 224           0x00,
 225           
 226           //bNumEndpoints字段。非0端点的数目。本实例需要二个
 227           //中断端点(一个输入一个输出),因此该值为2。
 228           0x02,
 229           
 230           //bInterfaceClass字段。该接口所使用的类。本实例是HID类,
 231           //HID类的编码为0x03。
 232           0x03,
 233           
 234           //bInterfaceSubClass字段。该接口所使用的子类。在HID1.1协议中,
 235           //只规定了一种子类:支持BIOS引导启动的子类。
 236           //USB键盘、鼠标属于该子类,子类代码为0x01。
 237           //但这里我们是自定义的HID设备,所以不使用子类。
 238           0x00,
 239           
 240           //bInterfaceProtocol字段。如果子类为支持引导启动的子类,
 241           //则协议可选择鼠标和键盘。键盘代码为0x01,鼠标代码为0x02。
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 15:59:55 PAGE 5   

 242           //自定义的HID设备,也不使用协议。
 243           0x00,
 244           
 245           //iConfiguration字段。该接口的字符串索引值。这里没有,为0。
 246           0x00,
 247           
 248           /******************HID描述符************************/
 249           //bLength字段。本HID描述符下只有一个下级描述符。所以长度为9字节。
 250           0x09,
 251           
 252           //bDescriptorType字段。HID描述符的编号为0x21。
 253           0x21,
 254           
 255           //bcdHID字段。本协议使用的HID1.1协议。注意低字节在先。

⌨️ 快捷键说明

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