📄 usb.lst
字号:
C51 COMPILER V8.02 USB 08/03/2008 09:58:47 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE USB
OBJECT MODULE PLACED IN Usb.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Usb.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /************************************************************************************
2 本程序仅供广大电子爱好者制作MP3学习和参考使用,不得用于其它用途,否则后果自负
3
4 USB.C File
5 Created by Computer-lov. Date: 2004.9.27
6 Last edited date: 2005.5.31
7 version 1.1
8 Copyright (c) 2005 Computer-lov
9 All rigths reserved
10 *************************************************************************************/
11
12 #include "AT89C51SND1C.H"
13 #include "USB.H"
14 #include "MASS_STORAGE.H"
15 #include "IDE.h"
16 #include "LCD.H"
17 #include "hardware.h"
18 #include "keyboard.h"
19 #include "mp3.h"
20
21
22 CONTROL_DATA_BUFF xdata Control_Data;
23
24 CBW xdata cbw;
25 CSW xdata csw;
26
27 unsigned char bdata SCSI_Register;
28 sbit SCSI_Command = SCSI_Register^0;
29 sbit SCSI_Data = SCSI_Register^1;
30
31
32 unsigned char *pData;
33
34 unsigned char code DISK_INF[36]
35 = //磁盘信息
36 {
37 0x00,
38 0x00,
39 0x02,
40 0x02,
41 0x1F,
42 0x00,0x00,0x00,
43 0x49,0x44,0x45,0xA1,0xFA,0x55,0x53,0x42,
44 0xC1,0xF5,0xC8,0xD9,0xD7,0xD4,0xBC,0xBA,0xD7,0xF6,0xB5,0xC4,0x4D,0x50,0x33,0x20,
45 0x31,0x2E,0x30,0x31
46 };
47
48
49 code unsigned char SENSE[0x12]= //模式探测返回数据
50 {
51 0x70, 0x00, 0x05, 0x00, 0x00, 0x00,
52 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00
53 };
54
55 unsigned int SWAP(unsigned int temp) //高低字节交换
C51 COMPILER V8.02 USB 08/03/2008 09:58:47 PAGE 2
56 {
57 1 unsigned char i;
58 1 i=((unsigned char *)&temp)[0];
59 1 ((unsigned char *)&temp)[0]=((unsigned char *)&temp)[1];
60 1 ((unsigned char *)&temp)[1]=i;
61 1 return temp;
62 1 }
63
64 unsigned char LSB(unsigned int temp) //取一个整数的低字节
65 {
66 1 return (unsigned char)temp;
67 1 }
68
69 unsigned char MSB(unsigned int temp) //取一个整数的高字节
70 {
71 1 return (unsigned char)(temp>>8);
72 1 }
73
74 code unsigned char LANGUAGE_ID[4]={0x04,0x03,0x09,0x04}; //字符串描述符所用的语言种类
75
76 code unsigned char device_serial_number[18]= //设备序列号
77 {0x12,0x03,0x32,0x00,0x30,0x00,0x37,0x00,0x31,0x00,0x30,0x00,0x39,0x00,0x38,0x00,0x32,0x00};
78
79 code DEVICE_DESCRIPTOR_STRUCT device_descriptor= //设备描述符
80 {
81 sizeof(DEVICE_DESCRIPTOR_STRUCT), //设备描述符的字节数大小
82 DEVICE_DESCRIPTOR, //设备描述符类型编号
83 0x1001, //USB版本号
84 0x00, //USB分配的设备类代码
85 0x00, //USB分配的子类代码
86 0x00, //USB分配的设备协议代码
87 MAX_CONTROL_DATA_SIZE, //端点0的最大包大小
88 0x7111, //厂商编号
89 0xf0ff, //产品编号
90 0x0100, //设备出厂编号
91 0x00, //设备厂商字符串的索引
92 0x00, //描述产品字符串的索引
93 0x02, //描述设备序列号字符串的索引
94 0x01 //可能的配置数量
95 };
96
97 typedef struct _CON_INT_ENDP_DESCRIPTOR_STRUCT
98 {
99 CONFIGURATION_DESCRIPTOR_STRUCT configuration_descriptor;
100 INTERFACE_DESCRIPTOR_STRUCT interface_descritor;
101 ENDPOINT_DESCRIPTOR_STRUCT endpoint_descriptor[ENDPOINT_NUMBER];
102 }CON_INT_ENDP_DESCRIPTOR_STRUCT;
103
104 code CON_INT_ENDP_DESCRIPTOR_STRUCT con_int_endp_descriptor=
105 {
106 //configuration_descriptor //配置描述符
107 {
108 sizeof(CONFIGURATION_DESCRIPTOR_STRUCT), //配置描述符的字节数大小
109 CONFIGURATION_DESCRIPTOR, //配置描述符类型编号
110 (sizeof(CONFIGURATION_DESCRIPTOR_STRUCT)+sizeof(INTERFACE_DESCRIPTOR_STRUCT)+sizeof(ENDPOINT_DESCRIPTOR_S
-TRUCT)*ENDPOINT_NUMBER)*256+
111 (sizeof(CONFIGURATION_DESCRIPTOR_STRUCT)+sizeof(INTERFACE_DESCRIPTOR_STRUCT)+sizeof(ENDPOINT_DESCRIPTOR_S
-TRUCT)*ENDPOINT_NUMBER)/256,
112 0x01, //只包含一个接口
113 0x01, //该配置的编号
114 0x00, //iConfiguration字段
115 0x80, //采用总线供电,不支持远程唤醒
C51 COMPILER V8.02 USB 08/03/2008 09:58:47 PAGE 3
116 0xC8 //从总线获取最大电流400mA
117 },
118 //interface_descritor //接口描述符
119 {
120 sizeof(INTERFACE_DESCRIPTOR_STRUCT), //接口描述符的字节数大小
121 INTERFACE_DESCRIPTOR, //接口描述符类型编号
122 0x00, //接口编号为0
123 0x00, //该接口描述符的编号
124 ENDPOINT_NUMBER, //非0端点数量为2,只使用端点主端点输入和
-输出
125 0x08, //USB大容量存储设备
126 0x06, //使用的子类,为简化块命令
127 0x50, //使用的协议,这里使用单批量传输协议
128 0x00 //接口描述符字符串索引
129 },
130
131 //endpoint_descriptor[]
132 {
133 { //主端点输入描述
134 sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //端点描述符的字节数大小
135 ENDPOINT_DESCRIPTOR, //端点描述符类型编号
136 MAIN_POINT_IN, //端点号,主输入端点
137 ENDPOINT_TYPE_BULK, //使用的传输类型,批量传输
138 0x4000, //该端点支持的最大包尺寸,64字节
139 0x00 //中断扫描时间,对批量传输无效
140 },
141
142 { //主端点输出描述
143 sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //端点描述符的字节数大小
144 ENDPOINT_DESCRIPTOR, //端点描述符类型编号
145 MAIN_POINT_OUT, //端点号,主输出端点
146 ENDPOINT_TYPE_BULK, //使用的传输类型,批量传输
147 0x4000, //该端点支持的最大包尺寸,64字节
148 0x00 //中断扫描时间,对批量传输无效
149 }
150 }
151 };
152
153
154 unsigned int bdata usb_flags_Register; //程序标志位
155
156 sbit USB__bus_reset = usb_flags_Register^0;
157 sbit USB_suspend = usb_flags_Register^1;
158 sbit USB_remote_wakeup = usb_flags_Register^2;
159 sbit USB_int_isr = usb_flags_Register^3;
160 sbit USB_not_end = usb_flags_Register^4;
161 sbit USB_usb_idle = usb_flags_Register^5;
162 sbit USB_usb_busy = usb_flags_Register^6;
163 sbit USB_setup_packet_in = usb_flags_Register^7;
164 sbit USB_setup_packet_out = usb_flags_Register^8;
165 sbit USB_set_addr = usb_flags_Register^9;
166 sbit USB_usb_endp0_in = usb_flags_Register^10;
167 sbit USB_usb_endp1_in = usb_flags_Register^11;
168 sbit USB_usb_endp2_out = usb_flags_Register^12;
169
170
171 unsigned char bdata status_Register; ////状态寄存器
172
173 sbit status_control_out_port = status_Register^0;
174 sbit status_control_in_port = status_Register^1;
175 sbit status_main_out_port = status_Register^2;
176 sbit status_main_in_port = status_Register^3;
C51 COMPILER V8.02 USB 08/03/2008 09:58:47 PAGE 4
177 sbit status_bus_reset = status_Register^4;
178 sbit status_suspend_change = status_Register^5;
179 sbit status_setup_packet = status_Register^6;
180
181 //***************** 延时x毫秒函数 ***********
182 void delay(unsigned int x)
183 {
184 1 unsigned int i;
185 1 unsigned int j;
186 1 for(i=0;i<x;i++)
187 1 for(j=0;j<230;j++);
188 1 }
189 //********************************************
190
191 unsigned char remove_enable;
192
193 void read_usb_status(void) //读USB状态寄存器
194 {
195 1 status_Register=0;
196 1 if(EORINT){status_bus_reset=1;USBINT=USBINT & (~0x10);return;}
197 1 if(SPINT){status_suspend_change=1;USBINT=USBINT & (~0x01);return;}
198 1 UEPNUM=0;
199 1 if(RXSETUP){status_setup_packet=1;status_control_out_port=1;return;}
200 1 status_control_out_port = RXOUTB0;
201 1 status_control_in_port = NAKIN;
202 1 cls_NAKIN();
203 1 UEPNUM=1;
204 1 status_main_in_port=NAKIN;
205 1 cls_NAKIN();
206 1 UEPNUM=2;
207 1 status_main_out_port=(RXOUTB0 || RXOUTB1);
208 1 USBINT=0x00;
209 1 }
210
211 void set_endpoint_enable(void) //端点使能
212 {
213 1 UEPNUM=0;
214 1 UEPCONX=0x80;
215 1 UEPNUM=1;
216 1 UEPCONX=0x86;
217 1 UEPNUM=2;
218 1 UEPCONX=0x82;
219 1 }
220
221
222 unsigned char error_count;
223 void error(unsigned char number) //出错处理
224 {
225 1 number=0;
226 1 error_count++;
227 1 LCD_go_home();
228 1 prints(" ");
229 1 LCD_line_feed();
230 1 prints(" ");
231 1 LCD_go_home();
232 1 prints("Error:");
233 1 printf(error_count);
234 1 }
235
236 unsigned char read_endpoint_buff(unsigned char endp,unsigned char len,unsigned char * buff) //读终端点缓
-冲
237 {
C51 COMPILER V8.02 USB 08/03/2008 09:58:47 PAGE 5
238 1 unsigned char i,j;
239 1 UEPNUM=endp; //选择端点
240 1 j=UBYCTX; //读字节数
241 1 if(j>len)j=len;
242 1 for(i=0;i<j;i++)
243 1 {
244 2 buff[i]=UEPDATX;
245 2 }
246 1 if(RXOUTB0){UEPSTAX=UEPSTAX & (~0x42); return j;} //清除RXOUTB0 位
247 1 if(RXOUTB1){UEPSTAX=UEPSTAX & (~0x42); return j;} //清除RXOUTB1 位
248 1 }
249
250 unsigned char write_endpoint_buff(unsigned char endp,unsigned char len,unsigned char * buff) //写终端点
-缓冲
251 {
252 1 unsigned char i;
253 1 remove_enable=0;
254 1 UEPNUM=endp; //选择端点
255 1 for(i=0;i<len;i++) //填数据寄存器
256 1 {
257 2 UEPDATX=buff[i];
258 2 }
259 1 UEPSTAX=UEPSTAX | 0x10; //设置TXRDY位
260 1 while(!( UEPSTAX & 0x01 )); //等待TXCMP
261 1 UEPSTAX=UEPSTAX & (~0x01); //清除TXCMP
262 1 return len;
263 1 }
264
265 void disconnect_usb(void)
266 {
267 1 USB_CONNECT=1;
268 1 delay(100);
269 1 }
270
271 void connect_usb(void) //连接USB
272 {
273 1 USB_CONNECT=0;
274 1 }
275
276 void init_usb(void) //初始化USB
277 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -