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

📄 vdor.c

📁 DSP通过双口RAM和ISP1581实现下位机的USB固件程序
💻 C
字号:
#include "string.h"
#include "SMPro.H"
#include "USB.H"
#include "HAL.H"
#include "VDOR.H"
//#include "USBD12.H"
#include "main.h"
#include "USB200.H"
#include "Isp1581.h"
#include "Isr.h"
//#include "Hal4sys.h"
#include "chap9.h"
#include "dportram.h"

extern CONTROL_XFER		ControlData;
extern ZBOARDFLAGS bZBoardFlags;
extern IO_REQUEST idata ioRequest;
extern GLOBE_VARIABLE globe_variable;
extern unsigned char idata GenEpBuf[EP1_PACKET_SIZE];
extern unsigned char bdata key;
code unsigned char ProductCode[] ="1234567890123456";


//unsigned int dackpulse=0;
//bit dmadackbit=0;
/**************************************************************************/
/* Subroutines For Vendor Specific Request                                */ 
/**************************************************************************/
/*
void EnableIsoMode(void)
{
	bZBoardFlags.bits.ISO_CONFIG = 1;
	
	Chap9_ControlWriteHandshake();
}
*/
void USBVendorCmdSet(void)
{
	memcpy(&ioRequest.bCommand,ControlData.dataBuffer,0x1);
	bZBoardFlags.bits.bLED = 1;
	Chap9_ControlWriteHandshake();
}
void USBVendorCmdGet(void)
{
	USB_Single_Transmit(&key,1);
	//USB_Single_Transmit(0, 0);
}
/**********************************************************************************************/
/**********************************************************************************************/
//for ramshare project
/**********************************************************************************************/
//put zhe data that will be sended in GenEpBuf[]
/////88*****************************************************************************************888/
/**********************************************************************************************/	
void USBVendorReadData(void)
{
  unsigned char xdata *exAddress;
  unsigned char i,j,k;
  exAddress=0;
memcpy(&ioRequest.bCommand,ControlData.dataBuffer,0x1);
	Chap9_ControlWriteHandshake();
	if(ioRequest.bCommand>64)
	{
j=ioRequest.bCommand/64;

for(k=0;k<j;k++)
{
EA=0;
ramcs=0;
for(i=0;i<64;i++)
{

GenEpBuf[i]=*(exAddress);
exAddress++;
}
ramcs=1;
EA=1;

ISP1581_WriteBulkEndpoint(EPINDEX4EP01IN,GenEpBuf,64);
}
ioRequest.bCommand=ioRequest.bCommand-j*64;
}
	
		//ioRequest.bCommand=64;
   //ReadRam(ioRequest.bCommand,GenEpBuf);
EA=0;
ramcs=0;
for(i=0;i<ioRequest.bCommand;i++)
{

GenEpBuf[i]=*(exAddress);
exAddress++;
}
ramcs=1;
EA=1;

	ISP1581_WriteBulkEndpoint(EPINDEX4EP01IN,GenEpBuf,ioRequest.bCommand);

}
/**********************************************************************************************/
/**********************************************************************************************/
/**********************************************************************************************/
/**********************************************************************************************/
void read_write_register(void)
{
	if(ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) //0x80
	  {
		if(ControlData.DeviceRequest.wIndex == GET_FIRMWARE_VERSION &&
			ControlData.DeviceRequest.wValue == 0 &&
			ControlData.DeviceRequest.wLength == 1)
			{
				get_firmware_version();
			}
		else
		{
			USB_Stall_EP0();
		}
	}	// if read register
	else{
		if(ControlData.DeviceRequest.wIndex == SETUP_DMA_REQUEST &&
			ControlData.DeviceRequest.wValue == 0 &&
			ControlData.DeviceRequest.wLength == 6)
		{
			RaiseIRQL();
			setup_dma_request();//0xc0,0x0c,0x0000,0x0471,0x0006
			LowerIRQL();
		}
		else
		{
			USB_Stall_EP0();
		}
	}	// if write register

}

void get_firmware_version(void)
{
	unsigned char i;

	i = 0x01; // firmware version number, return 0x01 for PC kit version 1
	USB_Single_Transmit(&i,1);
}

void setup_dma_request(void)
{
	memcpy((unsigned char *)&ioRequest + ControlData.DeviceRequest.wValue,
		ControlData.dataBuffer,
		ControlData.DeviceRequest.wLength);

	ioRequest.uSize = SWAP(ioRequest.uSize);
	ioRequest.uAddressL = SWAP(ioRequest.uAddressL);

	if(ioRequest.uSize > DMA_BUFFER_SIZE) // Unaccepted request
	{
		//Chap9_StallEP0();
		USB_Stall_EP0();
	}
	else
	{
		RaiseIRQL();
		bZBoardFlags.bits.setup_dma = 1;
		LowerIRQL();
	} // else if accepted request
}
///////////////////////////////////////////////////////////////
/*void setup_dma(void)
{
	
	if(ioRequest.bCommand & 0x80)
	{
		Config_DMA();
		
	}
	else
	{
		setup_io();
	}

	bZBoardFlags.bits.DCP_state = USBFSM4DCP_CONTROLOUTDONE;
	//return;
	
}
// it only works on PC evaluation kit.
void setup_io(void)
{
	
}

void Config_DMA(void)
{
	unsigned int c;
	unsigned short dmacfg_width; // 16 bit when assign dmacfg_width16 to it, else 8 bit;
	//unsigned short isa_dma_more = 0; // when this is not 0, EXT EOT does not come;
    
	RaiseIRQL();
	bZBoardFlags.bits.dma_state = DMA_RUNNING;
	LowerIRQL();

	dmacfg_width = dmacfg_width16;
	T1=1;
	dmaw=1;
	//CPLD_ctl(dmactl_stop);
	
	ISP1581_SetDMACMD(dmacmd_reset);

	globe_variable.xfer_dir = (unsigned short)(ioRequest.bCommand & 0x1);
	
	if(globe_variable.xfer_dir==0x1){// IN
		globe_variable.isp1581_dma_counterset_lowbyte = ioRequest.uSize; //exact number, else, clear ep feature;
		}
	else{
		globe_variable.isp1581_dma_counterset_lowbyte = ioRequest.uSize ; // adjust value, stop by short packet;
		}

	//设置CPLD中传输的起始地址和字节数
	//CPLD_cfg(ioRequest.uAddressL,globe_variable.isp1581_dma_counterset_lowbyte);
	
		//硬件极性配置
		ISP1581_SetDMAHDCfg(dmahd_dreqpolh|dmahd_eotpolh);

		//dma 传输个数
		ISP1581_SetDMACounterLow(globe_variable.isp1581_dma_counterset_lowbyte);
		ISP1581_SetDMACounterHigh(0x00);		// no longer than 64k bytes each transfer;
		//dma 传输配置
		ISP1581_SetDMAConfig(0x00
							|dmacfg_burst0//dmacfg_burst0
							|dmacfg_modediorw
//							|dmacfg_modedack
//							|dmacfg_modediorack
							|dmacfg_width//dmacfg_width16
							//|dmacfg_disablecounter  //test
							);
		//dma 中断配置
		ISP1581_SetDMAIntMask(dmaint_intereot|dmaint_xferok);
		//ISP1581_SetDMAIntMask(dmaint_extereot|dmaint_xferok);
           
           CY=0;
           dackpulse=globe_variable.isp1581_dma_counterset_lowbyte>>1;
		if(globe_variable.xfer_dir==0x1)
		{//IN
			//选择端点
			ISP1581_SetDMAEP(bulkinendpointindex);

			bZBoardFlags.bits.dma_endpoint = bulkinendpointindex;
			//将用作dma传输的端点中断禁止
			c = ISP1581_GetIntEnableLow();
			ISP1581_SetIntEnableLow(c&(~bulkinendpointinterrupt));
			ISP1581_SetEPMAXSize(EPINDEX4EP02IN, maxepsize_1024);
			//启动cpld的DMA传输机制
			//CPLD_ctl(dmactl_in|dmactl_start);
			///启动dma读操作
	       //TL1 = 0xf0;                   	///* value set by user 
	       //TH1 = 0xf0;                  	///* value set by user  
           ISP1581_SetDMACMD(dmacmd_gdmaread);
           
		dmadackbit=1;  


       MCU_LED0=!MCU_LED0;
           
		}
		else
		{// out
			ISP1581_SetDMAEP(bulkoutendpointindex);
			bZBoardFlags.bits.dma_endpoint = bulkoutendpointindex;
			c = ISP1581_GetIntEnableLow();
			ISP1581_SetIntEnableLow(c&(~bulkoutendpointinterrupt));
			
			//CPLD_ctl(dmactl_out|dmactl_start);
			
			ISP1581_SetDMACMD(dmacmd_gdmawrite);
            MCU_LED0=!MCU_LED0;
		

		}
		
}


 */ // 7.25

⌨️ 快捷键说明

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