📄 usb_disk.lst
字号:
183 1 WriteEp(0,18,Device_Descriptor);
184 1
185 1 if((DesType==0x02)&&(nLength==0x09))
186 1 WriteEp(0,9,Configuration_Descriptor_All);
187 1
188 1 if((DesType==0x02)&&(nLength==0xff))
189 1 {
190 2 WriteEp(0,32,Configuration_Descriptor_All);
191 2 WriteEp(0,2,&Device_Descriptor[4]);
192 2 }
193 1
194 1 if((DesType==0x02)&&(nLength==0x20))
195 1 WriteEp(0,32,Configuration_Descriptor_All);
196 1 }
197
198 void Set_Configuration(unsigned char wValue)
199 {
200 1 if(wValue == 0)
201 1 {
202 2 UEPNUM=0x00; UEPCONX=0x80;
203 2 UEPNUM=0x01; UEPCONX=0x86;
204 2 UEPNUM=0x02; UEPCONX=0x82;
205 2 USBCON&=(~CONFG);
206 2 WriteEp(0,0,0);
207 2 }
208 1 else if(wValue == 1)
209 1 {
210 2 UEPNUM=0x00; UEPCONX=0x80;
211 2 UEPNUM=0x01; UEPCONX=0x86;
212 2 UEPNUM=0x02; UEPCONX=0x82;
213 2 USBCON|=CONFG;
214 2 WriteEp(0,0,0);
215 2 }
216 1 }
217
218 void Ep0()
219 {
220 1 unsigned char data DT[32]={0,};
221 1 unsigned char data i;
222 1 i = ReadEp(0,DT);
223 1 if (((DT[0] & 0x60)==0) && i)
224 1 {
225 2 switch (DT[1])
226 2 {
227 3 case set_address :Set_Address(DT[2]); break;
228 3 case get_descriptor :Get_Descriptor(DT[3],DT[6]); break;
229 3 case set_configuration :Set_Configuration(DT[2]); break;
230 3 default :; break;
231 3 }
232 2 }
233 1 else if(DT[0]==0xa1)
234 1 {
235 2 WriteEp(0,0,0);
236 2 }
237 1 }
238
239
240 void WriteEpBulk(unsigned char EpNum,unsigned char nLength,unsigned char *Data)
C51 COMPILER V8.08 USB_DISK 05/19/2008 19:51:06 PAGE 5
241 {
242 1 unsigned char data i;
243 1 UEPNUM=EpNum;
244 1 UEPSTAX|=DIR;
245 1 for(i=0;i<nLength;i++) UEPDATX=Data[i];
246 1 UEPSTAX|=TXRDY;
247 1 }
248
249 void TransmitCSW()
250 {
251 1 WriteEpBulk(1, sizeof(bulk_CSW), bulk_CSW);
252 1 while(!(UEPSTAX&TXCMP)) ;
253 1 UEPSTAX&=(~(TXCMP));
254 1 }
255
256 void main_txdone()
257 {
258 1 UEPSTAX&=(~(TXCMP));
259 1 TransmitCSW();
260 1 }
261
262 void SCSI_Mode_Sense()
263 {
264 1 if(bulk_CBW.CBWCB[2] == SCSI_MSPGCD_TPP) //Page Code=Timer and Potect Page
265 1 {WriteEpBulk(1, sizeof(B_Mode_Sense_TPP), B_Mode_Sense_TPP);}
266 1 else if(bulk_CBW.CBWCB[2] == SCSI_MSPGCD_RETALL) //Page Code=All
267 1 {WriteEpBulk(1, sizeof(B_Mode_Sense_ALL), B_Mode_Sense_ALL);}
268 1 else {WriteEpBulk(1, sizeof(B_Mode_Sense_ZERO), B_Mode_Sense_ZERO);}
269 1 }
270
271 void SCSI_Read_Format_Capacities()
272 {
273 1 if(bulk_CBW.CBWCB[7]==0 && bulk_CBW.CBWCB[8]==0)return;
274 1 WriteEpBulk(1, sizeof(B_Read_Format_capacities), B_Read_Format_capacities);
275 1 }
276
277 void SCSI_Read10()
278 {
279 1 unsigned char data i;
280 1 union
281 1 {
282 1 unsigned long Block;
283 1 unsigned char Addr[4];
284 1 }data BLK;
285 1 unsigned char length;
286 1
287 1 BLK.Addr[2] = bulk_CBW.CBWCB[4];
288 1 BLK.Addr[3] = bulk_CBW.CBWCB[5];
289 1
290 1 length = bulk_CBW.CBWCB[8];
291 1 while(length>0)
292 1 {
293 2
294 2 K9F_FUN = COMMAND;
295 2 K9F5608 = 0x00;
296 2 K9F_FUN = ADDRESS;
297 2 K9F5608 = 0;
298 2 K9F5608 = BLK.Addr[3];
299 2 K9F5608 = BLK.Addr[2];
300 2
301 2 K9F_FUN = D_DATA;
302 2 UEPNUM=0x01;
C51 COMPILER V8.08 USB_DISK 05/19/2008 19:51:06 PAGE 6
303 2 UEPSTAX|=DIR;
304 2 while(!(K9F_FUN & RB));
305 2
306 2 for(i=0;i<8;i++)
307 2 {
308 3 ReadFlash();
309 3 UEPSTAX|=TXRDY;
310 3 while(!(UEPSTAX&TXCMP));
311 3 UEPSTAX&=(~(TXCMP));
312 3 }
313 2 K9F5608 = INACTIVE;
314 2
315 2 length--;
316 2 BLK.Block ++;
317 2 }
318 1 TransmitCSW();
319 1 }
320
321 void delay()
322 {
323 1 unsigned char data i=20;
324 1 while(i-->0);
325 1 }
326
327 void SCSI_Write10()
328 {
329 1 union
330 1 {
331 1 unsigned long page;
332 1 unsigned char addr[4];
333 1 }data PG;
334 1
335 1 unsigned char data i=0,length=0,nBeginPage=0;
336 1
337 1
338 1 K9F_FUN = COMMAND;
339 1 K9F5608 = 0x60;
340 1 K9F_FUN = ADDRESS;
341 1 K9F5608 = BuffBlock;
342 1 K9F5608 = 0xff;
343 1 K9F_FUN = COMMAND;
344 1 K9F5608 = 0xd0;
345 1 K9F_FUN = D_DATA;
346 1 delay();
347 1
348 1 while(!(K9F_FUN & RB));
349 1
350 1 K9F_FUN = COMMAND;
351 1 K9F5608 = 0x60;
352 1 K9F_FUN = ADDRESS;
353 1 K9F5608 = BuffBlock|0x20;
354 1 K9F5608 = 0xff;
355 1 K9F_FUN = COMMAND;
356 1 K9F5608 = 0xd0;
357 1 K9F_FUN = D_DATA;
358 1
359 1 PG.addr[2] = bulk_CBW.CBWCB[4];
360 1 PG.addr[3] = bulk_CBW.CBWCB[5];
361 1
362 1 length = bulk_CBW.CBWCB[8];
363 1 nBeginPage = PG.addr[3]&0x1f;
364 1 UEPNUM = 0x02;
C51 COMPILER V8.08 USB_DISK 05/19/2008 19:51:06 PAGE 7
365 1 delay();
366 1 while(!(K9F_FUN & RB));
367 1
368 1 if(nBeginPage>0)
369 1 {
370 2 for(i=0;i<nBeginPage;i++)
371 2 {
372 3 K9F_FUN = COMMAND;
373 3 K9F5608 = 0x00;
374 3 K9F_FUN = ADDRESS;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -