📄 usbcore.lst
字号:
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 + -