?? usbkeyboard.lst
字號:
C51 COMPILER V8.05a USBKEYBOARD 05/28/2007 10:50:18 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE USBKEYBOARD
OBJECT MODULE PLACED IN UsbKeyBoard.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE UsbKeyBoard.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /******************************************************************
2 本程序只供學習使用,未經作者許可,不得用于其它任何用途
3 我的郵箱:computer-lov@tom.com
4 歡迎訪問我的blog: http://computer00.21ic.org
5
6 USBKeyBoard.C file
7
8 作者:Computer-lov
9 建立日期: 2007.03.20
10 修改日期: 2007.03.23
11 版本:V1.1
12 版權所有,盜版必究。
13 Copyright(C) Computer-lov 2007-2017
14 All rights reserved
15 *******************************************************************/
16
17 #include <AT89x52.H>
18 #include "USB.H"
19 #include "PDIUSBD12.H"
20 #include "My_type.h"
21 #include "UART.H"
22 #include "key.h"
23 #include "keyboard.h"
24
25 #define USB_COMMAND_ADD 1
26 #define USB_DATA_ADD 0
27
28 //USB芯片連接引腳
29 #define USB_DATA P0
30 #define USB_A0 P3_5
31 #define USB_WR P3_6
32 #define USB_RD P3_7
33 #define USB_INT P3_2
34
35
36 #define ENDPOINT_NUMBER 2
37 #define MAX_CONTROL_DATA_SIZE 16
38
39
40 //控制傳輸時保存數據
41 CONTROL_DATA_BUFF Control_Data;
42
43 //緩沖
44 uint8 idata buffer[64];
45
46 //交換數據時用的指針
47 uint8 *pData;
48
49 uint8 idle; //空閑狀態
50 uint8 protocol; //當前協議
51
52 //高低字節交換
53
54 #define SWAP16(x) ((((uint16)(x))<<8)|(((uint16)(x))>>8))
55
C51 COMPILER V8.05a USBKEYBOARD 05/28/2007 10:50:18 PAGE 2
56 //取一個整數的低字節
57 #define LSB(x) ((uint8)(x))
58
59 //取一個整數的高字節
60 #define MSB(x) ((uint8)(((uint16)(x))>>8))
61
62 //字符串描述符所用的語言種類
63 code uint8 LANGUAGE_ID[4]={0x04,0x03,0x09,0x04};
64
65 //設備序列號
66 code uint8 device_serial_number[]=
67 {22,STRING_DESCRIPTOR,'2',0,'0',0,'0',0,'7',0,'-',0,'0',0,'3',0,'-',0,'2',0,'3',0};
68
69 //廠商字符串
70 code uint8 ManufacturerString[80]=
71 {80,STRING_DESCRIPTOR,0x35,0x75,0x11,0x81,0x08,0x57,0x08,0x57,0x84,0x76,0xB6,0x5B,
72 0x53,0x5F,'-',0x00,'-',0x00,'-',0x00,'-',0x00,'@',0,0x20,0x00,'H',0,'t',0,'t',0,
73 'p',0,':',0,'/',0,'/',0,'C',0,'o',0,'m',0,'p',0,'u',0,'t',0,'e',0,'r',0,'0',0,
74 '0',0,'.',0,'2',0,'1',0,'i',0,'c',0,'.',0,'o',0,'r',0,'g',0};
75
76 //產品字符串
77 code uint8 ProducterString[80]=
78 {80,STRING_DESCRIPTOR,0x35,0x75,0x11,0x81,0x08,0x57,0x08,0x57,0x5A,0x50,0x84,0x76,
79 'U',0,'S',0,'B',0,0x2E,0x95,0xD8,0x76,'@',0,0x20,0x00,'H',0,'t',0,'t',0,
80 'p',0,':',0,'/',0,'/',0,'C',0,'o',0,'m',0,'p',0,'u',0,'t',0,'e',0,'r',0,'0',0,
81 '0',0,'.',0,'2',0,'1',0,'i',0,'c',0,'.',0,'o',0,'r',0,'g',0};
82
83
84 code DEVICE_DESCRIPTOR_STRUCT device_descriptor= //設備描述符
85 {
86 sizeof(DEVICE_DESCRIPTOR_STRUCT), //設備描述符的字節數大小
87 DEVICE_DESCRIPTOR, //設備描述符類型編號
88 0x1001, //USB版本號
89 0x00, //USB分配的設備類代碼
90 0x00, //USB分配的子類代碼
91 0x00, //USB分配的設備協議代碼
92 0x10, //端點0的最大包大小
93 0x3412, //廠商編號VID,這里只是作為測試用,請使用自己的VID
94 0x7856, //產品編號PID,這里只是作為測試用,請使用自己的PID
95 0x0100, //設備出廠編號
96 0x01, //設備廠商字符串的索引
97 0x02, //描述產品字符串的索引
98 0x03, //描述設備序列號字符串的索引
99 0x01 //可能的配置數量
100 };
101
102 //定義配置,接口,端點等描述符結構體,因為它們是隨配置描述符一起返回的
103 typedef struct _CON_INT_ENDP_DESCRIPTOR_STRUCT
104 {
105 CONFIGURATION_DESCRIPTOR_STRUCT configuration_descriptor;
106 INTERFACE_DESCRIPTOR_STRUCT interface_descriptor;
107 HID_DESCRIPTOR_STRUCT hid_descriptor;
108 ENDPOINT_DESCRIPTOR_STRUCT endpoint_descriptor[ENDPOINT_NUMBER];
109 }CON_INT_ENDP_DESCRIPTOR_STRUCT;
110
111 code CON_INT_ENDP_DESCRIPTOR_STRUCT con_int_endp_descriptor=
112 {
113 //configuration_descriptor //配置描述符
114 {
115 sizeof(CONFIGURATION_DESCRIPTOR_STRUCT), //配置描述符的字節數大小
116 CONFIGURATION_DESCRIPTOR, //配置描述符類型編號
117 SWAP16(sizeof(CON_INT_ENDP_DESCRIPTOR_STRUCT)),
C51 COMPILER V8.05a USBKEYBOARD 05/28/2007 10:50:18 PAGE 3
118 0x01, //只包含一個接口
119 0x01, //該配置的編號
120 0x00, //iConfiguration字段
121 0xA0, //采用總線供電,支持遠程喚醒
122 0xC8 //從總線獲取最大電流400mA
123 },
124 //interface_descritor //接口描述符
125 {
126 sizeof(INTERFACE_DESCRIPTOR_STRUCT), //接口描述符的字節數大小
127 INTERFACE_DESCRIPTOR, //接口描述符類型編號
128 0x00, //接口編號為0
129 0x00, //該接口描述符的編號
130 ENDPOINT_NUMBER, //非0端點數量為2,只使用端點主端點輸入和
-輸出
131 0x03, //人機接口設備(HID)類
132 0x01, //使用的子類:支持BIOS根啟動Boot的子類
133 0x01, //使用的協議:鍵盤
134 0x00 //接口描述符字符串索引
135 },
136 //hid_descriptor
137 {
138 sizeof(HID_DESCRIPTOR_STRUCT), //HID描述符的字節數大小
139 HID_DESCRIPTOR, //HID描述符類型編號
140 0x1001, //HID類協議版本號,為1.1
141 0x21, //固件的國家地區代號,0x21為美國
142 NUM_SUB_DESCRIPTORS, //下級描述符的數量
143 {
144 {
145 REPORT_DESCRIPTOR, //下級描述符為報告描述符
146 SWAP16(sizeof(KeyBoardReportDescriptor)) //下級描述符的長度
147 }
148 },
149 },
150 //endpoint_descriptor[]
151 {
152 { //主端點輸入描述
153 sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //端點描述符的字節數大小
154 ENDPOINT_DESCRIPTOR, //端點描述符類型編號
155 MAIN_POINT_IN, //端點號,主輸入端點
156 ENDPOINT_TYPE_INTERRUPT, //使用的傳輸類型:中斷傳輸
157 0x4000, //該端點支持的最大包尺寸,64字節
158 0x0A //中斷掃描時間:設置為10ms
159 },
160
161 { //主端點輸出描述
162 sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //端點描述符的字節數大小
163 ENDPOINT_DESCRIPTOR, //端點描述符類型編號
164 MAIN_POINT_OUT, //端點號,主輸出端點
165 ENDPOINT_TYPE_INTERRUPT, //使用的傳輸類型:中斷傳輸
166 0x4000, //該端點支持的最大包尺寸,64字節
167 0x0A //中斷掃描時間:設置為10ms
168 }
169 }
170 };
171
172 union //程序標志位
173 {
174 uint16 Register;
175 struct
176 {
177 uint8 bus_reset :1;
178 uint8 suspend :1;
C51 COMPILER V8.05a USBKEYBOARD 05/28/2007 10:50:18 PAGE 4
179 uint8 remote_wakeup :1;
180 uint8 int_isr :1;
181 uint8 not_end :1;
182 uint8 usb_idle :1;
183 uint8 usb_busy :1;
184 uint8 setup_packet_in :1;
185 uint8 setup_packet_out :1;
186 uint8 set_addr :1;
187 uint8 usb_endp0_in :1;
188 uint8 usb_endp2_in :1;
189 uint8 usb_endp2_out :1;
190 }flags;
191 }usb_flags;
192
193 union //中斷寄存器
194 {
195 uint8 Register[2];
196 struct
197 {
198 uint8 control_out_port :1;
199 uint8 control_in_port :1;
200 uint8 port_out_1 :1;
201 uint8 port_in_1 :1;
202 uint8 main_out_port :1;
203 uint8 main_in_port :1;
204 uint8 bus_reset :1;
205 uint8 suspend_change :1;
206 uint8 DMA_EOT :1;
207 uint8 not_use :7;
208 }Interrupt;
209 }Interrupt_Register;
210
211
212 union //端點最后處理狀態
213 {
214 uint8 Register;
215 struct
216 {
217 uint8 successful :1;
218 uint8 error_code :4;
219 uint8 setup_packet :1;
220 uint8 data_1 :1;
221 uint8 prestatus_not_read :1;
222 }Status;
223 }Last_Status;
224
225
226 /***************** 延時x毫秒函數 ***********/
227 void delay(uint16 x)
228 {
229 1 uint16 i;
230 1 uint16 j;
231 1 for(i=0;i<x;i++)
232 1 for(j=0;j<230;j++);
233 1 }
234 /********************************************/
235
236 /*******************************寫USB命令******************************************/
237 void write_usb_command(uint8 usb_command)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -