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

📄 vendor.c

📁 ISP1581设计的大容量存储器固件程序。 包含以下文件: d14.h i2c.c i2c.h init.c intrpt.c kernel.c
💻 C
字号:
//***********************************************************************
// 	File Name	:       Vendor.c										*
//	厂商自定义请求														*
//***********************************************************************
//*	                     包含文件定义									*
//***********************************************************************
#include "standard.h"		//标准请求头文件
#include "Kernel.h"			//
#include "D14.h"			//
#include "usb.h"			//
#include "i2c.h"			//
//***********************************************************************
//*	                     全局参数定义     								*
//***********************************************************************
extern volatile D14_CNTRL_REG xdata	D14_Cntrl_Reg;
extern USB_DEVICE_REQ	idata	USB_Device_Request;
extern USB_INT_FLAG USB_Int_Flag;
extern I2C_FLAG I2C_Flag;

#define MaxPacketSize 0x40

extern UC idata I2CDev_UniqueAddr;
extern UC idata I2C_SubAddr;


extern UC idata Endpt_FIFO[64];
//***********************************************************************
//*	                     事务(函数)声明								*
//***********************************************************************
extern void Start_mSEC_Timer(Data);
void Vendor_Specific_Command(void);
void ISP1581_Access(void);
void VnrReq_I2CIn(void);
void VnrReq_I2COut(void);
extern void DMA_Init(void);
extern void Enable_Endpoint(void);

void dimmy1(void);
void dimmy2(void);
void dimmy1(void)
{
}
void dimmy2(void)
{
}

//***********************************************************************
//*	Routine 	:                                                		*
//*	Input		: None                   								*
//*	Output		: None                                					*
//*	Function	:                                            			*
//***********************************************************************
void Vendor_Specific_Command(void)
{
	if(USB_Device_Request.bRequest == 0x00)
	{
	ISP1581_Access();
	}
	else if((USB_Device_Request.bRequest == 0x01)|( USB_Device_Request.bRequest==0x0C))
	{
		if((USB_Device_Request.wValue==0x4000)|(USB_Device_Request.wValue==0x4200)) 
		{
			USB_Device_Request.wValue >>= 8;
			I2CDev_UniqueAddr = (UC) USB_Device_Request.wValue;
			USB_Device_Request.wIndex >>= 8;
			I2C_SubAddr = (UC) USB_Device_Request.wIndex;

			if(USB_Device_Request.bmRequestType&0x80) 
			{
				VnrReq_I2CIn();//	0xCO In
			}
			else 
	    	{
  				VnrReq_I2COut();
			}
		}
		else if((USB_Device_Request.wValue==0x0000)|(USB_Device_Request.wValue==0x7600)) 
		{
			ISP1581_Access();
		
		}
		else
		{
			D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
			D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
	
			D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
			D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
		}
	}
	else 
	{
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
		D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;

		D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
		D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
	}	

}

//***********************************************************************
//*	Routine 	:                                                		*
//*	Input		: None                   								*
//*	Output		: None                                					*
//*	Function	:                                            			*
//***********************************************************************
void ISP1581_Access(void)
{
//int i;
	if( USB_Device_Request.wIndex==0x0000)
	{

	//Issue GDMA start command.  
		D14_Cntrl_Reg.D14_DMA_COMMAND = 0x0; 

		D14_Cntrl_Reg.D14_ENDPT_INDEX = 1; //ep0 in
		D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;//ep0 out
 		D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;	


	}
	else if( USB_Device_Request.wIndex==0x0100)
	{
		dimmy1();
		DMA_Init();
		Enable_Endpoint();	
		dimmy2();
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 1; //ep0 in
		D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;//ep0 out
		D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;	
	}
	else if ( USB_Device_Request.wIndex==0x0200)
	{


			D14_Cntrl_Reg.D14_ENDPT_INDEX = 1; //ep0 in
			D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 3;
			D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
			D14_Cntrl_Reg.D14_DATA_PORT_LSB = D14_Cntrl_Reg.D14_CHIP_ID_LSB;
			D14_Cntrl_Reg.D14_DATA_PORT_LSB = D14_Cntrl_Reg.D14_CHIP_ID_MBYTE;
			D14_Cntrl_Reg.D14_DATA_PORT_LSB = D14_Cntrl_Reg.D14_CHIP_ID_MSB;

			while(!USB_Int_Flag.BITS.EP0TX);					//In Token Ack detected
         	USB_Int_Flag.BITS.EP0TX = 0;
         
			D14_Cntrl_Reg.D14_ENDPT_INDEX = 0; //ep0 out
			D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
	
			D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;//???
			D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;	//???
              	
	}
	else if( USB_Device_Request.wIndex==0x0300)  
	{
//			ID_[1] = D14_Cntrl_Ptr->D14_SCRATCH_REGISTER;

			D14_Cntrl_Reg.D14_ENDPT_INDEX = 1; //ep0 in
			D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 1;
			D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
			D14_Cntrl_Reg.D14_DATA_PORT_LSB = D14_Cntrl_Reg.D14_SCRATCH_REGISTER;

			while(!USB_Int_Flag.BITS.EP0TX);					//In Token Ack detected
         	USB_Int_Flag.BITS.EP0TX = 0;
         
			D14_Cntrl_Reg.D14_ENDPT_INDEX = 0; //ep0 out
			D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
	
			D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;//???
			D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;	//???

	}
	else if( USB_Device_Request.wIndex==0xAA00)  
	{

//		RES_EM = 1; //Reset active low
		RES_EM = 0;
	
//		RES_OV = 0; //Reset active high
//		RES_OV = 1;
		 Start_mSEC_Timer(100);  
		//for(i=0; i<1000;i++);
		RES_EM = 1;
//		RES_OV = 0;

		D14_Cntrl_Reg.D14_ENDPT_INDEX = 1; //ep0 out
		D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
	
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;//???
		D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;	//???
	}
	else if( USB_Device_Request.wIndex==0x8A00)  
	{
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 1; //ep0 out
		D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
	
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;//???
		D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;	//???
	}
	else
	{
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
		D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;

		D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
		D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
	}
}

