📄 usbcore.lst
字号:
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:07 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.05
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
26 idata uint8 Buffer[16]; //读端点0用的缓冲区
27
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 V7.06 USBCORE 11/16/2008 16:00:07 PAGE 2
56 uint8 Ep2InIsBusy;
57
58 //LineCoding数组,用来保存波特率、停止位等串口属性。
59 //初始化波特率为9600,1停止位,无校验,8数据位。
60 uint8 LineCoding[7]={0x80,0x25,0x00,0x00,0x00,0x00,0x08};
61
62 //USB设备描述符的定义
63 code uint8 DeviceDescriptor[0x12]= //设备描述符为18字节
64 {
65 //bLength字段。设备描述符的长度为18(0x12)字节
66 0x12,
67
68 //bDescriptorType字段。设备描述符的编号为0x01
69 0x01,
70
71 //bcdUSB字段。这里设置版本为USB1.1,即0x0110。
72 //由于是小端结构,所以低字节在先,即0x10,0x01。
73 0x10,
74 0x01,
75
76 //bDeviceClass字段。本设备必须在设备描述符中指定设备的类型,
77 //否则,由于在配置集合中有两个接口,就会被系统认为是一个USB
78 //复合设备,从而导致设备工作不正常。0x02为通信设备类的类代码。
79 0x02,
80
81 //bDeviceSubClass字段。必须为0。
82 0x00,
83
84 //bDeviceProtocol字段。必须为0。
85 0x00,
86
87 //bMaxPacketSize0字段。PDIUSBD12的端点0大小的16字节。
88 0x10,
89
90 //idVender字段。厂商ID号,我们这里取0x8888,仅供实验用。
91 //实际产品不能随便使用厂商ID号,必须跟USB协会申请厂商ID号。
92 //注意小端模式,低字节在先。
93 0x88,
94 0x88,
95
96 //idProduct字段。产品ID号,由于是第七个实验,我们这里取0x0007。
97 //注意小端模式,低字节应该在前。
98 0x07,
99 0x00,
100
101 //bcdDevice字段。取1.0版,即0x0100。
102 //小端模式,低字节在先。
103 0x00,
104 0x01,
105
106 //iManufacturer字段。厂商字符串的索引值,为了方便记忆和管理,
107 //字符串索引就从1开始。
108 0x01,
109
110 //iProduct字段。产品字符串的索引值。刚刚用了1,这里就取2吧。
111 //注意字符串索引值不要使用相同的值。
112 0x02,
113
114 //iSerialNumber字段。设备的序列号字符串索引值。
115 //这里取3就可以了。
116 0x03,
117
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:07 PAGE 3
118 //bNumConfigurations字段。该设备所具有的配置数。
119 //我们只需要一种配置就行了,因此该值设置为1。
120 0x01
121 };
122 //////////////////////////设备描述符完毕//////////////////////////////
123
124
125 //USB配置描述符集合的定义
126 //配置描述符总长度为9+9+9+7+7+9+9+7字节
127 code uint8 ConfigurationDescriptor[9+9+5+5+4+5+7+9+7+7]=
128 {
129 /***************配置描述符***********************/
130 //bLength字段。配置描述符的长度为9字节。
131 0x09,
132
133 //bDescriptorType字段。配置描述符编号为0x02。
134 0x02,
135
136 //wTotalLength字段。配置描述符集合的总长度,
137 //包括配置描述符本身、接口描述符、类描述符、端点描述符等。
138 sizeof(ConfigurationDescriptor)&0xFF, //低字节
139 (sizeof(ConfigurationDescriptor)>>8)&0xFF, //高字节
140
141 //bNumInterfaces字段。该配置包含的接口数,有两个接口。
142 0x02,
143
144 //bConfiguration字段。该配置的值为1。
145 0x01,
146
147 //iConfigurationz字段,该配置的字符串索引。这里没有,为0。
148 0x00,
149
150 //bmAttributes字段,该设备的属性。由于我们的板子是总线供电的,
151 //并且我们不想实现远程唤醒的功能,所以该字段的值为0x80。
152 0x80,
153
154 //bMaxPower字段,该设备需要的最大电流量。由于我们的板子
155 //需要的电流不到100mA,因此我们这里设置为100mA。由于每单位
156 //电流为2mA,所以这里设置为50(0x32)。
157 0x32,
158
159 /*******************CDC类接口描述符*********************/
160 //bLength字段。接口描述符的长度为9字节。
161 0x09,
162
163 //bDescriptorType字段。接口描述符的编号为0x04。
164 0x04,
165
166 //bInterfaceNumber字段。该接口的编号,第一个接口,编号为0。
167 0x00,
168
169 //bAlternateSetting字段。该接口的备用编号,为0。
170 0x00,
171
172 //bNumEndpoints字段。非0端点的数目。CDC接口只使用一个中断
173 //输入端点。
174 0x01,
175
176 //bInterfaceClass字段。该接口所使用的类。CDC类的类代码为0x02。
177 0x02,
178
179 //bInterfaceSubClass字段。该接口所使用的子类。要实现USB转串口,
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:07 PAGE 4
180 //就必须使用Abstract Control Model(抽象控制模型)子类。它的
181 //编号为0x02。
182 0x02,
183
184 //bInterfaceProtocol字段。使用Common AT Commands(通用AT命令)
185 //协议。该协议的编号为0x01。
186 0x01,
187
188 //iConfiguration字段。该接口的字符串索引值。这里没有,为0。
189 0x00,
190
191 /***************以下为功能描述符****************/
192 /********* Header Functional Descriptor ********/
193 //bFunctionLength字段。该描述符长度为5字节
194 0x05,
195
196 //bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE)
197 //编号为0x24。
198 0x24,
199
200 //bDescriptorSubtype字段。描述符子类为Header Functional Descriptor
201 //编号为0x00。
202 0x00,
203
204 //bcdCDC字段。CDC版本号,为0x0110(低字节在先)
205 0x10,
206 0x01,
207
208 /**** Call Management Functional Descriptor ****/
209 //bFunctionLength字段。该描述符长度为5字节
210 0x05,
211
212 //bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE)
213 //编号为0x24。
214 0x24,
215
216 //bDescriptorSubtype字段。描述符子类为Call Management
217 //functional descriptor,编号为0x01。
218 0x01,
219
220 //bmCapabilities字段。设备自己不管理call management
221 0x00,
222
223 //bDataInterface字段。没有数据类接口用作call management
224 0x00,
225
226 /*** Abstract Control Management Functional Descriptor ***/
227 //bFunctionLength字段。该描述符长度为4字节
228 0x04,
229
230 //bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE)
231 //编号为0x24。
232 0x24,
233
234 //bDescriptorSubtype字段。描述符子类为Abstract Control
235 //Management functional descriptor,编号为0x02。
236 0x02,
237
238 //bmCapabilities字段。支持Set_Line_Coding、Set_Control_Line_State、
239 //Get_Line_Coding请求和Serial_State通知
240 0x02,
241
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:07 PAGE 5
242 /*** Union Functional Descriptor **/
243 //bFunctionLength字段。该描述符长度为5字节。
244 0x05,
245
246 //bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE)
247 //编号为0x24。
248 0x24,
249
250 //bDescriptorSubtype字段。描述符子类为
251 //Union functional descriptor,编号为0x06。
252 0x06,
253
254 //MasterInterface字段。这里为前面编号为0的CDC接口。
255 0x00,
256
257 //SlaveInterface字段,这里为接下来编号为1的数据类接口。
258 0x01,
259
260 /*********** 以下为接口0的端点描述符 *******/
261 //bLength字段。端点描述符长度为7字节。
262 0x07,
263
264 //bDescriptorType字段。端点描述符编号为0x05。
265 0x05,
266
267 //bEndpointAddress字段。端点的地址。这里使用D12的输入端点1。
268 //D7位表示数据方向,输入端点D7为1。所以输入端点1的地址为0x81。
269 0x81,
270
271 //bmAttributes字段。D1~D0为端点传输类型选择。
272 //该端点为中断端点。中断端点的编号为3。其它位保留为0。
273 0x03,
274
275 //wMaxPacketSize字段。该端点的最大包长。端点1的最大包长为16字节。
276 //注意低字节在先。
277 0x10,
278 0x00,
279
280 //bInterval字段。端点查询的时间,这里设置为10个帧时间,即10ms。
281 0x0A,
282
283 /********* 以下为接口1(数据接口)的接口描述符 *********/
284 //bLength字段。接口描述符的长度为9字节。
285 0x09,
286
287 //bDescriptorType字段。接口描述符的编号为0x04。
288 0x04,
289
290 //bInterfaceNumber字段。该接口的编号,第二个接口,编号为1。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -