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