📄 usb.lst
字号:
156
157 void Get_Descriptor(unsigned char DesType,unsigned char nLength) //???? //得到描述符
158 {
159 1 if(DesType==0x01) //取设备描述符
160 1 WriteEp(0,18,Device_Descriptor);
161 1
162 1 if((DesType==0x02)&&(nLength==0x09)) //取端口描述符
163 1 WriteEp(0,9,Configuration_Descriptor_All);
164 1
165 1 if((DesType==0x02)&&(nLength==0xff)) //取端点描述符
166 1 {
167 2 WriteEp(0,32,Configuration_Descriptor_All);
168 2 WriteEp(0,2,&Device_Descriptor[4]);
169 2 }
170 1
171 1 if((DesType==0x02)&&(nLength==0x20))
172 1 WriteEp(0,32,Configuration_Descriptor_All); //取配置描述符
173 1 }
174
175 void Set_Configuration(unsigned char wValue) //设置配置
176 {
177 1 if(wValue == 0)
178 1 {
179 2 UEPNUM=0x00; UEPCONX=0x80;
C51 COMPILER V7.50 USB 03/19/2006 13:41:49 PAGE 4
180 2 UEPNUM=0x01; UEPCONX=0x86;
181 2 UEPNUM=0x02; UEPCONX=0x82;
182 2 USBCON&=(~CONFG);
183 2 WriteEp(0,0,0); //状态传送阶段之前完成指定操作
184 2 }
185 1 else if(wValue == 1)
186 1 {
187 2 UEPNUM=0x00; UEPCONX=0x80;
188 2 UEPNUM=0x01; UEPCONX=0x86;
189 2 UEPNUM=0x02; UEPCONX=0x82;
190 2 USBCON|=CONFG;
191 2 WriteEp(0,0,0); //状态传送阶段之前完成指定操作
192 2 }
193 1 }
194
195 void Ep0() //????????? //---端点0处理主函数
196 {
197 1 unsigned char data DT[32]={0,};
198 1 unsigned char data i;
199 1 i = ReadEp(0,DT);
200 1 if (((DT[0] & 0x60)==0) && i)
201 1 {
202 2 switch (DT[1])
203 2 {
204 3 case set_address :Set_Address(DT[2]); break; //设置地址
205 3 case get_descriptor :Get_Descriptor(DT[3],DT[6]); break; //取描述符
206 3 case set_configuration :Set_Configuration(DT[2]); break; //设置配置
207 3 default :; break;
208 3 }
209 2 }
210 1 else if(DT[0]==0xa1) //非标准USB请求
211 1 {
212 2 WriteEp(0,0,0);
213 2 }
214 1 }
215
216 /******************************************************************************/
217 /** 以下为利用Bulk_Only传输协议的函数部分 **/
218 /******************************************************************************/
219 unsigned char data bulk_CSW[]={0x55,0x53,0x42,0x53, // bytes 4 dCSWSignature
220 0x00,0x00,0x00,0x00, //bytes 4 dCSWTag
221 0x00,0x00,0x00,0x00, //bytes 4 dDataResiduce
222 0x00}; //bCSWStatus 00=good state.
223
224 typedef struct _STRUCT_CBW
225 {
226 unsigned char CBWCB[12]; //for UFI Command all have 12bit
227
228 } struct_CBW;
229
230 struct_CBW data bulk_CBW;
231
232 void WriteEpBulk(unsigned char EpNum,unsigned char nLength,unsigned char *Data)
233 {
234 1 unsigned char data i;
235 1 UEPNUM=EpNum; //---设置端点号
236 1 UEPSTAX|=DIR; //...设置为In模式
237 1 for(i=0;i<nLength;i++) UEPDATX=Data[i]; //---填缓冲区
238 1 UEPSTAX|=TXRDY; //---发送数据
239 1 }
240
241 void TransmitCSW() //向Host返回CSW
C51 COMPILER V7.50 USB 03/19/2006 13:41:49 PAGE 5
242 {
243 1 WriteEpBulk(1, sizeof(bulk_CSW), bulk_CSW);
244 1 while(!(UEPSTAX&TXCMP)) ;
245 1 UEPSTAX&=(~(TXCMP)); //清除TXCMP
246 1 UEPINT = 0;
247 1 }
248
249 void main_txdone() //数据发送完毕给出回复
250 {
251 1 UEPSTAX&=(~(TXCMP)); //清除TXCMP
252 1 TransmitCSW();
253 1 }
254
255 //////////////////////////////////有关输出端点的调用//////////////////////////////////////////////
256 #define Inquiry 0x12
257 #define Mode_Sense 0x1A
258 #define Read10 0x28
259 #define Read_Capacity 0x25
260 #define Read_Format_Capacities 0x23
261 #define Test_Unit_Ready 0x00
262 #define Verify 0x2F
263 #define Write10 0x2A
264 #define Medium_Removal 0x1E
265
266 #define SCSI_MSPGCD_TPP 0x1C
267 #define SCSI_MSPGCD_RETALL 0x3F
268
269 //SCSI-Inquiry命令的返回数据
270 code unsigned char B_InquiryData[] = {
271 0x00, //Direct Access Device
272 0x80, //RMB
273 0x00, //ISO/ECMA/ANSI
274 0x01, //Response Data Format
275 0x1f, //Additional Length
276 0x00, //Reserved
277 0x00, //Reserved
278 0x00, //Reserved
279 'U', 'E', 'S', 'T', 'C', '-', 'Z', 'H', //Vendor Information
280 'a', 'n', 'g', ' ', 'T', 'i', 'a', 'n', ' ', 'y', 'i',' ', 'V', '1', '.', '0', //Product Identifica
-tion
281 0, 0, 0, 0}; //Product Revision Level n.nn
282
283 //SCSI-Read_Format_capacities命令的返回数据
284 code unsigned char B_Read_Format_capacities[] = {0x00, 0x00, 0x00, 0x10, //capacity list header
285 0x00, 0x00, 0x07, 0xf5, 0x01, 0x00, 0x02, 0x00, //capacity descriptor
286 //Number of Blocks =2037,unformatted media,blocklength = 512Bytes
287 0x00, 0x00, 0x07, 0xfd, 0x00, 0x00, 0x02, 0x00 //Formattable Capacity Descriptors
288 };
289 //SCSI-Read_Capacity命令的返回数据
290 code unsigned char B_Read_Capacity[] = {
291 0x00, 0x00, 0xfe, 0xa0, //Last Logical Block Address for 32MB
292 0x00, 0x00, 0x02, 0x00 //block length in bytes
293 };
294 //SCSI-Mode_Sense命令的返回数据
295 code unsigned char B_Mode_Sense_ALL[] = {0x0b, 0x00, //Mode Data Length
296 0x00, 0x08, 0x00, 0x00,
297 0x7d, 0, 0, 0, 0x02, 0x00
298 };
299 //SCSI-Mode_Sense命令的返回数据
300 code unsigned char B_Mode_Sense_TPP[] = {0xf0, 0x00, //Mode Data Length
301 05, 00, 00, 00, 00, 0x0b, 00, 00, 00, 00, 0x24, 00, 00, 00, 00, 00
302 };
C51 COMPILER V7.50 USB 03/19/2006 13:41:49 PAGE 6
303 //SCSI-Mode_Sense命令的返回数据
304 code unsigned char B_Mode_Sense_ZERO[] = {0x00, 0x06, //Mode Data Length
305 0x00, //Medium Type Code
306 0, //write enabled
307 0, 0, 0, 0 //reserved
308 };
309
310
311 void SCSI_Mode_Sense()
312 {
313 1 if(bulk_CBW.CBWCB[2] == SCSI_MSPGCD_TPP) //Page Code=Timer and Potect Page
314 1 {WriteEpBulk(1, sizeof(B_Mode_Sense_TPP), B_Mode_Sense_TPP);}
315 1 else if(bulk_CBW.CBWCB[2] == SCSI_MSPGCD_RETALL) //Page Code=All
316 1 {WriteEpBulk(1, sizeof(B_Mode_Sense_ALL), B_Mode_Sense_ALL);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -