⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbmass.lst

📁 ubi9021的51驱动程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 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 + -