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

📄 read_reg.lst

📁 ubi9021的51驱动程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
 632   2      		PW_RST_PORT_DIR_OUT;
 633   2      		IO_BUS_RESET_HIGH;//PW_RST_PORT_LOW;
 634   2      		RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);
 635   2      		IO_BUS_RESET_LOW;//PW_RST_PORT_HIGH;
 636   2      		RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);
 637   2      		IO_BUS_RESET_HIGH;//PW_RST_PORT_LOW;
 638   2      		RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);
 639   2      		IO_BUS_RESET_LOW;//PW_RST_PORT_HIGH;
 640   2      		RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);
 641   2      	}
 642   1      
 643   1              IO_BUS_RESET_HIGH;
 644   1              MCU_SEL_OUT=0x01;
 645   1              RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);
 646   1      	DEV_WriteReg(RH_CHIP_CTR2,0x20);
 647   1      	//RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);
 648   1      	UH_ENFORCE_HOST_MODE();
 649   1      	UH_ENFORCE_HOST_MODE();
 650   1      
 651   1      	DEV_WriteReg(RH_CHIP_CTR2,0x00);	//suspend 120msec before USB reset
 652   1      //	EPRINTF(("DEV_ResetChip!!!\n"));
 653   1      	return RES_OK;
 654   1      }
 655          
 656          
 657          
 658          
 659          /******************************************************************************
 660           *		Reset USB Device (for about 12msec)
 661           *		and wait for (?) msec for device init
 662           *
 663           *	RETURN:
 664           *		- RES_OK : reset + delay OK
 665           *		- RES_ERR: on SOF --> device plugged-off
 666           ******************************************************************************/
 667          U8 DEV_ResetUsbDevice(U8 msIdle)
 668          {
 669   1          U8 i;
 670   1      
 671   1      	//050131 捞惑窍霸 咯扁辑 吧府绰淀窃!!!	if(!UH_DEV_IS_PLUGGEDIN()) return RES_ERR;
 672   1          if(!UH_DEV_IS_PLUGGEDIN()) return RES_ERR;
 673   1      
 674   1          DEV_WriteReg(RH_INT_EN,UH_IRQ_SOF);
 675   1          DEV_WriteReg(RH_CHIP_CTR2,0x10);	//SOF
C51 COMPILER V6.12  READ_REG                                                               03/13/2007 09:54:33 PAGE 12  

 676   1          DEV_WriteReg(RH_CHIP_CTR1,0xC0);	//reset device
 677   1          for(i=0;i<msIdle;i++){
 678   2      		RISC_sleep_nsec(1000000); //1msec
 679   2          }
 680   1          return RES_OK;
 681   1      }
 682          
 683          void DEV_StopTriggerIn(U8 fReset)
 684          {
 685   1      	U8  i=0;
 686   1      	U32 j;
 687   1      
 688   1      	DEV_WriteReg(RH_DEV_ADDR,0x0F);
 689   1      	UH_SET_FIFO_SZ_EACH(0,1);
 690   1      	UH_FIFO_ROLLBACK_OUT();
 691   1      	DEV_WriteReg(RH_CHIP_CTR1,0x01);
 692   1      
 693   1      	for(j=0;j<300;j++){
 694   2      		RISC_sleep_nsec(10000); //3msec
 695   2      	}
 696   1      
 697   1      	if(fReset){
 698   2      		U8 temp = DEV_ReadReg(RH_MASS_ADDR2);
 699   2      		DEV_WriteReg(RH_CHIP_CTR2,0x20);
 700   2      		UH_ENFORCE_HOST_MODE();
 701   2      		UH_ENFORCE_HOST_MODE();
 702   2      		DEV_WriteReg(RH_USB_HOST_BASE_LEN,gMxPkSz);
 703   2      		if(temp==UMO_DEVICE_INIT_OK) DEV_WriteReg(RH_MASS_ADDR2,UMO_DEVICE_INIT_OK);
 704   2      	}
 705   1      	DEV_WriteReg(RH_CHIP_CTR1,0x00);
 706   1      	UH_FIFO_ROLLBACK_OUT();
 707   1      	DEV_WriteReg(RH_DEV_ADDR,gDevAddr);
 708   1      	DEV_WriteReg(RH_INT_EN,0);
 709   1      	DEV_ReadReg(RH_INT_STS);
 710   1      }
 711          
 712          
 713          U8	DEV_SafeTriggerAndWaitForInPacket(U8 ep, U16 bytCnt, U16 msec)
 714          {
 715   1      	U32 time;
 716   1      
 717   1      	UH_FIFO_ROLLBACK_IN();
 718   1      	DEV_WriteReg(RH_FIFO_SZ_LO,(U8)bytCnt);
 719   1      	DEV_WriteReg(RH_FIFO_SZ_HI,(U8)(bytCnt>>8));
 720   1      	DEV_WriteReg(RH_INT_EN,UH_IRQ_SOF);//UH_IRQ_READ_READY);//UH_IRQ_USB_PKT_DONE);
 721   1      	DEV_ReadReg(RH_INT_STS); //??
 722   1      	//printf("RH_INT_STS");
 723   1      	time = 20000*1000;
 724   1      	while(time--){ if(UBi9021_IRQ_PENDING()){ DEV_ReadReg(RH_INT_STS); break; } _nop_(); } //sync to SOF
 725   1      	DEV_WriteReg(RH_EP_ADDR_N_PID,ep);
 726   1      
 727   1      	for(time=0; time<msec; )//for(ticks=0; ticks<gWaitPktTicks; ticks++)
 728   1      	{
 729   2      		if(UBi9021_IRQ_PENDING())
 730   2      		{
 731   3      			RISC_sleep_nsec(100); //200usec
 732   3      			GET_UBi9021_IRQ_STS(gUsbIrq);
 733   3      			if(gUsbIrq&(UH_IRQ_READ_READY|UH_IRQ_USB_PKT_DONE)) break;
 734   3      			else if(gUsbIrq&UH_IRQ_SOF) time++;
 735   3      			gUsbIrq = 0;
 736   3      		}
 737   2      		if( (0xD0!=ep) && DEV_ReadReg(RH_LAST_PKT_STS)==UH_LST_PKT_STS_STALL){
C51 COMPILER V6.12  READ_REG                                                               03/13/2007 09:54:33 PAGE 13  

 738   3      			DEV_StopTriggerIn(1);
 739   3      			USB_ResetPipe(gEPIN);
 740   3      			USB_ResetPipe(gEPOUT);
 741   3      			return UH_IRQ_FAKE_STALL; //STALL mark
 742   3      		}
 743   2      		if(gDevAddr!=DEV_ReadReg(RH_DEV_ADDR)||UMO_DEVICE_INIT_OK!=DEV_ReadReg(RH_MASS_ADDR2)) break;
 744   2      	}
 745   1      
 746   1      	if((0x80&ep)&&(0xD0!=ep)&&(gUsbIrq&UH_IRQ_READ_READY)==0) DEV_StopTriggerIn(0);//Short-Packet
 747   1      
 748   1      	DEV_WriteReg(RH_INT_EN,0);
 749   1      	return gUsbIrq;
 750   1      }
 751          /******************************************************************************
 752           *	wait until (small) packet tranfer done
 753           ******************************************************************************/
 754          
 755          U8	WaitSmallPacket(U8 ep)
 756          {
 757   1      	U8	usbIrq,res=RES_ERR;
 758   1      	//U32 ticks;
 759   1      
 760   1      	if(!UH_DEV_IS_PLUGGEDIN()) return RES_ERR;
 761   1      	DEV_TimerStart(100);
 762   1      	while(gUsbTimeOver==0) //wait maximum 100msec
 763   1      	{
 764   2      		if(UBi9021_IRQ_PENDING())
 765   2      		{
 766   3      			GET_UBi9021_IRQ_STS(usbIrq);
 767   3      			if( (!(0x80&ep)||(0xD0==ep)) &&
 768   3      				(DEV_ReadReg(RH_LAST_PKT_STS)&UH_LST_PKT_STS_NAK) ){
 769   4      				DEV_WriteReg(RH_EP_ADDR_N_PID,ep);
 770   4      				continue;
 771   4      			}
 772   3      			if(usbIrq&UH_IRQ_USB_PKT_DONE){
 773   4      				DEV_WriteReg(RH_INT_EN,0);
 774   4      				return RES_OK;
 775   4      			}
 776   3      		}
 777   2      		if((0xD0!=ep) && (DEV_ReadReg(RH_LAST_PKT_STS)==UH_LST_PKT_STS_STALL)){
 778   3      			res = UH_IRQ_FAKE_STALL; //STALL mark
 779   3      			break;
 780   3      		}
 781   2      	}
 782   1      
 783   1      	DEV_StopTriggerIn(0);
 784   1      	DEV_WriteReg(RH_INT_EN,0);
 785   1      	return res;
 786   1      }
 787          
 788          
 789          
 790          /******************************************************************************
 791           *	clear feature
 792           ******************************************************************************/
 793          
 794          U8 USB_ResetPipe(U8 bEpAddr)//reset pipe
 795          {
 796   1      	U8* buf = (U8*)(gCBW+18);
 797   1      
 798   1      	MemFill(buf, 0, 8);
 799   1      	buf[0]=0x02;//type:standard,recipient:endpoint
C51 COMPILER V6.12  READ_REG                                                               03/13/2007 09:54:33 PAGE 14  

 800   1      	buf[1]=0x01;//CLEAR_FEATURE
 801   1      	buf[4]=(bEpAddr&~0x10);//endpoint address
 802   1      
 803   1      	DEV_WriteReg(RH_USB_HOST_BASE_LEN,gMxPkSzCtr);
 804   1      	UH_FIFO_ROLLBACK_OUT();
 805   1      	UH_SET_FIFO_SZ_EACH(0,8);
 806   1      	DEV_WriteReg(RH_INT_EN,UH_IRQ_USB_PKT_DONE);
 807   1      	DEV_WriteRegMulti(RH_USB_HOST_BASE_ADDR,8,buf);
 808   1      	DEV_WriteReg(RH_EP_ADDR_N_PID,gEP=0xD0);
 809   1      	if(ISERR(WaitSmallPacket(0xD0))) return RES_ERR;
 810   1      	MemFill(buf,0,31-18);
 811   1      	DEV_WaitMS(1);//??
 812   1      
 813   1      	DEV_WriteReg(RH_DEV_ADDR,gDevAddr);
 814   1      	UH_FIFO_ROLLBACK_IN();
 815   1      	DEV_WriteReg(RH_USB_HOST_BASE_LEN,0);//zero packet
 816   1      	UH_SET_FIFO_SZ_EACH(0,0);
 817   1      	UH_IRQ_EN(UH_IRQ_USB_PKT_DONE);
 818   1      	UH_Trigger(0x90);	///PID=DATA1
 819   1      	if(ISERR(WaitSmallPacket(0x90))) return RES_ERR;
 820   1      
 821   1      	DEV_WriteReg(RH_INT_EN,0);
 822   1      	DEV_WriteReg(RH_USB_HOST_BASE_LEN,gMxPkSz); //restore max packet size
 823   1      	return RES_OK;
 824   1      }
 825          
 826          
 827          
 828          /******************************************************************************
 829           *
 830           *	OPERATION:
 831           *		parse configuration descriptor and get some parameters
 832           *
 833           *	INPUT:
 834           *		-bcnt: byte count of the configuration descriptors
 835           *
 836           *	OUTPUT:
 837           *		- gMxPkSz : maximum packet size of a bulk-pipe
 838           *		- gEPIN   : bulk-in pipe
 839           *		- gEPOUT  : bulk-out pipe
 840           *		- gUsbCfg : value to be used in set-configuration
 841           *
 842           *	RETURN:
 843           *		- RES_OK   : BulkOnly type mass storage
 844           *					 bInterfaceClass    = 8 : Mass Storage
 845           *					 bInterfaceProtocol = 0x50 : BulkOnly
 846           *		- RES_ERR  :
 847           *		- RES_ERR+1: Unknown Device
 848           *		- RES_ERR+2: CBI type mass storage
 849           *					 bInterfaceClass    = 8 : Mass Storage
 850           *					 bInterfaceProtocol = 1 : CBI
 851           *		- RES_ERR+3: PTP (Picture Tranfer Protocol) type
 852           *					 bInterfaceClass    = 6 : Imaging
 853           *					 bInterfaceSubClass = 1 : Still Image Capture
 854           *					 bInterfaceProtocol = 1 : Picture Transfer Protocol (PIMA 15470)
 855           *
 856           ******************************************************************************/
 857          U8 ParseConfigDesc(IN U8 bcnt, IN U8* pDesc)
 858          {
 859   1      	while(bcnt>0)
 860   1      	{
 861   2      		switch(pDesc[1])
C51 COMPILER V6.12  READ_REG                                                               03/13/2007 09:54:33 PAGE 15  

 862   2      		{
 863   3      		case DESC_CONFIG:
 864   3      			if(pDesc[4]<1)return RES_ERR;	//number of interfaces
 865   3      			gUsbCfg = pDesc[5];
 866   3      			gIFSC = nOK08;
 867   3      			gEPIN = gEPOUT = nOK08;
 868   3      			break;
 869   3      		case DESC_INTERFACE:
 870   3      			gIFSC = nOK08;
 871   3      			gEPIN = gEPOUT = nOK08;
 872   3      			if(pDesc[5]==IFC_MASSSTORAGE){
 873   4      				if(pDesc[7]==IFP_CBI) return RES_ERR+2;
 874   4      				if(pDesc[7]==IFP_BULKONLY) gIFSC = pDesc[6]; //interface subclass
 875   4      			}
 876   3      			else if(pDesc[5]==IFC_IMAGING){
 877   4      				return RES_ERR+3;
 878   4      			}
 879   3      			break;
 880   3      		case DESC_ENDPOINT:
 881   3      			if(gIFSC!=nOK08 && pDesc[3]==EPTYPE_BULK){
 882   4      				if(pDesc[2]&0x80){ gEPIN = pDesc[2]; gMxPkSz = pDesc[4]; }
 883   4      				else{ gEPOUT = pDesc[2]; gMxPkSz = pDesc[4]; }
 884   4      			}
 885   3      			break;
 886   3      		}
 887   2      		if((gEPIN!=nOK08)&&(gEPOUT!=nOK08)) break;
 888   2      		if((pDesc[0]<3)||(pDesc[0]>9)) return RES_ERR;
 889   2      		if(bcnt<=pDesc[0]) break;
 890   2      
 891   2      		bcnt  -= pDesc[0];
 892   2      		pDesc += pDesc[0];
 893   2      	}
 894   1      
 895   1      	if((gEPIN==nOK08)||(gEPOUT==nOK08)) return RES_ERR+1;
 896   1      
 897   1      	gEPIN  |= 0x10;								//BULK-IN
 898   1      	gEPOUT |= 0x10;								//BULK-OUT
 899   1      	DEV_WriteReg(RH_USB_HOST_BASE_LEN,gMxPkSz);	//set MAX-PACKET-SIZE for BULK
 900   1      
 901   1      	return RES_OK;
 902   1      }
 903          
 904          
 905          
 906          
 907          
 908          /******************************************************************************
 909           *	INPUT:
 910           *		- type: type of the usb setup transfer
 911           *		- arg : type==USB_SETUP_GET_DEV_DESC_INIT -> byte length
 912           *				type==USB_SETUP_GET_DEV_DESC -> byte length
 913           *				type==USB_SETUP_GET_CFG_DESC -> byte length
 914           *				type==USB_SETUP_SET_ADDR     -> new address
 915           *				type==USB_SETUP_SET_CFG      -> new configuration
 916           *				type==others                 -> no use
 917           *		- buf :
 918           *
 919           *	RETURN:
 920           *		RES_OK
 921           *		RES_ERR: timeout
 922           *
 923           *	NOTE: 老窜 ep0甫 烹秦辑 背券登绰 data绰 128俺 捞窍扼绊 啊沥.
C51 COMPILER V6.12  READ_REG                                                               03/13/2007 09:54:33 PAGE 16  

 924           *
 925           ******************************************************************************/
 926            int disable_debug=0;
 927          
 928          U8 USB_ControlTransfer(U8 type, U8 arg, U8* buf)
 929          {
 930   1      	U8 dataByteCnt,res;
 931   1      //printf("control pipe start.\n");
 932   1      if(type==USB_SETUP_GET_DEV_DESC_INIT)
 933   1      {
 934   2      	//printf("Type:%d\n",type);
 935   2      	if(disable_debug==0)
 936   2      	enable_debug=1;
 937   2      }
 938   1      //enable_debug=1;
 939   1      	MemFill(buf,0,8);
 940   1      
 941   1      	switch(type)
 942   1      	{
 943   2      		case USB_SETUP_GET_DEV_DESC_INIT:
 944   2      		case USB_SETUP_GET_DEV_DESC:
 945   2      		case USB_SETUP_GET_CFG_DESC:
 946   2      			buf[0]=0x80,buf[1]=0x06,buf[6]=arg;
 947   2      			buf[3]=(type==USB_SETUP_GET_CFG_DESC)?0x02:0x01;
 948   2      			break;
 949   2      		case USB_SETUP_SET_ADDR:
 950   2      			buf[1]=0x05,buf[2]=arg;
 951   2      			break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -