📄 vdor.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 + -