📄 usbmass.lst
字号:
356 2 //if(ISERR(SCSI_ModeSense(0x3F,tBUF))){
357 2 // DEV_WaitMS(ERROR_WAIT);
358 2 //}
359 2 //#endif
360 2
361 2 for(i=0;i<2;i++)
362 2 {
363 3 DEV_WaitMS(TRY_WAIT);
364 3 if(rcscnt<READCAP_STALL_CNT_MAX){
365 4 res = SCSI_ReadCapacity(tBUF);
C51 COMPILER V6.12 USBMASS 03/13/2007 09:54:33 PAGE 7
366 4 if(res==RES_ERR+1)rcscnt++;
367 4 if(ISERR(res)){
368 5 if(gDevAddr!=DEV_ReadReg(RH_DEV_ADDR)||0x5A!=DEV_ReadReg(RH_MASS_ADDR2)) return RES_ERR;
369 5 DEV_WaitMS(ERROR_WAIT);
370 5 }
371 4 }
372 3 DEV_WaitMS(TRY_WAIT);
373 3 if(ISOK(SCSI_TestUnit())) {
374 4 gLunFlag |= (1<<gLun);
375 4 break;
376 4 }
377 3 else {
378 4 if(gDevAddr!=DEV_ReadReg(RH_DEV_ADDR)||0x5A!=DEV_ReadReg(RH_MASS_ADDR2)) return RES_ERR;
379 4 DEV_WaitMS(ERROR_WAIT);
380 4 }
381 3 }
382 2 }
383 1
384 1
385 1 for(i=0,gLunFlag=0;i<=512;i++)
386 1 {
387 2 for(gLun=0;gLun<=gMaxLun;gLun++)
388 2 {
389 3 if(gLunMask&(1<<gLun))continue; //skip non-generic storage
390 3 if((gLunFlag&(1<<gLun))==0)
391 3 {
392 4 DEV_WaitMS(TRY_WAIT);
393 4 if(rcscnt<READCAP_STALL_CNT_MAX){
394 5 res = SCSI_ReadCapacity(tBUF);
395 5 if(res==RES_ERR+1)rcscnt++;
396 5 if(ISERR(res)){
397 6 if(gDevAddr!=DEV_ReadReg(RH_DEV_ADDR)||0x5A!=DEV_ReadReg(RH_MASS_ADDR2)) return RES_ERR;
398 6 DEV_WaitMS(ERROR_WAIT);
399 6 continue;
400 6 }
401 5 }
402 4 DEV_WaitMS(TRY_WAIT);
403 4 if(ISERR(SCSI_TestUnit())){
404 5 if(gDevAddr!=DEV_ReadReg(RH_DEV_ADDR)||0x5A!=DEV_ReadReg(RH_MASS_ADDR2)) return RES_ERR;
405 5 DEV_WaitMS(ERROR_WAIT);
406 5 continue;
407 5 }
408 4 gLunFlag |= (1<<gLun);
409 4 }
410 3 }
411 2 if(gLunFlag>0) break;
412 2 }
413 1
414 1 //select first existing LUN
415 1 gLun=0;
416 1 for(gLun=0;gLun<=gMaxLun;gLun++){
417 2 if((gLunFlag&(1<<gLun))>0) break;
418 2 }
419 1 if(gLun>gMaxLun){
420 2 if(maxTryCnt-->0)goto IML_RETRY;
421 2 gLun=0;//if no media exist...select Lun-0
422 2 return RES_ERR;
423 2 }
424 1 ///pl
425 1 if(gLunSet & 0x100){
426 2 gLunSet &= 0x0ff;
427 2 gLun = gLunSet;
C51 COMPILER V6.12 USBMASS 03/13/2007 09:54:33 PAGE 8
428 2 }
429 1
430 1
431 1 for(i=0;i<3;i++){
432 2 DEV_WaitMS(10);
433 2 if(ISERR(SCSI_TestUnit())){
434 3 if(gDevAddr!=DEV_ReadReg(RH_DEV_ADDR)||0x5A!=DEV_ReadReg(RH_MASS_ADDR2)) return RES_ERR;
435 3 DEV_WaitMS(ERROR_WAIT);
436 3 //return RES_ERR;
437 3 }
438 2 }
439 1
440 1 if(ISERR(UM_SetLun(gLun, tBUF))){
441 2 if(maxTryCnt-->0)goto IML_RETRY;
442 2 gLun=0;//if no media exist...select Lun-0
443 2 return RES_ERR;
444 2 }
445 1
446 1 /* if(ISERR(UBI9021_read_sector_lba((short*)tBUF,0,1)==0)){
447 1 if(maxTryCnt==0)return RES_ERR;
448 1 maxTryCnt--;
449 1 rcscnt=0;
450 1 goto IML_RETRY;
451 1 }*/
452 1
453 1
454 1 #if (UMO_READ_USB1_PACKET_UNIT==1)
455 1 gUsbReadUnit = (gUsbVer==USB_VER_1X)?64:512;
456 1 #else
gUsbReadUnit = 512;
#endif
459 1
460 1 return RES_OK+gMaxLun;
461 1
462 1 }
463
464
465 U8 ubi9021_send_read_write_cmd(int stSec, int secCnt, U8 isread)//isread=1:read,0:write
466 {
467 1 /* if(stSec+secCnt>gTotSecCnt){
468 1 return RES_ERR;
469 1 }*/
470 1
471 1 if(gDevAddr!=DEV_ReadReg(RH_DEV_ADDR)||0x5A!=DEV_ReadReg(RH_MASS_ADDR2)){
472 2 if(gDevAddr!=DEV_ReadReg(RH_DEV_ADDR)||0x5A!=DEV_ReadReg(RH_MASS_ADDR2)){
473 3 //EPRINTF((" error gDevAddr %d reg %d reg2 %d \n", gDevAddr, DEV_ReadReg(RH_DEV_ADDR), DEV_ReadReg(RH_M
-ASS_ADDR2) ));
474 3 DEV_ResetChip(RST9021_FULL_RESET);
475 3 return RES_ERR;
476 3 }
477 2 }
478 1
479 1 gCBW[8]=0,gCBW[9]=(U8)(secCnt<<1),gCBW[10]=(U8)(secCnt>>7),gCBW[11]=(U8)(secCnt>>15);//byte size
480 1 gCBW[12] = (isread)?0x80:0;// 0x80=bulk-in, 0x00=bulk-out
481 1 MemFill(gCBW+13,0,31-13);
482 1 gCBW[13] = gLun;//LUN
483 1 gCBW[14] = (gIFSC==6)?0x0A:0x0C;//CBW length
484 1 gCBW[15] = (isread)?SCSI_CMD_READ10:SCSI_CMD_WRITE10;
485 1 gCBW[17] = (U8)((stSec)>>24),gCBW[18]=(U8)((stSec)>>16),gCBW[19]=(U8)((stSec)>>8),gCBW[20]=(U8)(stSec);//
-page address
486 1 gCBW[22] = (U8)((secCnt)>>8),gCBW[23]=(U8)(secCnt);//page count
487 1
C51 COMPILER V6.12 USBMASS 03/13/2007 09:54:33 PAGE 9
488 1 SCSI_SendCBW();
489 1 return RES_OK;
490 1 }
491
492
493
494
495 /******************************************************************************
496 * gCBW[18]~gCBW[30]俊 CSW甫 佬绢甸烙.
497 *
498 * NOTE:
499 * CSW error --> do REQUEST_SENSE
500 *
501 * RETURN:
502 * RES_ERR: CSW error
503 * RES_OK: CSW ok
504 ******************************************************************************/
505 U8 SCSI_GetCSW(void)
506 {
507 1 U8 res;
508 1 UH_SET_FIFO_SZ_EACH(0,13);
509 1 UH_FIFO_ROLLBACK_IN();
510 1 UH_IRQ_EN(UH_IRQ_READ_READY);
511 1 UH_Trigger(gEPIN);
512 1
513 1 //if(DEV_WaitForIrq(UH_IRQ_READ_READY)==0) return RES_ERR_SCSI_CSW;
514 1 res = DEV_WaitForIrq(UH_IRQ_READ_READY);
515 1 if(res==0||res==UH_IRQ_FAKE_STALL) return RES_ERR;
516 1 res = DEV_ReadRegMultiAndDiscard(RH_USB_HOST_BASE_ADDR,13);
517 1 if(0!=res){
518 2 SCSI_RequestSense();
519 2 return RES_ERR;
520 2 }
521 1 return RES_OK;
522 1 }
523
524
525 void UBI9021_FlushSectorRead(void)
526 {
527 1 //U8 i;
528 1
529 1 gSecAddr=-1;//flag for not-in-seq-read state.
530 1 UH_FIFO_ROLLBACK_IN();
531 1
532 1 while(gSecCnt>0)
533 1 {
534 2 gSecCnt--;
535 2 UH_IRQ_EN(UH_IRQ_READ_READY);
536 2 UH_Trigger(gEPIN);
537 2 if(DEV_WaitForIrq(UH_IRQ_READ_READY)==0) return;
538 2 UH_FIFO_ROLLBACK_IN();
539 2 }
540 1 gSecCnt=0;
541 1 SCSI_GetCSW();
542 1 return;
543 1 }
544
545
546
547 /******************************************************************************
548 * read from sequential sectors
549 * INPUT:
C51 COMPILER V6.12 USBMASS 03/13/2007 09:54:33 PAGE 10
550 * - sec : Start Sector Address
551 * - secCnt: sequential sector count
552 * RETURN:
553 * RES_OK / RES_ERR
554 ******************************************************************************/
555
556 int UBI9021_read_sector_lba(short *buf, int stSec, int secCnt)
557 {
558 1 U8 res;
559 1 int bytSize=0;
560 1 extern int enable_debug;
561 1 if(0==secCnt||0<gSecCnt) return 0;
562 1
563 1 gSecAddr = stSec;
564 1 gSecCnt = secCnt;
565 1
566 1 //printf("read start.\n");
567 1 if(ISERR(ubi9021_send_read_write_cmd(gSecAddr, gSecCnt, 1))) return 0; //isread=1:read
568 1 if(0==DEV_WaitForIrq(UH_IRQ_USB_PKT_DONE)) return bytSize;
569 1 //printf("cmd ok.\n");
570 1
571 1 if(0x04CB==gVID && 0x012A==gPID) DEV_WaitMS(3); //for finepix f610
572 1 UH_SET_FIFO_SZ(gUsbReadUnit);
573 1 UH_FIFO_ROLLBACK_IN();
574 1 gUsbTrgCnt = (gSecCnt*(512/gUsbReadUnit))+1;
575 1
576 1
577 1
578 1 while(gUsbTrgCnt)
579 1 {
580 2 UH_SET_FIFO_SZ(gUsbReadUnit);
581 2 UH_FIFO_ROLLBACK_IN();
582 2 UH_IRQ_EN(UH_IRQ_READ_READY);
583 2 UH_Trigger(gEPIN);
584 2 gUsbTrgCnt--;
585 2
586 2 res = DEV_WaitForIrqV(UH_IRQ_READ_READY);
587 2 if(res==0) return bytSize;
588 2 if(res==UH_IRQ_FAKE_STALL){
589 3 gSecCnt = gUsbTrgCnt = 0;
590 3 SCSI_GetCSW();
591 3 return bytSize;
592 3 }
593 2 DEV_ReadRegMulti(RH_USB_HOST_BASE_ADDR,gUsbReadUnit,(U8*)buf);
594 2 //printf("read unit ok.\n");
595 2 buf += (gUsbReadUnit/2);// coz buf is short ptr
596 2 bytSize += gUsbReadUnit;
597 2 if(0==(bytSize%512)){ //sector boundary
598 3 gSecAddr++;
599 3 gSecCnt--;
600 3 }
601 2 if(1==gUsbTrgCnt){
602 3 gUsbTrgCnt = 0;
603 3 gSecCnt = 0;
604 3 if(ISERR(SCSI_GetCSW())) return 0;
605 3 //while(1)printf("RUN11 OK.\n");
606 3 //printf("read ok.\n");
607 3 return bytSize;
608 3 }
609 2 }
610 1 return bytSize;
611 1 }
C51 COMPILER V6.12 USBMASS 03/13/2007 09:54:33 PAGE 11
612 /******************************************************************************
613 * write to sequential sectors
614 * INPUT:
615 * - sec : Start Sector Address
616 * - secCnt: sequential sector count
617 * RETURN:
618 * RES_OK / RES_ERR
619 ******************************************************************************/
620
621 U8 SCSI_WriteSectors( U8* buf,U32 stSec, U32 secCnt)
622 {
623 1
624 1 if(secCnt==0) return 0;
625 1
626 1 if(gSecCnt>0){
627 2 UBI9021_FlushSectorRead();
628 2 }
629 1
630 1 if(ISERR(SCSI_TestUnit()))
631 1 {
632 2 if(gDevAddr!=DEV_ReadReg(RH_DEV_ADDR)||0x5A!=DEV_ReadReg(RH_MASS_ADDR2))
633 2 return RES_ERR;
634 2 DEV_WaitMS(ERROR_WAIT);
635 2 }
636 1
637 1
638 1
639 1 if(ISERR(ubi9021_send_read_write_cmd(stSec, gSecCnt, 0))) return 0; //isread=0:write
640 1 if(DEV_WaitForIrq(UH_IRQ_SEND_READ_WRITE_CMD)==0) return RES_ERR;
641 1
642 1 UH_SET_FIFO_SZ_EACH(2,0);
643 1
644 1 while(secCnt--)
645 1 {
646 2 DEV_WriteRegMulti(RH_USB_HOST_BASE_ADDR,512,buf);
647 2 UH_IRQ_EN(UH_IRQ_WRITE_READY);
648 2 UH_Trigger(gEPOUT);
649 2 if(DEV_WaitForIrq(UH_IRQ_WRITE_READY)==0) return RES_ERR;
650 2 buf+=512;
651 2 }
652 1
653 1 return SCSI_GetCSW();
654 1 }
655
656
657
658
659
660 int USB_write_sector_lba(U8 *dest,U32 lba, U32 nblocks)
661 {
662 1 int ret;
663 1 ret=SCSI_WriteSectors(dest,lba,nblocks);
664 1 return ret;
665 1 }
666
667
668 int USB_boot_setup()
669 {
670 1 unsigned char gltmpbuff[64];
671 1 //int glcf_hidden_sectors;
672 1 int i=1;
673 1
C51 COMPILER V6.12 USBMASS 03/13/2007 09:54:33 PAGE 12
674 1 UBI9021_read_sector_lba((short *)gltmpbuff,1253,1);
675 1
676 1 UBI9021_read_sector_lba((short *)gltmpbuff,1529,1);
677 1
678 1 do
679 1 {
680 2 UBI9021_read_sector_lba((short *)gltmpbuff,i,1);
681 2 i++;
682 2 }while(i<50000);
683 1
684 1 /*if(((gltmpbuff[0x0] == 0xEB) &&(gltmpbuff[0x2] == 0x90))||(gltmpbuff[0x0] == 0xE9)) {
685 1 glcf_hidden_sectors = 0;
686 1 } else {
687 1 glcf_hidden_sectors = (int)((gltmpbuff[446+8])|(gltmpbuff[446+9]<<8)|(gltmpbuff[446+10]<<16)|(gltmpbuff[4
-46+11]<<24));
688 1 }*/
689 1
690 1 // PPRINTF((" glcf_hidden_sectors =%d ", glcf_hidden_sectors));
691 1
692 1
693 1 MemFill(gltmpbuff,0,64);
694 1 USB_write_sector_lba(gltmpbuff, 253,1);
695 1
696 1 return;
697 1 }
698
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 3702 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 38 ----
PDATA SIZE = 6 124
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -