📄 usbcore.lst
字号:
C51 COMPILER V7.06 USBCORE 11/16/2008 15:59:43 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.10
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 //USB设备请求的各字段
29 uint8 bmRequestType;
30 uint8 bRequest;
31 uint16 wValue;
32 uint16 wIndex;
33 uint16 wLength;
34 //当前发送数据的位置
35 uint8 * pSendData;
36 //需要发送数据的长度
37 uint16 SendLength;
38 //是否需要发送0数据包的标志。在USB控制传输的数据过程中,
39 //当返回的数据包字节数少于最大包长时,会认为数据过程结束。
40 //当请求的字节数比实际需要返回的字节数长,而实际返回的字节
41 //数又刚好是端点0大小的整数倍时,就需要返回一个0长度的数据包
42 //来结束数据过程。因此这里增加一个标志,供程序决定是否需要返回
43 //一个0长度的数据包。
44 uint8 NeedZeroPacket;
45
46 //当前的配置值。只有在设置非0配置后
47 uint8 ConfigValue;
48
49 //端点1缓冲是否忙的标志。当缓冲区中有数据时,该标志为真。
50 //当缓冲区中空闲时,该标志为假。
51 uint8 Ep1InIsBusy;
52
53 //USB设备描述符的定义
54 code uint8 DeviceDescriptor[0x12]= //设备描述符为18字节
55 {
C51 COMPILER V7.06 USBCORE 11/16/2008 15:59:43 PAGE 2
56 //bLength字段。设备描述符的长度为18(0x12)字节
57 0x12,
58
59 //bDescriptorType字段。设备描述符的编号为0x01
60 0x01,
61
62 //bcdUSB字段。这里设置版本为USB1.1,即0x0110。
63 //由于是小端结构,所以低字节在先,即0x10,0x01。
64 0x10,
65 0x01,
66
67 //bDeviceClass字段。我们不在设备描述符中定义设备类,
68 //而在接口描述符中定义设备类,所以该字段的值为0。
69 0x00,
70
71 //bDeviceSubClass字段。bDeviceClass字段为0时,该字段也为0。
72 0x00,
73
74 //bDeviceProtocol字段。bDeviceClass字段为0时,该字段也为0。
75 0x00,
76
77 //bMaxPacketSize0字段。PDIUSBD12的端点0大小的16字节。
78 0x10,
79
80 //idVender字段。厂商ID号,我们这里取0x8888,仅供实验用。
81 //实际产品不能随便使用厂商ID号,必须跟USB协会申请厂商ID号。
82 //注意小端模式,低字节在先。
83 0x88,
84 0x88,
85
86 //idProduct字段。产品ID号,由于是第一个实验,我们这里取0x0001。
87 //注意小端模式,低字节应该在前。
88 0x01,
89 0x00,
90
91 //bcdDevice字段。我们这个USB鼠标刚开始做,就叫它1.0版吧,即0x0100。
92 //小端模式,低字节在先。
93 0x00,
94 0x01,
95
96 //iManufacturer字段。厂商字符串的索引值,为了方便记忆和管理,
97 //字符串索引就从1开始吧。
98 0x01,
99
100 //iProduct字段。产品字符串的索引值。刚刚用了1,这里就取2吧。
101 //注意字符串索引值不要使用相同的值。
102 0x02,
103
104 //iSerialNumber字段。设备的序列号字符串索引值。
105 //这里取3就可以了。
106 0x03,
107
108 //bNumConfigurations字段。该设备所具有的配置数。
109 //我们只需要一种配置就行了,因此该值设置为1。
110 0x01
111 };
112 //////////////////////////设备描述符完毕//////////////////////////////
113
114 //USB报告描述符的定义
115 code uint8 ReportDescriptor[]=
116 {
117 //每行开始的第一字节为该条目的前缀,前缀的格式为:
C51 COMPILER V7.06 USBCORE 11/16/2008 15:59:43 PAGE 3
118 //D7~D4:bTag。D3~D2:bType;D1~D0:bSize。以下分别对每个条目注释。
119
120 //这是一个全局(bType为1)条目,选择用途页为普通桌面Generic Desktop Page(0x01)
121 //后面跟一字节数据(bSize为1),后面的字节数就不注释了,
122 //自己根据bSize来判断。
123 0x05, 0x01, // USAGE_PAGE (Generic Desktop)
124
125 //这是一个局部(bType为2)条目,说明接下来的应用集合用途用于鼠标
126 0x09, 0x02, // USAGE (Mouse)
127
128 //这是一个主条目(bType为0)条目,开集合,后面跟的数据0x01表示
129 //该集合是一个应用集合。它的性质在前面由用途页和用途定义为
130 //普通桌面用的鼠标。
131 0xa1, 0x01, // COLLECTION (Application)
132
133 //这是一个局部条目。说明用途为指针集合
134 0x09, 0x01, // USAGE (Pointer)
135
136 //这是一个主条目,开集合,后面跟的数据0x00表示该集合是一个
137 //物理集合,用途由前面的局部条目定义为指针集合。
138 0xa1, 0x00, // COLLECTION (Physical)
139
140 //这是一个全局条目,选择用途页为按键(Button Page(0x09))
141 0x05, 0x09, // USAGE_PAGE (Button)
142
143 //这是一个局部条目,说明用途的最小值为1。实际上是鼠标左键。
144 0x19, 0x01, // USAGE_MINIMUM (Button 1)
145
146 //这是一个局部条目,说明用途的最大值为3。实际上是鼠标中键。
147 0x29, 0x03, // USAGE_MAXIMUM (Button 3)
148
149 //这是一个全局条目,说明返回的数据的逻辑值(就是我们返回的数据域的值啦)
150 //最小为0。因为我们这里用Bit来表示一个数据域,因此最小为0,最大为1。
151 0x15, 0x00, // LOGICAL_MINIMUM (0)
152
153 //这是一个全局条目,说明逻辑值最大为1。
154 0x25, 0x01, // LOGICAL_MAXIMUM (1)
155
156 //这是一个全局条目,说明数据域的数量为三个。
157 0x95, 0x03, // REPORT_COUNT (3)
158
159 //这是一个全局条目,说明每个数据域的长度为1个bit。
160 0x75, 0x01, // REPORT_SIZE (1)
161
162 //这是一个主条目,说明有3个长度为1bit的数据域(数量和长度
163 //由前面的两个全局条目所定义)用来做为输入,
164 //属性为:Data,Var,Abs。Data表示这些数据可以变动,Var表示
165 //这些数据域是独立的,每个域表示一个意思。Abs表示绝对值。
166 //这样定义的结果就是,第一个数据域bit0表示按键1(左键)是否按下,
167 //第二个数据域bit1表示按键2(右键)是否按下,第三个数据域bit2表示
168 //按键3(中键)是否按下。
169 0x81, 0x02, // INPUT (Data,Var,Abs)
170
171 //这是一个全局条目,说明数据域数量为1个
172 0x95, 0x01, // REPORT_COUNT (1)
173
174 //这是一个全局条目,说明每个数据域的长度为5bit。
175 0x75, 0x05, // REPORT_SIZE (5)
176
177 //这是一个主条目,输入用,由前面两个全局条目可知,长度为5bit,
178 //数量为1个。它的属性为常量(即返回的数据一直是0)。
179 //这个只是为了凑齐一个字节(前面用了3个bit)而填充的一些数据
C51 COMPILER V7.06 USBCORE 11/16/2008 15:59:43 PAGE 4
180 //而已,所以它是没有实际用途的。
181 0x81, 0x03, // INPUT (Cnst,Var,Abs)
182
183 //这是一个全局条目,选择用途页为普通桌面Generic Desktop Page(0x01)
184 0x05, 0x01, // USAGE_PAGE (Generic Desktop)
185
186 //这是一个局部条目,说明用途为X轴
187 0x09, 0x30, // USAGE (X)
188
189 //这是一个局部条目,说明用途为Y轴
190 0x09, 0x31, // USAGE (Y)
191
192 //这是一个局部条目,说明用途为滚轮
193 0x09, 0x38, // USAGE (Wheel)
194
195 //下面两个为全局条目,说明返回的逻辑最小和最大值。
196 //因为鼠标指针移动时,通常是用相对值来表示的,
197 //相对值的意思就是,当指针移动时,只发送移动量。
198 //往右移动时,X值为正;往下移动时,Y值为正。
199 //对于滚轮,当滚轮往上滚时,值为正。
200 0x15, 0x81, // LOGICAL_MINIMUM (-127)
201 0x25, 0x7f, // LOGICAL_MAXIMUM (127)
202
203 //这是一个全局条目,说明数据域的长度为8bit。
204 0x75, 0x08, // REPORT_SIZE (8)
205
206 //这是一个全局条目,说明数据域的个数为3个。
207 0x95, 0x03, // REPORT_COUNT (3)
208
209 //这是一个主条目。它说明这三个8bit的数据域是输入用的,
210 //属性为:Data,Var,Rel。Data说明数据是可以变的,Var说明
211 //这些数据域是独立的,即第一个8bit表示X轴,第二个8bit表示
212 //Y轴,第三个8bit表示滚轮。Rel表示这些值是相对值。
213 0x81, 0x06, // INPUT (Data,Var,Rel)
214
215 //下面这两个主条目用来关闭前面的集合用。
216 //我们开了两个集合,所以要关两次。bSize为0,所以后面没数据。
217 0xc0, // END_COLLECTION
218 0xc0 // END_COLLECTION
219 };
220 //通过上面的报告描述符的定义,我们知道返回的输入报告具有4字节。
221 //第一字节的低3位用来表示按键是否按下的,高5位为常数0,无用。
222 //第二字节表示X轴改的变量,第三字节表示Y轴的改变量,第四字节表示
223 //滚轮的改变量。我们在中断端点1中应该要按照上面的格式返回实际的
224 //鼠标数据。
225 ///////////////////////////报告描述符完毕////////////////////////////
226
227 //USB配置描述符集合的定义
228 //配置描述符总长度为9+9+9+7字节
229 code uint8 ConfigurationDescriptor[9+9+9+7]=
230 {
231 /***************配置描述符***********************/
232 //bLength字段。配置描述符的长度为9字节。
233 0x09,
234
235 //bDescriptorType字段。配置描述符编号为0x02。
236 0x02,
237
238 //wTotalLength字段。配置描述符集合的总长度,
239 //包括配置描述符本身、接口描述符、类描述符、端点描述符等。
240 sizeof(ConfigurationDescriptor)&0xFF, //低字节
241 (sizeof(ConfigurationDescriptor)>>8)&0xFF, //高字节
C51 COMPILER V7.06 USBCORE 11/16/2008 15:59:43 PAGE 5
242
243 //bNumInterfaces字段。该配置包含的接口数,只有一个接口。
244 0x01,
245
246 //bConfiguration字段。该配置的值为1。
247 0x01,
248
249 //iConfigurationz字段,该配置的字符串索引。这里没有,为0。
250 0x00,
251
252 //bmAttributes字段,该设备的属性。由于我们的板子是总线供电的,
253 //并且我们不想实现远程唤醒的功能,所以该字段的值为0x80。
254 0x80,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -