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

📄 usbcore.lst

📁 单片机上实现U盘功能
💻 LST
📖 第 1 页 / 共 4 页
字号:
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:19 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.08.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          #include "SCSI.h"
  27          
  28          
  29          idata uint8 Buffer[16];  //读端点0用的缓冲区
  30          
  31          idata uint8 CBW[31];  //保存CBW用的缓冲区
  32          idata uint8 CSW[13];  //保存CSW用的缓冲区
  33          
  34          //USB设备请求的各字段
  35          uint8  bmRequestType;
  36          uint8  bRequest;
  37          uint16 wValue;
  38          uint16 wIndex;
  39          uint16 wLength;
  40          //当前发送数据的位置
  41          uint8 * pSendData;
  42          //需要发送数据的长度
  43          uint16 SendLength;
  44          //是否需要发送0数据包的标志。在USB控制传输的数据过程中,
  45          //当返回的数据包字节数少于最大包长时,会认为数据过程结束。
  46          //当请求的字节数比实际需要返回的字节数长,而实际返回的字节
  47          //数又刚好是端点0大小的整数倍时,就需要返回一个0长度的数据包
  48          //来结束数据过程。因此这里增加一个标志,供程序决定是否需要返回
  49          //一个0长度的数据包。
  50          uint8 NeedZeroPacket;
  51          
  52          //当前的配置值。只有在设置非0配置后
  53          uint8 ConfigValue;
  54          
  55          //端点1缓冲是否忙的标志。当缓冲区中有数据时,该标志为真。
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:19 PAGE 2   

  56          //当缓冲区中空闲时,该标志为假。
  57          uint8 Ep1InIsBusy;
  58          uint8 Ep2InIsBusy;
  59          
  60          //定义最大逻辑单元。本实例仅有一个逻辑单元,所以值为0。
  61          //由于在对后面的命令处理中,忽略了逻辑单元字段,如果你
  62          //将这里的0改成1,将会有两个逻辑单元,从而显示两块参数
  63          //完全一样的磁盘。改成n,就会显示n+1块参数完全一样的磁盘。
  64          //最多可以有16个逻辑单元(n=15)。
  65          code uint8 MaxLun[1]={0};
  66          
  67          //传输的阶段,有命令(COMMAND_STAGE)、数据(DATA_STAGE)、状态(STATUS_STAGE)三个。
  68          uint8 TransportStage;
  69          
  70          //USB设备描述符的定义
  71          code uint8 DeviceDescriptor[0x12]=  //设备描述符为18字节
  72          {
  73          //bLength字段。设备描述符的长度为18(0x12)字节
  74           0x12,
  75           
  76          //bDescriptorType字段。设备描述符的编号为0x01
  77           0x01,
  78           
  79          //bcdUSB字段。这里设置版本为USB1.1,即0x0110。
  80          //由于是小端结构,所以低字节在先,即0x10,0x01。
  81           0x10,
  82           0x01,
  83           
  84          //bDeviceClass字段。我们不在设备描述符中定义设备类,
  85          //而在接口描述符中定义设备类,所以该字段的值为0。
  86           0x00,
  87           
  88          //bDeviceSubClass字段。bDeviceClass字段为0时,该字段也为0。
  89           0x00,
  90           
  91          //bDeviceProtocol字段。bDeviceClass字段为0时,该字段也为0。
  92           0x00,
  93           
  94          //bMaxPacketSize0字段。PDIUSBD12的端点0大小的16字节。
  95           0x10,
  96           
  97          //idVender字段。厂商ID号,我们这里取0x8888,仅供实验用。
  98          //实际产品不能随便使用厂商ID号,必须跟USB协会申请厂商ID号。
  99          //注意小端模式,低字节在先。
 100           0x88,
 101           0x88,
 102           
 103          //idProduct字段。产品ID号,由于是第九个实验,我们这里取0x0009。
 104          //注意小端模式,低字节应该在前。
 105           0x09,
 106           0x00,
 107           
 108          //bcdDevice字段。我们这个USB键盘刚开始做,就叫它1.0版吧,即0x0100。
 109          //小端模式,低字节在先。
 110           0x00,
 111           0x01,
 112           
 113          //iManufacturer字段。厂商字符串的索引值,为了方便记忆和管理,
 114          //字符串索引就从1开始吧。
 115           0x01,
 116          
 117          //iProduct字段。产品字符串的索引值。刚刚用了1,这里就取2吧。
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:19 PAGE 3   

 118          //注意字符串索引值不要使用相同的值。
 119           0x02,
 120           
 121          //iSerialNumber字段。设备的序列号字符串索引值。
 122          //这里取3就可以了。
 123           0x03,
 124          
 125          //bNumConfigurations字段。该设备所具有的配置数。
 126          //我们只需要一种配置就行了,因此该值设置为1。
 127           0x01
 128          };
 129          //////////////////////////设备描述符完毕//////////////////////////////
 130          
 131          //USB配置描述符集合的定义
 132          //配置描述符总长度为9+9+9+7+7字节
 133          code uint8 ConfigurationDescriptor[9+9+7+7]=
 134          {
 135           /***************配置描述符***********************/
 136           //bLength字段。配置描述符的长度为9字节。
 137           0x09,
 138           
 139           //bDescriptorType字段。配置描述符编号为0x02。
 140           0x02,
 141           
 142           //wTotalLength字段。配置描述符集合的总长度,
 143           //包括配置描述符本身、接口描述符、类描述符、端点描述符等。
 144           sizeof(ConfigurationDescriptor)&0xFF, //低字节
 145           (sizeof(ConfigurationDescriptor)>>8)&0xFF, //高字节
 146           
 147           //bNumInterfaces字段。该配置包含的接口数,有1个接口。
 148           0x01,
 149           
 150           //bConfiguration字段。该配置的值为1。
 151           0x01,
 152           
 153           //iConfigurationz字段,该配置的字符串索引。这里没有,为0。
 154           0x00,
 155           
 156           //bmAttributes字段,该设备的属性。由于我们的板子是总线供电的,
 157           //并且我们不想实现远程唤醒的功能,所以该字段的值为0x80。
 158           0x80,
 159           
 160           //bMaxPower字段,该设备需要的最大电流量。由于我们的板子
 161           //需要的电流不到100mA,因此我们这里设置为100mA。由于每单位
 162           //电流为2mA,所以这里设置为50(0x32)。
 163           0x32,
 164           
 165           /*****************接口描述符*******************/
 166           //bLength字段。接口描述符的长度为9字节。
 167           0x09,
 168           
 169           //bDescriptorType字段。接口描述符的编号为0x04。
 170           0x04,
 171           
 172           //bInterfaceNumber字段。该接口的编号,第一个接口,编号为0。
 173           0x00,
 174           
 175           //bAlternateSetting字段。该接口的备用编号,为0。
 176           0x00,
 177           
 178           //bNumEndpoints字段。非0端点的数目。该接口有2个批量端点
 179           0x02,
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:19 PAGE 4   

 180           
 181           //bInterfaceClass字段。该接口所使用的类。大容量存储设备接口类的代码为0x08。
 182           0x08,
 183           
 184           //bInterfaceSubClass字段。该接口所使用的子类。SCSI透明命令集的子类代码为0x06。
 185           0x06,
 186           
 187           //bInterfaceProtocol字段。协议为仅批量传输,代码为0x50。
 188           0x50,
 189           
 190           //iConfiguration字段。该接口的字符串索引值。这里没有,为0。
 191           0x00,
 192            
 193           /*************标准批量数据输入端点描述符****************/
 194           //bLength字段。端点描述符长度为7字节。
 195           0x07,
 196           
 197           //bDescriptorType字段。端点描述符编号为0x05。
 198           0x05,
 199           
 200           //bEndpointAddress字段。端点的地址。我们使用D12的输入端点2。
 201           //D7位表示数据方向,输入端点D7为1。所以输入端点2的地址为0x82。
 202           0x82,
 203           
 204           //bmAttributes字段。D1~D0为端点传输类型选择。
 205           //该端点为批端点。批量端点的编号为2。其它位保留为0。
 206           0x02,
 207           
 208           //wMaxPacketSize字段。该端点的最大包长。端点2的最大包长为64字节。
 209           //注意低字节在先。
 210           0x40,
 211           0x00,
 212           
 213           //bInterval字段。端点查询的时间,此处无意义。
 214           0x00,
 215           
 216           /*************标准批量数据输出端点描述符****************/
 217           //bLength字段。端点描述符长度为7字节。
 218           0x07,
 219           
 220           //bDescriptorType字段。端点描述符编号为0x05。
 221           0x05,
 222           
 223           //bEndpointAddress字段。端点的地址。我们使用D12的输出端点2。
 224           //D7位表示数据方向,输出端点D7为0。所以输出端点2的地址为0x02。
 225           0x02,
 226           
 227           //bmAttributes字段。D1~D0为端点传输类型选择。
 228           //该端点为批端点。批量端点的编号为2。其它位保留为0。
 229           0x02,
 230           
 231           //wMaxPacketSize字段。该端点的最大包长。端点2的最大包长为64字节。
 232           //注意低字节在先。
 233           0x40,
 234           0x00,
 235           
 236           //bInterval字段。端点查询的时间,此处无意义。
 237           0x00
 238          };
 239          ////////////////////////配置描述符集合完毕//////////////////////////
 240          
 241          /************************语言ID的定义********************/
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:19 PAGE 5   

 242          code uint8 LanguageId[4]=
 243          {
 244           0x04, //本描述符的长度

⌨️ 快捷键说明

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