//***********************************************************************
//*	Routine 	:                                                		*
//*	Input		: None                   								*
//*	Output		: None                                					*
//*	Function	:                                            			*
//***********************************************************************
void VnrReq_I2CIn(void) 
{
//If bit7 of bmRequest =1, device to host bmRequest =0, host to device
//device to host
UC i;			


	D14_Cntrl_Reg.D14_ENDPT_INDEX = 1; //ep0 in
	I2C_Flag.VALUE = 0x08;
	Hal4I2C_Read(0);
	I2C_Flag.VALUE = 0;
 		while(USB_Device_Request.wLength > MaxPacketSize)
		{
			USB_Device_Request.wLength -= MaxPacketSize ;
			D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = MaxPacketSize;
			D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;


			I2C_Flag.VALUE = 0x04;
			Hal4I2C_Read(MaxPacketSize);					
			I2C_Flag.VALUE = 0;
			for( i=0; i < MaxPacketSize; i++ )
				D14_Cntrl_Reg.D14_DATA_PORT_LSB = Endpt_FIFO[i];
				//D14_Cntrl_Reg.D14_DATA_PORT_MSB = (UC) (Temp >> 8);
			while(!USB_Int_Flag.BITS.EP0TX);					//In Token Ack detected
        	 	USB_Int_Flag.BITS.EP0TX = 0;			
		}		
			D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = USB_Device_Request.wLength;
			D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
			I2C_Flag.VALUE = 0x34;
			Hal4I2C_Read(USB_Device_Request.wLength);
			I2C_Flag.VALUE = 0;

			for(i=0; i<USB_Device_Request.wLength;i++)
				D14_Cntrl_Reg.D14_DATA_PORT_LSB = Endpt_FIFO[i];

			while(!USB_Int_Flag.BITS.EP0TX);					//In Token Ack detected
	     		USB_Int_Flag.BITS.EP0TX = 0;

	D14_Cntrl_Reg .D14_ENDPT_INDEX = 0; //ep0 out
	D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;

	D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;//ep0 In
	D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;	//???
}

//***********************************************************************
//*	Routine 	:                                                		*
//*	Input		: None                   								*
//*	Output		: None                                					*
//*	Function	:                                            			*
//***********************************************************************
void VnrReq_I2COut(void)
{
UC i;


		I2C_Flag.VALUE = 0x01;
	  	Hal4I2C_Write(0);
		I2C_Flag.VALUE = 0;
//Due to chip bug, It is not allowed accesing the Micro controller port during the last 4 
//bytes of reading the OUT token FIFO (D14_Cntrl_Reg.D14_DATA_PORT_LSB).     

	if( USB_Device_Request.wLength )
	{
	 	while(USB_Device_Request.wLength > MaxPacketSize)
		{
			USB_Device_Request.wLength -= MaxPacketSize;
			D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
			EX0 = 0;
			for(i = 0 ; i < MaxPacketSize ; i++)
			Endpt_FIFO[i] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
			EX0 = 1;
			I2C_Flag.VALUE = 0x04;
		  	Hal4I2C_Write(MaxPacketSize);
			I2C_Flag.VALUE = 0;


			while(!USB_Int_Flag.BITS.EP0RX);					//Out Token Ack detected
		 	USB_Int_Flag.BITS.EP0RX = 0; //ep0, out
		}		
			EX0 = 0;
			D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
			for(i = 0 ; i < USB_Device_Request.wLength ; i++)
				Endpt_FIFO[i] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
			EX0 = 1;

			I2C_Flag.VALUE = 0x06;
		 	Hal4I2C_Write(USB_Device_Request.wLength);
			I2C_Flag.VALUE = 0;
			USB_Int_Flag.BITS.EP0RX = 0; //ep0, out

	}		    		
	else
	{
		I2C_Flag.VALUE = 0x02;
		Hal4I2C_Write(USB_Device_Request.wLength);
		I2C_Flag.VALUE = 0;
	}

    D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
	D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;

	D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;// ep0 In
	D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
                                                                                 
}
  	

⌨️ 快捷键说明

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