📄 usb_disk.lst
字号:
C51 COMPILER V8.02 USB_DISK 08/24/2008 00:08:02 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE USB_DISK
OBJECT MODULE PLACED IN USB_DISK.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE USB_DISK.C LARGE BROWSE
line level source
1 #include "Gloab.H"
2 #include "UDISK_DEF.H"
3
4 extern void ReadFlash(); //Defined in FLASH_RW.C
5 extern void WriteFlash();
6
7 #define FLASH_RD_BUSY P5_2
8
9 // 写入地址字段
10 static void NfWriteAddr(unsigned char adr)
11 {
12 1 *((unsigned char volatile xdata *)0xF002) = adr;
13 1 }
14
15 // 命令写入
16 static void NfWriteCmd(unsigned char cmd)
17 {
18 1 *((unsigned char volatile xdata *)0xF001) = cmd;
19 1 }
20
21 // FLASH测忙
22 static void NfWaitBusy(void)
23 {
24 1 while (!FLASH_RD_BUSY);
25 1 }
26
27 code unsigned char Device_Descriptor[18] = {
28 0x12, //设备描述符的字节数大小
29 0x01, //设备描述符类型编号
30 0x10, 0x01, //USB版本号
31 0x00, //USB分配的设备类代码
32 0x00, //USB分配的子类代码
33 0x00, //USB分配的设备协议代码
34 0x20, //端点0的最大包大小
35 0xEB, 0x03, //厂商编号
36 0x02, 0x20, //产品编号
37 0x00, 0x01, //设备出厂编号
38 0x00, //设备厂商字符串的索引
39 0x00, //描述产品字符串的索引
40 0x00, //描述设备序列号字符串的索引
41 0x01 //可能的配置数量
42 };
43
44 code unsigned char Configuration_Descriptor_All[32] = {
45 //配置描述符
46 0x09, //配置描述符的字节数大小
47 0x02, //配置描述符类型编号
48 0x20,0x00, //Total length in bytes of data returned LSB //MSB
49 0x01, //只包含一个接口
50 0x01, //该配置的编号
51 0x00, //iConfiguration字段
52 0x80, //采用总线供电,不支持远程唤醒
53 0xfa, //Maximum Power Consumption in 2mA units
54 //接口描述符
55 0x09, //接口描述符的字节数大小
C51 COMPILER V8.02 USB_DISK 08/24/2008 00:08:02 PAGE 2
56 0x04, //接口描述符类型编号
57 0x00, //接口编号为0
58 0x00, //该接口描述符的编号
59 0x02, //非0端点数量为2,只使用端点主端点输入和输出
60 0x08, //USB大容量存储设备
61 0x06, //使用的子类,为简化块命令 1=RBC,2=SFF,3=QIC,4=UFI,5=SFF,6=SCSI
62 0x50, //使用的协议,这里使用单批量传输协议
63 0x00, //接口描述符字符串索引
64 //主端点输入描述
65 0x07, //端点描述符的字节数大小
66 0x05, //端点描述符类型编号
67 0x81, //端点号,主输入端点
68 0x02, //使用的传输类型,批量传输
69 0x40, 0x00, //该端点支持的最大包尺寸,64字节
70 0x00, //中断扫描时间,对批量传输无效
71 //主端点输出描述
72 0x07, //端点描述符的字节数大小
73 0x05, //端点描述符类型编号
74 0x02, //端点号,主输出端点
75 0x02, //使用的传输类型,批量传输
76 0x40, 0x00, //该端点支持的最大包尺寸,64字节
77 0x00 //中断扫描时间,对批量传输无效
78 };
79
80
81 code unsigned char B_InquiryData[] = {
82 0x00, //Direct Access Device
83 0x80, //RMB
84 0x00, //ISO/ECMA/ANSI
85 0x01, //Response Data Format
86 0x1f, //Additional Length
87 0x00, //Reserved
88 0x00, //Reserved
89 0x00, //Reserved
90 'J', 'I', 'A', 'N', 'G', 'S', 'H', 'A', //Vendor Information
91 'U', 'S', 'B', '-', 'M', 'P', '3', ' ', 'V', '3', '.', '0', ' ', ' ', ' ', ' ',//Product Identifica
-tion
92 0, 0, 0, 0 //Product Revision Level n.nn
93 };
94
95 //SCSI-Read_Format_capacities命令的返回数据
96 code unsigned char B_Read_Format_capacities[] = {0x00, 0x00, 0x00, 0x10, //capacity list header
97 0x00, 0x00, 0x07, 0xf5, 0x01, 0x00, 0x02, 0x00, //capacity descriptor
98 //Number of Blocks =2037,unformatted media,blocklength = 512Bytes
99 0x00, 0x00, 0x07, 0xfd, 0x00, 0x00, 0x02, 0x00 //Formattable Capacity Descriptors
100 };
101
102 //SCSI-Read_Capacity命令的返回数据
103 code unsigned char B_Read_Capacity[] = {
104 0x00, 0x00, 0xfe, 0xa0, //Last Logical Block Address for 32MB
105 0x00, 0x00, 0x02, 0x00 //block length in bytes
106 };
107 //SCSI-Mode_Sense命令的返回数据
108 code unsigned char B_Mode_Sense_ALL[] = {0x0b, 0x00, //Mode Data Length
109 0x00, 0x08, 0x00, 0x00,
110 0x7d, 0, 0, 0, 0x02, 0x00
111 };
112 //SCSI-Mode_Sense命令的返回数据
113 code unsigned char B_Mode_Sense_TPP[] = {0xf0, 0x00, //Mode Data Length
114 05, 00, 00, 00, 00, 0x0b, 00, 00, 00, 00, 0x24, 00, 00, 00, 00, 00
115 };
116 //SCSI-Mode_Sense命令的返回数据
C51 COMPILER V8.02 USB_DISK 08/24/2008 00:08:02 PAGE 3
117 code unsigned char B_Mode_Sense_ZERO[] = {0x00, 0x06, //Mode Data Length
118 0x00, //Medium Type Code
119 0, //write enabled
120 0, 0, 0, 0 //reserved
121 };
122
123
124 unsigned char data bulk_CSW[]={0x55,0x53,0x42,0x53, //bytes 4 dCSWSignature
125 0x00,0x00,0x00,0x00, //bytes 4 dCSWTag
126 0x00,0x00,0x00,0x00, //bytes 4 dDataResiduce
127 0x00}; //bCSWStatus 00=good state.
128
129
130
131 struct_CBW data bulk_CBW;
132
133
134
135 void AtmelUSBInit()
136 {
137 1 int data i;
138 1 PLLNDIV = 0x04;
139 1 PLLCON |= (0x3&Rdiv)<<6;
140 1 PLLRDIV = (0x3ff&Rdiv)>>2;
141 1 USBCLK=0;
142 1 PLLCON&=(~PLLRES);
143 1 PLLCON|=PLLEN;
144 1 USBCON&=(~USBE);
145 1 for(i=0;i<3000;i++);
146 1 USBCON|=USBE;
147 1
148 1 }
149
150 void EpEnable(void)
151 {
152 1 UEPNUM=0x00; UEPCONX=0x80;
153 1 UEPNUM=0x01; UEPCONX=0x86;
154 1 UEPNUM=0x02; UEPCONX=0x82;
155 1 UEPRST=0x07; UEPRST= 0x00;
156 1 UEPIEN=0x07; USBIEN|=EEOFINT;
157 1 USBADDR=FEN;
158 1 }
159
160 unsigned char ReadEp(unsigned char EpNum,unsigned char *Data)
161 {
162 1 unsigned char data i=0;
163 1 UEPNUM=EpNum;
164 1 while(i<UBYCTLX)
165 1 {
166 2 Data[i++]=UEPDATX;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -