📄 usb.lst
字号:
C51 COMPILER V7.50 USB 11/24/2008 09:12:36 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE USB
OBJECT MODULE PLACED IN USB.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE USB.c BROWSE DEFINE(__DEBUG__) DEBUG OBJECTEXTEND
line level source
1 /*===============================================================================//
2 //== 文 件 名:USB.c
3 //== author :gnsusn
4 //== 说 明:对 USB 协议的处理
5 //== 修改日志:2008.8.20 创建文件
6 //==
7 //===============================================================================*/
8 #include <reg52.h>
9 #include "USB.h"
10 #include "PDIUSBD12.h"
11 #include "functions.h"
12 #include "hid_report.h"
13
14 //***************************************************************************************
15 //=======================================================================================
16
17 EPPFLAGS bEPPflags; //== 程序运行状态标志
18 CONTROL_DATA_BUFF Control_Data; //== setup 包
19
20 unsigned char usb_transmit_buf[8]; //== 用于给USB发送数据的缓冲区
21 unsigned char hid_idle; //== HID 设备的idle状态
22 unsigned char hid_protocol; //== HID 当前协议
23
24 //*********************************************************************************
25 //== 协议中用到的数据
26 code unsigned char LANGUAGE_ID[4] = {0x04,0x03,0x09,0x04}; //== 字符串描述符所用的语言种类
27
28 code unsigned char device_serial_number[] = //== 设备序列号
29 {
30 22,STRING_DESCRIPTOR,'2',0,'0',0,'0',0,
31 '8',0,'-',0,'0',0,'8',0,'-',0,'2',0,'3',0
32 };
33
34 code unsigned char ManufacturerString[28] = //== 厂商字符串
35 {
36 28,STRING_DESCRIPTOR,0x3F,0x80,0x11,0x68,0x7E,0x67,0x84,
37 0x76,'U',0x00,'S',0x00,'B',0x00,'-',0x00,'H',0x00,'I',
38 0x00,'D',0x00,0xBE,0x8B,0x07,0x59
39 };
40
41 code unsigned char ProducterString[30] = //== 产品字符串
42 {
43 30,STRING_DESCRIPTOR,0x3F,0x80,0x11,0x68,0x7E,0x67,0x84,
44 0x76,'U',0x00,'S',0x00,'B',0x00,'-',0x00,'-',0x00,'H',
45 0x00,'I',0x00,'D',0x00,0xBE,0x8B,0x07,0x59
46 };
47
48 code DEVICE_DESCRIPTOR_STRUCT device_descriptor = //== 设备描述符
49 {
50 sizeof(DEVICE_DESCRIPTOR_STRUCT), //== 设备描述符的字节数大小
51 DEVICE_DESCRIPTOR, //== 设备描述符类型编号
52 SWAP16(0x0110), //== USB版本号
53 0x03, //== USB分配的设备类代码
54 0x00, //== USB分配的子类代码
55 0x00, //== USB分配的设备协议代码
C51 COMPILER V7.50 USB 11/24/2008 09:12:36 PAGE 2
56 0x10, //== 端点0的最大包大小
57 SWAP16(0x0471), //== 厂商编号VID,这里只是作为测试用,请使用自己的VID
58 SWAP16(0x1234), //== 产品编号PID,这里只是作为测试用,请使用自己的PID
59 SWAP16(0x0001), //== 设备出厂编号
60 0x01, //== 设备厂商字符串的索引
61 0x02, //== 描述产品字符串的索引
62 0x03, //== 描述设备序列号字符串的索引
63 0x01 //== 可能的配置数量
64 };
65
66 //== 定义配置,接口,端点等描述符结构体,因为它们是随配置描述符一起返回的
67 typedef struct _CON_INT_ENDP_DESCRIPTOR_STRUCT
68 {
69 CONFIGURATION_DESCRIPTOR_STRUCT configuration_descriptor;
70 INTERFACE_DESCRIPTOR_STRUCT interface_descriptor;
71 HID_DESCRIPTOR_STRUCT hid_descriptor;
72 ENDPOINT_DESCRIPTOR_STRUCT endpoint_descriptor[ENDPOINT_NUMBER];
73 }CON_INT_ENDP_DESCRIPTOR_STRUCT;
74
75 code CON_INT_ENDP_DESCRIPTOR_STRUCT con_int_endp_descriptor =
76 {
77 //configuration_descriptor //配置描述符
78 {
79 sizeof(CONFIGURATION_DESCRIPTOR_STRUCT), //== 配置描述符的字节数大小
80 CONFIGURATION_DESCRIPTOR, //== 配置描述符类型编号
81 SWAP16(sizeof(CON_INT_ENDP_DESCRIPTOR_STRUCT)),
82 0x01, //== 只包含一个接口
83 0x01, //== 该配置的编号
84 0x00, //== iConfiguration字段
85 0x80, //== 采用总线供电
86 0xC8 //== 从总线获取最大电流400mA
87 },
88 //interface_descritor //== 接口描述符
89 {
90 sizeof(INTERFACE_DESCRIPTOR_STRUCT), //== 接口描述符的字节数大小
91 INTERFACE_DESCRIPTOR, //== 接口描述符类型编号
92 0x00, //== 接口编号为0
93 0x00, //== 该接口描述符的编号
94 ENDPOINT_NUMBER, //== 该接口使用的端点数量,非0端点数量为4,只使用端点主端点输入和输出
95 0x03, //== 人机接口设备(HID)类
96 0x00, //== 使用的子类:未定义
97 0x00, //== 使用的协议:未定义
98 0x00 //== 接口描述符字符串索引
99 },
100 //hid_descriptor
101 {
102 sizeof(HID_DESCRIPTOR_STRUCT), //== HID描述符的字节数大小
103 HID_DESCRIPTOR, //== HID描述符类型编号
104 0x1001, //== HID类协议版本号,为1.1
105 0x00, //== 固件的国家地区代号,0x21为美国
106 NUM_SUB_DESCRIPTORS, //== 下级描述符的数量
107 {
108 {
109 REPORT_DESCRIPTOR, //== 下级描述符为报告描述符
110 SWAP16(sizeof(DataReportDescriptor)) //== 下级描述符的长度
111 }
112 },
113 },
114 //endpoint_descriptor[]
115 {
116 { //== 主端点输入描述
117 sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //== 端点描述符的字节数大小
C51 COMPILER V7.50 USB 11/24/2008 09:12:36 PAGE 3
118 ENDPOINT_DESCRIPTOR, //== 端点描述符类型编号
119 POINT_1_IN, //== 控制输入端点
120 ENDPOINT_TYPE_INTERRUPT, //== 使用的传输类型:中断传输
121 SWAP16(0x0010), //== 该端点支持的最大包尺寸,16字节
122 0x0A //== 中断扫描时间:设置为10ms
123 },
124
125 { //== 主端点输出描述
126 sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //== 端点描述符的字节数大小
127 ENDPOINT_DESCRIPTOR, //== 端点描述符类型编号
128 POINT_1_OUT, //== 控制输出端点
129 ENDPOINT_TYPE_INTERRUPT, //== 使用的传输类型:中断传输
130 SWAP16(0x0010), //== 该端点支持的最大包尺寸,16字节
131 0x0A //== 中断扫描时间:设置为10ms
132 },
133
134 { //== 主端点输出描述
135 sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //== 端点描述符的字节数大小
136 ENDPOINT_DESCRIPTOR, //== 端点描述符类型编号
137 MAIN_POINT_IN, //== 端点号,主输入端点
138 ENDPOINT_TYPE_INTERRUPT, //== 使用的传输类型:批量传输
139 SWAP16(0x0040), //== 该端点支持的最大包尺寸,64字节
140 0x0A //== 中断扫描时间:设置为10ms
141 },
142
143 { //== 主端点输出描述
144 sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //== 端点描述符的字节数大小
145 ENDPOINT_DESCRIPTOR, //== 端点描述符类型编号
146 MAIN_POINT_OUT, //== 端点号,主输出端点
147 ENDPOINT_TYPE_INTERRUPT, //== 使用的传输类型:中断传输
148 SWAP16(0x0040), //== 该端点支持的最大包尺寸,64字节
149 0x0A //== 中断扫描时间:设置为10ms
150 },
151 },
152 };
153
154 //*********************************************************************************
155
156 //===============================================================================//
157 //== 函 数 名:usb_bus_reset
158 //== 功 能:USB 总线复位处理
159 //== 说 明:
160 //== 时 间:2008.8.13 创建函数
161 //== 入口参数:无
162 //== 返 回 值:0
163 //===============================================================================//
164 unsigned char usb_bus_reset(void)
165 {
166 1 #ifdef __DEBUG__ //== 打印调试信息
167 1 Print_Msg("Runing usb_bus_reset()!\r\n");
168 1 #endif
169 1
170 1 #ifdef __DEBUG__ //== 打印调试信息
171 1 Print_Msg("USB总线复位................................\r\n");
172 1 #endif
173 1
174 1 bEPPflags.bits.bus_reset = 1;
175 1
176 1 return 0;
177 1 }
178
179 //===============================================================================//
C51 COMPILER V7.50 USB 11/24/2008 09:12:36 PAGE 4
180 //== 函 数 名:usb_bus_suspend
181 //== 功 能:USB 总线挂起处理
182 //== 说 明:
183 //== 时 间:2008.8.13 创建函数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -