📄 standard.c
字号:
default:
//------
USB_Stall(pClass->pUsb, 0);
}
break;
//-------------------
case USB_SET_ADDRESS:
//-------------------
USB_SendZLP0(pClass->pUsb,
(Callback_f) USB_SetAddress,
(void *) pClass->pUsb);
break;
//-------------------------
case USB_SET_CONFIGURATION:
//-------------------------
STD_SetConfiguration(pClass, (char) pSetup->wValue);
break;
//-------------------------
case USB_GET_CONFIGURATION:
//-------------------------
STD_GetConfiguration(pClass);
break;
//---------------------
case USB_CLEAR_FEATURE:
//---------------------
switch (pSetup->wValue) {
//---------------------
case USB_ENDPOINT_HALT:
//---------------------
USB_Halt(pClass->pUsb, LBYTE(pSetup->wIndex), USB_CLEAR_FEATURE);
USB_SendZLP0(pClass->pUsb, 0, 0);
break;
//----------------------------
case USB_DEVICE_REMOTE_WAKEUP:
//----------------------------
pClass->wDeviceStatus &= ~REMOTE_WAKEUP; // Remote wakeup disabled
USB_SendZLP0(pClass->pUsb, 0, 0);
break;
//------
default:
//------
USB_Stall(pClass->pUsb, 0);
}
break;
//------------------
case USB_GET_STATUS:
//------------------
switch (USB_REQUEST_RECIPIENT(pSetup)) {
//-------------------------
case USB_RECIPIENT_DEVICE:
//-------------------------
STD_GetDeviceStatus(pClass);
break;
//---------------------------
case USB_RECIPIENT_ENDPOINT:
//---------------------------
STD_GetEndpointStatus(pClass,
LBYTE(pSetup->wIndex));
break;
//------
default:
//------
USB_Stall(pClass->pUsb, 0);
}
break;
//-------------------
case USB_SET_FEATURE:
//-------------------
switch (pSetup->wValue) {
//---------------------
case USB_ENDPOINT_HALT:
//---------------------
USB_Halt(pClass->pUsb, LBYTE(pSetup->wIndex), USB_SET_FEATURE);
USB_SendZLP0(pClass->pUsb, 0, 0);
break;
//----------------------------
case USB_DEVICE_REMOTE_WAKEUP:
//----------------------------
pClass->wDeviceStatus |= REMOTE_WAKEUP; // Remote wakeup enabled
USB_SendZLP0(pClass->pUsb, 0, 0);
break;
//------
default:
//------
USB_Stall(pClass->pUsb, 0);
}
break;
//------
default:
//------
USB_Stall(pClass->pUsb, 0);
}
}
static char DataParseInSetup[16];
static char IN_BUFFER[PACKET_LENGTH];
static volatile int IN_BUFFER_LENGTH;
static char OUT_BUFFER[PACKET_LENGTH];
static volatile int OUT_BUFFER_LENGTH;
void FINISHED_WRITE(int p1,int p2,int p3,int p4)
{
OUT_BUFFER_LENGTH=0;
}
void FINISHED_READ()
{
IN_BUFFER_LENGTH=PACKET_LENGTH;
}
/*void dataPraseInSetup(S_std_class * p1,int p2,int p3,int p4)//接收到了一个Register命令数据
{
int high,low,all;
if(DataParseInSetup[5]==0x81)//读
{
if(OUT_BUFFER_LENGTH==0)
{
USB_Stall(p1->pUsb, 0);
return;
}
high =DataParseInSetup[4];
low = DataParseInSetup[3];
all=(high*256)+low;
USB_Write(p1->pUsb,2,OUT_BUFFER,all,(Callback_f)FINISHED_WRITE,0);
USB_SendZLP0(p1->pUsb, 0, 0);
}
else if(DataParseInSetup[5]==0x80)//写
{
if(IN_BUFFER_LENGTH!=0)
{
USB_Stall(p1->pUsb, 0);
return;
}
high = DataParseInSetup[4];
low = DataParseInSetup[3];
all=(high*256)+low;
USB_SendZLP0(((S_std_class *)p1)->pUsb, 0, 0);
USB_Read(p1->pUsb,1,IN_BUFFER,all,(Callback_f)FINISHED_READ,0);
}
}*/
extern void MY_REQUEST_HANDLE(S_std_class *pClass)
{
S_usb_request *pSetup = USB_GetSetup(pClass->pUsb);
unsigned char type=pSetup->bmRequestType & 0x60;
if(type==0x40)//自定义请求
{
/*if(pSetup->wIndex==0x0471||pSetup->wIndex==0x0472)
{
USB_Read(pClass->pUsb,0,DataParseInSetup,pSetup->wLength,(Callback_f)dataPraseInSetup,pClass);
USB_SendZLP0(pClass->pUsb, 0, 0);
}*/
if(pSetup->wIndex==0x0471)
{
if(IN_BUFFER_LENGTH!=0)
{
USB_Stall(pClass->pUsb, 0);
return;
}
USB_SendZLP0(((S_std_class *)pClass)->pUsb, 0, 0);
USB_Read(pClass->pUsb,1,IN_BUFFER,PACKET_LENGTH,(Callback_f)FINISHED_READ,0);
}
else if(pSetup->wIndex==0x0472)
{
if(OUT_BUFFER_LENGTH==0)
{
USB_Stall(pClass->pUsb, 0);
return;
}
USB_Write(pClass->pUsb,2,OUT_BUFFER,PACKET_LENGTH,(Callback_f)FINISHED_WRITE,0);
USB_SendZLP0(pClass->pUsb, 0, 0);
}
else if(pSetup->wIndex==0x0474)
{
int m=PACKET_LENGTH;
USB_Write(pClass->pUsb,0,&m,sizeof(m),0,0);
}
else if(pSetup->wIndex==0x0476)
{
int m=PACKET_LENGTH;
USB_Write(pClass->pUsb,0,&m,sizeof(m),0,0);
}
//else if(pSetup->w)
else
{
USB_Stall(pClass->pUsb, 0);
}
}
else if(type==0)
{
STD_RequestHandler(pClass);
}
else USB_Stall(pClass->pUsb, 0);
}
void iniBuf()
{
IN_BUFFER_LENGTH=0;
OUT_BUFFER_LENGTH=0;
}
//读USB数据,返回值为实际读取长度
int ReadUSB(char* buf,int length)
{
int i;
if(IN_BUFFER_LENGTH==0)
return 0;
//for(i=0;i<PACKET_LENGTH;i++)
//{
// buf[i]=IN_BUFFER[i];
//}
memcpy(buf,IN_BUFFER,PACKET_LENGTH);
IN_BUFFER_LENGTH=0;
return PACKET_LENGTH;
}
int WriteUSB(char* buf,int length)
{
int cnt;
if(OUT_BUFFER_LENGTH>0)
return 0;
//for(cnt=0;cnt<length;cnt++)
//{
// OUT_BUFFER[cnt]=buf[cnt];
//}
memcpy(OUT_BUFFER,buf,length);
OUT_BUFFER_LENGTH=length;
//USB_Write(p1->pUsb,2,OUT_BUFFER,PACKET_LENGTH,(Callback_f)FINISHED_WRITE,0);
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -