📄 usbcore.lst
字号:
C51 COMPILER V7.06 USBCORE 11/16/2008 15:59:55 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.14
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 //返回了多少次报告的计数器
55 uint32 Count=0;
C51 COMPILER V7.06 USBCORE 11/16/2008 15:59:55 PAGE 2
56
57 //USB设备描述符的定义
58 code uint8 DeviceDescriptor[0x12]= //设备描述符为18字节
59 {
60 //bLength字段。设备描述符的长度为18(0x12)字节
61 0x12,
62
63 //bDescriptorType字段。设备描述符的编号为0x01
64 0x01,
65
66 //bcdUSB字段。这里设置版本为USB1.1,即0x0110。
67 //由于是小端结构,所以低字节在先,即0x10,0x01。
68 0x10,
69 0x01,
70
71 //bDeviceClass字段。我们不在设备描述符中定义设备类,
72 //而在接口描述符中定义设备类,所以该字段的值为0。
73 0x00,
74
75 //bDeviceSubClass字段。bDeviceClass字段为0时,该字段也为0。
76 0x00,
77
78 //bDeviceProtocol字段。bDeviceClass字段为0时,该字段也为0。
79 0x00,
80
81 //bMaxPacketSize0字段。PDIUSBD12的端点0大小的16字节。
82 0x10,
83
84 //idVender字段。厂商ID号,我们这里取0x8888,仅供实验用。
85 //实际产品不能随便使用厂商ID号,必须跟USB协会申请厂商ID号。
86 //注意小端模式,低字节在先。
87 0x88,
88 0x88,
89
90 //idProduct字段。产品ID号,由于是第六个实验,我们这里取0x0006。
91 //注意小端模式,低字节应该在前。
92 0x06,
93 0x00,
94
95 //bcdDevice字段。设备版本号,取1.0版,即0x0100。
96 //小端模式,低字节在先。
97 0x00,
98 0x01,
99
100 //iManufacturer字段。厂商字符串的索引值,为了方便记忆和管理,
101 //字符串索引就从1开始吧。
102 0x01,
103
104 //iProduct字段。产品字符串的索引值。刚刚用了1,这里就取2吧。
105 //注意字符串索引值不要使用相同的值。
106 0x02,
107
108 //iSerialNumber字段。设备的序列号字符串索引值。
109 //这里取3就可以了。
110 0x03,
111
112 //bNumConfigurations字段。该设备所具有的配置数。
113 //我们只需要一种配置就行了,因此该值设置为1。
114 0x01
115 };
116 //////////////////////////设备描述符完毕//////////////////////////////
117
C51 COMPILER V7.06 USBCORE 11/16/2008 15:59:55 PAGE 3
118 //USB报告描述符的定义
119 code uint8 ReportDescriptor[]=
120 {
121 //每行开始的第一字节为该条目的前缀,前缀的格式为:
122 //D7~D4:bTag。D3~D2:bType;D1~D0:bSize。以下分别对每个条目注释。
123
124 //这是一个全局(bType为1)条目,将用途页选择为普通桌面Generic Desktop Page。
125 //后面跟1字节数据(bSize为1),后面的字节数就不注释了,自己根据bSize来判断。
126 0x05, 0x01, // USAGE_PAGE (Generic Desktop)
127
128 //这是一个局部(bType为2)条目,用途选择为0x00。在普通桌面页中,
129 //该用途是未定义的,如果使用该用途来开集合,那么系统将不会把它
130 //当作标准系统设备,从而就成了一个用户自定义的HID设备。
131 0x09, 0x00, // USAGE (0)
132
133 //这是一个主条目(bType为0)条目,开集合,后面跟的数据0x01表示
134 //该集合是一个应用集合。它的性质在前面由用途页和用途定义为
135 //用户自定义。
136 0xa1, 0x01, // COLLECTION (Application)
137
138 //这是一个全局条目,说明逻辑值最小值为0。
139 0x15, 0x00, // LOGICAL_MINIMUM (0)
140
141 //这是一个全局条目,说明逻辑值最大为255。
142 0x25, 0xff, // LOGICAL_MAXIMUM (255)
143
144 //这是一个局部条目,说明用途的最小值为1。
145 0x19, 0x01, // USAGE_MINIMUM (1)
146
147 //这是一个局部条目,说明用途的最大值8。
148 0x29, 0x08, // USAGE_MAXIMUM (8)
149
150 //这是一个全局条目,说明数据域的数量为八个。
151 0x95, 0x08, // REPORT_COUNT (8)
152
153 //这是一个全局条目,说明每个数据域的长度为8bit,即1字节。
154 0x75, 0x08, // REPORT_SIZE (8)
155
156 //这是一个主条目,说明有8个长度为8bit的数据域做为输入。
157 0x81, 0x02, // INPUT (Data,Var,Abs)
158
159 //这是一个局部条目,说明用途的最小值为1。
160 0x19, 0x01, // USAGE_MINIMUM (1)
161
162 //这是一个局部条目,说明用途的最大值8。
163 0x29, 0x08, // USAGE_MAXIMUM (8)
164
165 //这是一个主条目。定义输出数据(8字节,注意前面的全局条目)。
166 0x91, 0x02, // OUTPUT (Data,Var,Abs)
167
168 //下面这个主条目用来关闭前面的集合。bSize为0,所以后面没数据。
169 0xc0 // END_COLLECTION
170 };
171 //通过上面的报告描述符的定义,我们知道返回的输入报告具有8字节。
172 //输出报告也有8字节。至于这8字节的数据是干什么用的,就要由用户
173 //自己来决定了。像我们这个实验,输入报告的第一字节用来描述8个按键
174 //的状态,第二到第五字节返回返回报告的次数(增加一个长整型的变量Count,
175 //每发送一次报告就加1)。而输出报告的第一字节则用来控制板上8个LED
176 //的状态,第二字节(非0时)用来清除上面的报告计数器Count。
177 ///////////////////////////报告描述符完毕////////////////////////////
178
179 //USB配置描述符集合的定义
C51 COMPILER V7.06 USBCORE 11/16/2008 15:59:55 PAGE 4
180 //配置描述符总长度为9+9+9+7+7字节
181 code uint8 ConfigurationDescriptor[9+9+9+7+7]=
182 {
183 /***************配置描述符***********************/
184 //bLength字段。配置描述符的长度为9字节。
185 0x09,
186
187 //bDescriptorType字段。配置描述符编号为0x02。
188 0x02,
189
190 //wTotalLength字段。配置描述符集合的总长度,
191 //包括配置描述符本身、接口描述符、类描述符、端点描述符等。
192 sizeof(ConfigurationDescriptor)&0xFF, //低字节
193 (sizeof(ConfigurationDescriptor)>>8)&0xFF, //高字节
194
195 //bNumInterfaces字段。该配置包含的接口数,只有一个接口。
196 0x01,
197
198 //bConfiguration字段。该配置的值为1。
199 0x01,
200
201 //iConfigurationz字段,该配置的字符串索引。这里没有,为0。
202 0x00,
203
204 //bmAttributes字段,该设备的属性。由于我们的板子是总线供电的,
205 //并且我们不想实现远程唤醒的功能,所以该字段的值为0x80。
206 0x80,
207
208 //bMaxPower字段,该设备需要的最大电流量。由于我们的板子
209 //需要的电流不到100mA,因此我们这里设置为100mA。由于每单位
210 //电流为2mA,所以这里设置为50(0x32)。
211 0x32,
212
213 /*******************接口描述符*********************/
214 //bLength字段。接口描述符的长度为9字节。
215 0x09,
216
217 //bDescriptorType字段。接口描述符的编号为0x04。
218 0x04,
219
220 //bInterfaceNumber字段。该接口的编号,第一个接口,编号为0。
221 0x00,
222
223 //bAlternateSetting字段。该接口的备用编号,为0。
224 0x00,
225
226 //bNumEndpoints字段。非0端点的数目。本实例需要二个
227 //中断端点(一个输入一个输出),因此该值为2。
228 0x02,
229
230 //bInterfaceClass字段。该接口所使用的类。本实例是HID类,
231 //HID类的编码为0x03。
232 0x03,
233
234 //bInterfaceSubClass字段。该接口所使用的子类。在HID1.1协议中,
235 //只规定了一种子类:支持BIOS引导启动的子类。
236 //USB键盘、鼠标属于该子类,子类代码为0x01。
237 //但这里我们是自定义的HID设备,所以不使用子类。
238 0x00,
239
240 //bInterfaceProtocol字段。如果子类为支持引导启动的子类,
241 //则协议可选择鼠标和键盘。键盘代码为0x01,鼠标代码为0x02。
C51 COMPILER V7.06 USBCORE 11/16/2008 15:59:55 PAGE 5
242 //自定义的HID设备,也不使用协议。
243 0x00,
244
245 //iConfiguration字段。该接口的字符串索引值。这里没有,为0。
246 0x00,
247
248 /******************HID描述符************************/
249 //bLength字段。本HID描述符下只有一个下级描述符。所以长度为9字节。
250 0x09,
251
252 //bDescriptorType字段。HID描述符的编号为0x21。
253 0x21,
254
255 //bcdHID字段。本协议使用的HID1.1协议。注意低字节在先。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -