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