📄 usb_device_config.c
字号:
//Uart_Puts("\n ======other standard bRequest!\n");
CLR_EP0_OUTPKTRDY_DATAEND(); //Because of no data control transfers.
ep0State=EP0_STATE_INIT;
//Print_USB_SETUP_DATA(descSetup);
break;
}
}
static void Class_bRequest_Handler(U8 choice){
switch(choice)
{
case GET_DESCRIPTOR:
//Uart_Puts("GET_DESCRIPTOR !\n");
Descriptor_Type_Handler(descSetup.bValueH);
break;
case HID_GET_REPORT:
//Uart_Puts("HID_GET_REPORT !\n");
SET_EP0_INPKTRDY_DATAEND();
break;
case HID_GET_IDLE:
// Uart_Puts("HID_GET_IDLE !\n");
SET_EP0_INPKTRDY_DATAEND();;
break;
case HID_GET_PROTOCOL:
//Uart_Puts("HID_GET_PROTOCOL !\n");
SET_EP0_INPKTRDY_DATAEND();
break;
case HID_SET_IDLE:
Uart_Puts("HID_SET_IDLE !\n");
CLR_EP0_OUTPKTRDY_DATAEND();
//CLR_EP0_OUTPKTRDY_SEND_STALL();
ep0State=EP0_STATE_INIT;
break;
case HID_SET_PROTOCOL:
//Uart_Puts("HID_SET_PROTOCOL !\n");
CLR_EP0_OUTPKTRDY_DATAEND();
break;
default:
//Uart_Puts("\n other class bRequest!\n");
CLR_EP0_OUTPKTRDY_DATAEND();
break;
}
}
static void Descriptor_Type_Handler(U8 type){
switch(type)
{
case DEVICE_TYPE:
//Uart_Puts("DEVICE_TYPE!\n");
CLR_EP0_OUT_PKT_RDY();
ep0State=EP0_STATE_GD_DEV_0;
break;
case CONFIGURATION_TYPE:
//Uart_Puts("CONFIGURATION_TYPE!\n");
//Print_USB_SETUP_DATA(descSetup);
CLR_EP0_OUT_PKT_RDY();
if((descSetup.bLengthL+(descSetup.bLengthH<<8))>0x9)//bLengthH should be used for bLength=0x209 at WIN2K
ep0State=EP0_STATE_GD_CFG_0; //for WIN98,WIN2K
else
ep0State=EP0_STATE_GD_CFG_ONLY_0; //for WIN2K
break;
case STRING_TYPE:
// Uart_Puts("STRING_TYPE!\n");
CLR_EP0_OUT_PKT_RDY();
switch(descSetup.bValueL)
{
case 0:
ep0State=EP0_STATE_GD_STR_I0;
break;
case 1:
ep0State=EP0_STATE_GD_STR_I1;
break;
case 2:
ep0State=EP0_STATE_GD_STR_I2;
break;
case 3:
ep0State=EP0_STATE_GD_STR_I3;
break;
default:
break;
}
ep0SubState=0;
break;
case INTERFACE_TYPE:
//Uart_Puts("INTERFACE_TYPE!\n");
CLR_EP0_OUT_PKT_RDY();
ep0State=EP0_STATE_GD_IF_ONLY_0; //for WIN98
break;
case ENDPOINT_TYPE:
//Uart_Puts("ENDPOINT_TYPE!\n");
CLR_EP0_OUT_PKT_RDY();
switch(descSetup.bValueL&0xf)
{
case 1:
ep0State=EP0_STATE_GD_EP0_ONLY_0;
break;
case 2:
ep0State=EP0_STATE_GD_EP1_ONLY_0;
break;
default:
break;
}
break;
//===================[HID]=============================
case HID_TYPE:
Uart_Puts("HID_TYPE!\n");
CLR_EP0_OUTPKTRDY_DATAEND();
break;
case REPORT_TYPE:
Uart_Puts("REPORT_TYPE!\n");
ep0State=EP0_STATE_GD_REP;
CLR_EP0_OUT_PKT_RDY();
ep0SubState=0;
break;
case PHYSICAL_TYPE:
Uart_Puts("PHYSICAL_TYPE!\n");
CLR_EP0_OUTPKTRDY_DATAEND();
break;
//=====================================================
default:
//Uart_Puts("\n ohter Descriptor_Type!\n");
break;
}
}
static void Ep0State_Handler(U32 Ep0State){
switch(ep0State)
{
case EP0_STATE_INIT:
break;
//=== GET_DESCRIPTOR:DEVICE =====================
//=== [IN_PKT_RDY BIT IS CLEARED ] INTERRUPT
case EP0_STATE_GD_DEV_0:
WrPktEp0((U8 *)&descDev+0,8); //EP0_PKT_SIZE
SET_EP0_IN_PKT_RDY();
ep0State=EP0_STATE_GD_DEV_1;
break;
case EP0_STATE_GD_DEV_1:
WrPktEp0((U8 *)&descDev+0x8,8);
SET_EP0_IN_PKT_RDY();
ep0State=EP0_STATE_GD_DEV_2;
break;
case EP0_STATE_GD_DEV_2:
WrPktEp0((U8 *)&descDev+0x10,2); //8+8+2=0x12
SET_EP0_INPKTRDY_DATAEND(); //IMPORTANT!!!
ep0State=EP0_STATE_INIT;
break;
//=== GET_DESCRIPTOR:CONFIGURATION+INTERFACE+ENDPOINT0+ENDPOINT1 ===
//Windows98 gets these 4 descriptors all together by issuing only a request.
//Windows2000 gets each descriptor seperately.
case EP0_STATE_GD_CFG_0:
WrPktEp0((U8 *)&descConf+0,8); //EP0_PKT_SIZE
SET_EP0_IN_PKT_RDY();
ep0State=EP0_STATE_GD_CFG_1;
break;
case EP0_STATE_GD_CFG_1:
WrPktEp0((U8 *)&descConf+8,1);
WrPktEp0((U8 *)&descIf+0,7);
SET_EP0_IN_PKT_RDY();
ep0State=EP0_STATE_GD_CFG_2;
break;
case EP0_STATE_GD_CFG_2:
WrPktEp0((U8 *)&descIf+7,2);
WrPktEp0((U8 *)&Class_Descriptor+0,6);
SET_EP0_IN_PKT_RDY();
ep0State=EP0_STATE_GD_CFG_3;
break;
case EP0_STATE_GD_CFG_3:
WrPktEp0((U8 *)&Class_Descriptor+6,3);
WrPktEp0((U8 *)&descEndpt0+0,5);
SET_EP0_IN_PKT_RDY();
ep0State=EP0_STATE_GD_CFG_4;
break;
case EP0_STATE_GD_CFG_4:
WrPktEp0((U8 *)&descEndpt0+5,2);
//WrPktEp0((U8 *)&descEndpt1+0,6);
//SET_EP0_IN_PKT_RDY();
//ep0State=EP0_STATE_GD_CFG_5;
SET_EP0_INPKTRDY_DATAEND();
ep0State=EP0_STATE_INIT;
break;
case EP0_STATE_GD_CFG_5:
Uart_Puts("5\n");
WrPktEp0((U8 *)&descEndpt1+6,2);
SET_EP0_INPKTRDY_DATAEND();
ep0State=EP0_STATE_INIT;
break;
//=== GET_DESCRIPTOR:CONFIGURATION ONLY===
case EP0_STATE_GD_CFG_ONLY_0:
WrPktEp0((U8 *)&descConf+0,8); //EP0_PKT_SIZE
SET_EP0_IN_PKT_RDY();
ep0State=EP0_STATE_GD_CFG_ONLY_1;
break;
case EP0_STATE_GD_CFG_ONLY_1:
WrPktEp0((U8 *)&descConf+8,1);
SET_EP0_INPKTRDY_DATAEND();
ep0State=EP0_STATE_INIT;
break;
//=== GET_DESCRIPTOR:INTERFACE ONLY===
case EP0_STATE_GD_IF_ONLY_0:
WrPktEp0((U8 *)&descIf+0,8);
SET_EP0_IN_PKT_RDY();
ep0State=EP0_STATE_GD_IF_ONLY_1;
break;
case EP0_STATE_GD_IF_ONLY_1:
WrPktEp0((U8 *)&descIf+8,1);
SET_EP0_INPKTRDY_DATAEND();
ep0State=EP0_STATE_INIT;
break;
//=== GET_DESCRIPTOR:ENDPOINT 0 ONLY===
case EP0_STATE_GD_EP0_ONLY_0:
WrPktEp0((U8 *)&descEndpt0+0,7);
SET_EP0_INPKTRDY_DATAEND();
ep0State=EP0_STATE_INIT;
break;
//=== GET_DESCRIPTOR:ENDPOINT 1 ONLY===
case EP0_STATE_GD_EP1_ONLY_0:
WrPktEp0((U8 *)&descEndpt1+0,7);
SET_EP0_INPKTRDY_DATAEND();
ep0State=EP0_STATE_INIT;
break;
//=== GET_DESCRIPTOR:STRING ===
case EP0_STATE_GD_STR_I0:
WrPktEp0((U8 *)descStr0, 4 );
SET_EP0_INPKTRDY_DATAEND();
ep0State=EP0_STATE_INIT;
ep0SubState=0;
break;
case EP0_STATE_GD_STR_I1:
if( (ep0SubState*EP0_PKT_SIZE+EP0_PKT_SIZE)<sizeof(descStr1) )
{
WrPktEp0((U8 *)descStr1+(ep0SubState*EP0_PKT_SIZE),EP0_PKT_SIZE);
SET_EP0_IN_PKT_RDY();
ep0State=EP0_STATE_GD_STR_I1;
ep0SubState++;
}
else
{
WrPktEp0((U8 *)descStr1+(ep0SubState*EP0_PKT_SIZE),
sizeof(descStr1)-(ep0SubState*EP0_PKT_SIZE));
SET_EP0_INPKTRDY_DATAEND();
ep0State=EP0_STATE_INIT;
ep0SubState=0;
}
break;
case EP0_STATE_GD_STR_I2:
if( (ep0SubState*EP0_PKT_SIZE+EP0_PKT_SIZE)<sizeof(descStr2) )
{
WrPktEp0((U8 *)descStr2+(ep0SubState*EP0_PKT_SIZE),EP0_PKT_SIZE);
SET_EP0_IN_PKT_RDY();
ep0State=EP0_STATE_GD_STR_I2;
ep0SubState++;
}
else
{
WrPktEp0((U8 *)descStr2+(ep0SubState*EP0_PKT_SIZE),
sizeof(descStr2)-(ep0SubState*EP0_PKT_SIZE));
SET_EP0_INPKTRDY_DATAEND();
ep0State=EP0_STATE_INIT;
ep0SubState=0;
}
break;
case EP0_STATE_GD_STR_I3:
if( (ep0SubState*EP0_PKT_SIZE+EP0_PKT_SIZE)<sizeof(descStr3) )
{
WrPktEp0((U8 *)descStr3+(ep0SubState*EP0_PKT_SIZE),EP0_PKT_SIZE);
SET_EP0_IN_PKT_RDY();
ep0State=EP0_STATE_GD_STR_I3;
ep0SubState++;
}
else
{
WrPktEp0((U8 *)descStr3+(ep0SubState*EP0_PKT_SIZE),
sizeof(descStr3)-(ep0SubState*EP0_PKT_SIZE));
SET_EP0_INPKTRDY_DATAEND();
ep0State=EP0_STATE_INIT;
ep0SubState=0;
}
break;
//===================[HID]===========================================
case EP0_STATE_GD_REP:
if( (ep0SubState*EP0_PKT_SIZE+EP0_PKT_SIZE)<sizeof(hid_report_desc_table) )
{
WrPktEp0((U8 *)hid_report_desc_table+(ep0SubState*EP0_PKT_SIZE),EP0_PKT_SIZE);
SET_EP0_IN_PKT_RDY();
ep0State=EP0_STATE_GD_REP;
ep0SubState++;
}
else
{
WrPktEp0((U8 *)hid_report_desc_table+(ep0SubState*EP0_PKT_SIZE),
sizeof(hid_report_desc_table)-(ep0SubState*EP0_PKT_SIZE));
SET_EP0_INPKTRDY_DATAEND();
ep0State=EP0_STATE_INIT;
ep0SubState=0;
}
break;
//=======================================================================
default:
break;
}
}
void UsbdInit(U8 fun)
{
isUsbdSetConfiguration = 0;
InitDescriptorTable(fun);
ReconfigUsbd();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -