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

📄 read_reg.c

📁 ubi9021的51驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "reg51.h"
#include "read_reg.h"
#include "usbmass.h"

void          _nop_     (void);

U8	gStallMark;
U32	gWaitPktTicks = UMO_WAIT_USB_PKT_TICKS;	//timeout value for usb packet waiting

XD	U8		gEPOUT;			//out-endpoint
XD	U8		gEPIN;			//in-endpoint
XD	U8		volatile gEP;
XD	U8		gIrqEn;
XD	U8		gMxPkSz;		//maximum packet size (bulk)
XD	U8		gMxPkSzCtr;		//maximum packet size (control)
XD	U8		gIFSC;			//interface sub-class
XD	U8		gUsbVer;		//USB Version
XD	U8		gUsbCfg;
XD	U8		gLun;			//"LUN" for USB_XXX routines
XD	U8		gDevAddr;

XD	U16 	gVID;
XD	U16		gPID;

U8	gUsbIrq;		//DEV_WaitForIrq, DEV_WaitMS, WaitPacketDone

U32	 msec;



U8	gInitState    = IS_NO_INIT;



//////////////////////////////////////////////////////////
int enable_debug=0;
char gUsbTimeOver=0;

int gSecCnt=0;
int gSecAddr=-1;

///////////////////////////////////////////////////////////
extern XD	U8	gCBW[31];		//SCSI CBW 31byte or
extern XD	U8		gMaxLun;		//gMaxLun = ??á??· LUN

/*
void test(void)
{
 char i = 0;
/* for(i=0;i<n;i++)
 {
 	_nop_();
 }
}  */
void clock_initial() reentrant using 0
{
	TMOD=0x01;
	TF0=0;
	TR0=0;
	TH0=0xf8;
	TL0=0x30;
	TR0=1;
	ET0=1;
	EA=1;
}
void clock_int() interrupt 1 using 1
{
	if(--msec==0)
		{
		gUsbTimeOver=1;
		//ET0=0;
		//EA=0;
		}
}
void RISC_start_timer2(U32 n)
{
	msec=n;
	clock_initial();
}

int usb_irq_poll()
{
   return (IO_IRQ_PENDING);
}

int usb_plugin()
{
  return (IO_PLUGIN_DET);
}

void RISC_sleep_nsec(U32 n)
{
		U32 nusec=n/1000;
		U32 i;
		for(i=0;i<nusec;i++)
			{
			 _nop_();
			 _nop_();
			}
}


void RISC_sleep_cycles(int n)
{
	while(n--)
	{
	      _nop_();
	}
}

void DEV_TimerStart(int msec)
{
	gUsbTimeOver=0;
	RISC_start_timer2(msec);

}

/******************************************************************************
 *	MemCopy
 ******************************************************************************/
/*
void MemCopy(U8* pTrg, U8* pSrc, U16 bytCnt)
{
	while(bytCnt-->0) *pTrg++ = *pSrc++;

	return;
}
*/


/******************************************************************************
 *	MemFill
 ******************************************************************************/

void MemFill(U8* buf, U8 val, U16 bytCnt)
{
	while(bytCnt-->0) *buf++ = val;

	return;
}

/*
void DEV_WriteReg(U8 addr, U8 regdata)
{
        MCU_CS=1;
	MCU_A0=1;
        MCU_WR=1;
        P0=addr;

	MCU_A0=0;
  	MCU_CS=0;
        MCU_WR=0;



	_nop_();
	_nop_();
	_nop_();
	MCU_WR=1;
        MCU_CS=1;
	MCU_A0=1;

	_nop_();
	_nop_();
	_nop_();

 	P0=regdata;

        MCU_CS=0;
  	MCU_WR=0;

	_nop_();
	_nop_();
	_nop_();


	MCU_WR=1;
	MCU_CS=1;

}


U8 DEV_ReadReg(U8 addr)
{
	register U8 regdata;

	MCU_RD=1;
       	MCU_A0=1;
        MCU_CS=1;
  	MCU_WR=1;



	P0=addr;
 	MCU_A0=0;
        MCU_CS=0;
 	MCU_WR=0;




	_nop_();
	_nop_();
	_nop_();

    	MCU_WR=1;
 	MCU_A0=1;
        MCU_CS=1;

	_nop_();
	_nop_();
	_nop_();
        P0=0xFF;  /////
  	MCU_CS=0;
 	MCU_RD=0;

	regdata=P0;

	MCU_RD=1;
        
        MCU_CS=1;

	return regdata;
}

*/


void DEV_WriteReg(U8 addr, U8 regdata)
{
        MCU_CS=1;
	MCU_A0=1;
        MCU_WR=1;
        P0=addr;

	MCU_A0=0;
  	MCU_CS=0;
        MCU_WR=0;



	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	
	MCU_WR=1;
	_nop_();	
        MCU_CS=1;
		
	_nop_();
	_nop_();
		
	MCU_A0=1;

	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();

 	P0=regdata;
	
	_nop_();
	_nop_();

        MCU_CS=0;
  	MCU_WR=0;

	_nop_();
	_nop_();
	_nop_();


	MCU_WR=1;
	_nop_();
	MCU_CS=1;

	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();	

}


U8 DEV_ReadReg(U8 addr)
{
	register U8 regdata;

	MCU_RD=1;
       MCU_A0=1;
        MCU_CS=1;
  	MCU_WR=1;



	P0=addr;
 	MCU_A0=0;
        MCU_CS=0;
 	MCU_WR=0;



	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();

    	MCU_WR=1;
	_nop_();	
 	MCU_A0=1;
        MCU_CS=1;

	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	
        P0=0xFF;  /////
 	_nop_();

	
  	MCU_CS=0;
 	MCU_RD=0;
	_nop_();
	_nop_();
	_nop_();
	
	regdata=P0;
	_nop_();
	_nop_();
	_nop_();
	
	MCU_RD=1;
   	_nop_();     
        MCU_CS=1;

	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();

	return regdata;
}

void DEV_WriteRegMulti(U8 addr, U16 cnt, U8* buf)
{
	U16	i;
	U8 *dptr;
	dptr=buf;

	
	if(cnt<512)
	{
		for(i=0;i<cnt;i++)
		{
			DEV_WriteReg(addr,*dptr++);
		}
	}
	else
	{
		for(i=0;i<cnt;i++)
		{
			DEV_WriteReg(addr,i);
			if((i%0x40) ==0)
				RISC_sleep_cycles(100);	
		}
		
	}
}


U8 DEV_ReadRegMulti(U8 addr, U16 cnt, register U8* buf)
{
	U16 i;
    register U8 regdata;

	if(cnt<64)
	{
	    if(buf!=TxNULL){
	        for(i=0x0;i<cnt;i++) {
	            *buf++ =DEV_ReadReg(addr);
	        }
	    }
	    else{
	        for(i=0x0;i<cnt;i++) {
	            regdata =DEV_ReadReg(addr);
	        }
	    }
	    return regdata;
	}
	else
	{
		if(buf!=TxNULL){
	        for(i=0x0;i<cnt;i++) {
	            *buf =DEV_ReadReg(addr);
	        }
	    }
	    else{
	        for(i=0x0;i<cnt;i++) {
	            regdata =DEV_ReadReg(addr);
	        }
		 }
	}
}






/******************************************************************************
 *	check if device is connected
 ******************************************************************************/

U8	DEV_CheckDeviceConnection(void)
{
	register U8 devAddr;

	if(!UH_DEV_IS_PLUGGEDIN()) return RES_ERR;

	devAddr = DEV_ReadReg(RH_DEV_ADDR);
	if(devAddr==0){
		DEV_WriteReg(RH_MASS_ADDR1,0x5A);
		if(DEV_ReadReg(RH_MASS_ADDR1)!=0x5A) return RES_ERR;
		DEV_WriteReg(RH_MASS_ADDR1,0);
		return RES_OK;
	}

	return (gDevAddr==devAddr)?RES_OK:RES_ERR;
}

/******************************************************************************
 *	Wait (?)MSec
 *
 *	INPUT:	- msec: mili-sec intervals to measure
 *	RETURN:
 *		RES_OK
 *		RES_ERR
 *	NOTE:
 *		before this routine .. SOF must be enabled: "DEV_WriteReg(RH_CHIP_CTR2,0x10);"
 *		this timer may has maximum 1msec deviation !!!
 ******************************************************************************/

U8	DEV_WaitMS(U16 msec)
{
	U16 ms, res=RES_OK;

	if(!UH_DEV_IS_PLUGGEDIN()) {return RES_ERR;}

	DEV_WriteReg(RH_INT_EN,UH_IRQ_SOF);
	DEV_ReadReg(0x08);
	DEV_TimerStart(2);

	for(ms=0;ms<msec&&gUsbTimeOver==0; )
	{

	    if(UBi9021_IRQ_PENDING()){
		if((DEV_ReadReg(RH_INT_STS)&UH_IRQ_SOF)>0){
		    DEV_TimerStart(2);
		    ms++;
		}
		//printf("IRQ PENDING....................................\n");
	    }
	    //printf("IRQ PENDING:%02x\n",UBi9021_IRQ_PENDING());
	    if(UBi9021_IRQ_PENDING()==0)
	    if(ISERR(DEV_CheckDeviceConnection())){res=RES_ERR; break; }
	    RISC_sleep_nsec(WFIRQ_SLEEP_TIME);
	}
	DEV_WriteReg(RH_INT_EN,0);
	return res;
}

/******************************************************************************
 *	DSESCRIPION:
 *		wait for UBi9021 Host interrupt.
 *		If time-out occurs, reset UBi9021 chip.
 *
 *	INPUT:
 *		- bIRQ: anticipated IRQ bits (OR-ing)
 *
 *	RETURN:
 *		- interrupt status: if enabled interrupt status occurs.
 *		- 0: if time-out
 *		- 4: if stall.
 *
 *	EXAMPLE:
 *		UH_IRQ_EN(UH_IRQ_USB_PKT_DONE);
 *		UH_Trigger(gEPIN);
 *		if(DEV_WaitForIrq(UH_IRQ_USB_PKT_DONE)==0) return RES_ERR;
 *
 ******************************************************************************/

U8	DEV_WaitForIrq(U8 bIRQ)
{
	U32 ticks=0;
	DEV_TimerStart(gWaitUsbPktMsec);

	while(gUsbTimeOver==0)
	{
		gUsbIrq = 0;
	    if(UBi9021_IRQ_PENDING())
	    {
		GET_UBi9021_IRQ_STS(gUsbIrq);
		if( (!(0x80&gEP)||(0xD0==gEP)) &&
			(DEV_ReadReg(RH_LAST_PKT_STS)&UH_LST_PKT_STS_NAK) ){
		    DEV_WriteReg(RH_EP_ADDR_N_PID,gEP);
		//    printf(("DEV_WaitForIrq: NAK -> retry\n"));
		    continue;
		}
		if(gUsbIrq&bIRQ){
		    DEV_WriteReg(RH_INT_EN,0);
		    return gUsbIrq;
		}
	    }
	    if((0xD0!=gEP) && DEV_ReadReg(RH_LAST_PKT_STS)==UH_LST_PKT_STS_STALL){
		USB_ResetPipe(gEP&~0x10);
		//printf(("DEV_WaitForIrq: stalled\n"));
		return UH_IRQ_FAKE_STALL;//STALL mark
	    }
	    if(gDevAddr!=DEV_ReadReg(RH_DEV_ADDR)||0x5A!=DEV_ReadReg(RH_MASS_ADDR2)){
		//printf(("DEV_WaitForIrq: addr error %x\n",DEV_ReadReg(RH_DEV_ADDR)));
		break;
	    }
	}
	//printf(("DEV_WaitForIrq: timeout error, gSecCnt=%x\n",gSecCnt));
	DEV_ResetChip(RST9021_FULL_RESET);
	return 0;
}


U8	DEV_WaitForIrqV(U8 bIRQ) //for video playing
{
	U8 pktSts=0;

	DEV_TimerStart(gWaitUsbPktMsec);
	while(gUsbTimeOver==0)
	{
	    if(UBi9021_IRQ_PENDING())
	    {
		GET_UBi9021_IRQ_STS(gUsbIrq);
		if((!(0x80&gEP)||(0xD0==gEP)) &&
		    (DEV_ReadReg(RH_LAST_PKT_STS)&UH_LST_PKT_STS_NAK) ){
		    DEV_WriteReg(RH_EP_ADDR_N_PID,gEP);
		    //printf(("DEV_WaitForIrqV: NAK -> retry\n"));
		    continue;
		}

		if(gUsbIrq&bIRQ){
		    DEV_WriteReg(RH_INT_EN,0);
		    return gUsbIrq;
		}
	    }
	    if((0xD0!=gEP) && DEV_ReadReg(RH_LAST_PKT_STS)==UH_LST_PKT_STS_STALL){
		USB_ResetPipe(gEP&~0x10);
		//printf(("DEV_WaitForIrqV: stalled\n"));
		return UH_IRQ_FAKE_STALL;//STALL mark
	    }
	    if(gDevAddr!=DEV_ReadReg(RH_DEV_ADDR)||0x5A!=DEV_ReadReg(RH_MASS_ADDR2)){
		//printf(("DEV_WaitForIrqV: addr error %x\n",DEV_ReadReg(RH_DEV_ADDR)));
		break;
	    }
   	}

	//printf(("DEV_WaitForIrqV: timeout error, gSecCnt=%x\n",gSecCnt));
	DEV_ResetChip(RST9021_FULL_RESET);
	return 0;
}





void ubi9021_hardreset()
{

		gInitState=IS_NO_INIT;
		//IO_BUS_RESET_READY;
		IO_BUS_RESET_HIGH;//PW_RST_PORT_LOW;
		RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);
		IO_BUS_RESET_LOW;//PW_RST_PORT_LOW;

		RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);
		IO_BUS_RESET_HIGH;//PW_RST_PORT_LOW;

		RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);
		IO_BUS_RESET_LOW;//PW_RST_PORT_LOW;

		RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);

        IO_BUS_RESET_HIGH;//PW_RST_PORT_LOW;
        MCU_SEL_OUT =0x01;
		RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);


	DEV_WriteReg(RH_CHIP_CTR2,0x20);
	//RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);
	UH_ENFORCE_HOST_MODE();
	UH_ENFORCE_HOST_MODE();
	//RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);

	DEV_WriteReg(RH_CHIP_CTR2,0x10);

}

/******************************************************************************
 *	reset UBi9021 chip (not USB device reset)
 *
 *	RETURN:
 *		RES_OK
 *		RES_ERR+1: device removed
 ******************************************************************************/

U8	DEV_ResetChip(U8 mode)
{

⌨️ 快捷键说明

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