📄 usbcore.lst
字号:
C51 COMPILER V8.05a USBCORE 04/21/2009 19:44:21 PAGE 1
C51 COMPILER V8.05a, 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 欢迎访问我的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.22
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 //端点2缓冲是否忙的标志。当缓冲区中有数据时,该标志为真。
55 //当缓冲区中空闲时,该标志为假。
C51 COMPILER V8.05a USBCORE 04/21/2009 19:44:21 PAGE 2
56 uint8 Ep2InIsBusy;
57
58 //返回了多少次报告的计数器
59 uint32 Count=0;
60
61 //USB设备描述符的定义
62 code uint8 DeviceDescriptor[0x12]= //设备描述符为18字节
63 {
64 //bLength字段。设备描述符的长度为18(0x12)字节
65 0x12,
66
67 //bDescriptorType字段。设备描述符的编号为0x01
68 0x01,
69
70 //bcdUSB字段。这里设置版本为USB1.1,即0x0110。
71 //由于是小端结构,所以低字节在先,即0x10,0x01。
72 0x10,
73 0x01,
74
75 //bDeviceClass字段。用户自定义USB设备,代码为0xFF
76 0xFF,
77
78 //bDeviceSubClass字段。为0,没有规定子类。
79 0x00,
80
81 //bDeviceProtocol字段。为0,没有规定协议。
82 0x00,
83
84 //bMaxPacketSize0字段。PDIUSBD12的端点0大小的16字节。
85 0x10,
86
87 //idVender字段。厂商ID号,我们这里取0x8888,仅供实验用。
88 //实际产品不能随便使用厂商ID号,必须跟USB协会申请厂商ID号。
89 //注意小端模式,低字节在先。
90 0x88,
91 0x88,
92
93 //idProduct字段。产品ID号,由于是第11个实验,我们这里取0x000B。
94 //注意小端模式,低字节应该在前。
95 0x0B,
96 0x00,
97
98 //bcdDevice字段。设备版本号,取1.0版,即0x0100。
99 //小端模式,低字节在先。
100 0x00,
101 0x01,
102
103 //iManufacturer字段。厂商字符串的索引值,为了方便记忆和管理,
104 //字符串索引就从1开始吧。
105 0x01,
106
107 //iProduct字段。产品字符串的索引值。刚刚用了1,这里就取2吧。
108 //注意字符串索引值不要使用相同的值。
109 0x02,
110
111 //iSerialNumber字段。设备的序列号字符串索引值。
112 //这里取3就可以了。
113 0x03,
114
115 //bNumConfigurations字段。该设备所具有的配置数。
116 //我们只需要一种配置就行了,因此该值设置为1。
117 0x01
C51 COMPILER V8.05a USBCORE 04/21/2009 19:44:21 PAGE 3
118 };
119 //////////////////////////设备描述符完毕//////////////////////////////
120
121 //USB配置描述符集合的定义
122 //配置描述符总长度为9+9+9+7+7字节
123 code uint8 ConfigurationDescriptor[9+9+7+7+7+7]=
124 {
125 /***************配置描述符***********************/
126 //bLength字段。配置描述符的长度为9字节。
127 0x09,
128
129 //bDescriptorType字段。配置描述符编号为0x02。
130 0x02,
131
132 //wTotalLength字段。配置描述符集合的总长度,
133 //包括配置描述符本身、接口描述符、类描述符、端点描述符等。
134 sizeof(ConfigurationDescriptor)&0xFF, //低字节
135 (sizeof(ConfigurationDescriptor)>>8)&0xFF, //高字节
136
137 //bNumInterfaces字段。该配置包含的接口数,只有一个接口。
138 0x01,
139
140 //bConfiguration字段。该配置的值为1。
141 0x01,
142
143 //iConfigurationz字段,该配置的字符串索引。这里没有,为0。
144 0x00,
145
146 //bmAttributes字段,该设备的属性。由于我们的板子是总线供电的,
147 //并且我们不想实现远程唤醒的功能,所以该字段的值为0x80。
148 0x80,
149
150 //bMaxPower字段,该设备需要的最大电流量。由于我们的板子
151 //需要的电流不到100mA,因此我们这里设置为100mA。由于每单位
152 //电流为2mA,所以这里设置为50(0x32)。
153 0x32,
154
155 /*******************接口描述符*********************/
156 //bLength字段。接口描述符的长度为9字节。
157 0x09,
158
159 //bDescriptorType字段。接口描述符的编号为0x04。
160 0x04,
161
162 //bInterfaceNumber字段。该接口的编号,第一个接口,编号为0。
163 0x00,
164
165 //bAlternateSetting字段。该接口的备用编号,为0。
166 0x00,
167
168 //bNumEndpoints字段。非0端点的数目。本实例需要四个端点,因此该值为4。
169 0x04,
170
171 //bInterfaceClass字段。该接口所使用的类,未指定。该设备类在设备描述符中已指定。
172 0x00,
173
174 //bInterfaceSubClass字段。该接口所使用的子类,未指定
175 0x00,
176
177 //bInterfaceProtocol字段。该接口所使用的协议,未指定。
178 0x00,
179
C51 COMPILER V8.05a USBCORE 04/21/2009 19:44:21 PAGE 4
180 //iConfiguration字段。该接口的字符串索引值。这里没有,为0。
181 0x00,
182
183 /**********************中断输入端点描述符***********************/
184 //bLength字段。端点描述符长度为7字节。
185 0x07,
186
187 //bDescriptorType字段。端点描述符编号为0x05。
188 0x05,
189
190 //bEndpointAddress字段。端点的地址。我们使用D12的输入端点1。
191 //D7位表示数据方向,输入端点D7为1。所以输入端点1的地址为0x81。
192 0x81,
193
194 //bmAttributes字段。D1~D0为端点传输类型选择。
195 //该端点为中断端点。中断端点的编号为3。其它位保留为0。
196 0x03,
197
198 //wMaxPacketSize字段。该端点的最大包长。端点1的最大包长为16字节。
199 //注意低字节在先。
200 0x10,
201 0x00,
202
203 //bInterval字段。端点查询的时间,我们设置为10个帧时间,即10ms。
204 0x0A,
205
206 /**********************中断输出端点描述符***********************/
207 //bLength字段。端点描述符长度为7字节。
208 0x07,
209
210 //bDescriptorType字段。端点描述符编号为0x05。
211 0x05,
212
213 //bEndpointAddress字段。端点的地址。我们使用D12的输出端点1。
214 //D7位表示数据方向,输出端点D7为0。所以输出端点1的地址为0x01。
215 0x01,
216
217 //bmAttributes字段。D1~D0为端点传输类型选择。
218 //该端点为中断端点。中断端点的编号为3。其它位保留为0。
219 0x03,
220
221 //wMaxPacketSize字段。该端点的最大包长。端点1的最大包长为16字节。
222 //注意低字节在先。
223 0x10,
224 0x00,
225
226 //bInterval字段。端点查询的时间,我们设置为10个帧时间,即10ms。
227 0x0A,
228
229 /*************** 批量输入端点2描述符 ******************/
230 //bLength字段。端点描述符长度为7字节。
231 0x07,
232
233 //bDescriptorType字段。端点描述符编号为0x05。
234 0x05,
235
236 //bEndpointAddress字段。端点的地址。我们使用D12的输入端点2。
237 //D7位表示数据方向,输入端点D7为1。所以输入端点2的地址为0x82。
238 0x82,
239
240 //bmAttributes字段。D1~D0为端点传输类型选择。
241 //该端点为批量端点,批量端点的编号为0x02。其它位保留为0。
C51 COMPILER V8.05a USBCORE 04/21/2009 19:44:21 PAGE 5
242 0x02,
243
244 //wMaxPacketSize字段。该端点的最大包长。端点2的最大包长为64字节。
245 //注意低字节在先。
246 0x40,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -