📄 usbsetup.c
字号:
#ifdef _FOR_UDISK_
if(USBD_flg==1)
{
if(descSetup.bLengthL+(descSetup.bLengthH<<8) <4)
WrPktEp0((U8 *)descStr0, /*4*/descSetup.bLengthL+(descSetup.bLengthH<<8) );
else
SET_EP0_INPKTRDY_DATAEND();
}
else if(USBD_flg==0)
{
WrPktEp0((U8 *)descStr0, 4 );
SET_EP0_INPKTRDY_DATAEND();
}
#else
WrPktEp0((U8 *)descStr0, 4 );
SET_EP0_INPKTRDY_DATAEND();
#endif
ep0State=EP0_STATE_INIT;
ep0SubState=0;
break;
case EP0_STATE_GD_STR_I1:
//DbgPrintf("[GDS1_%d]",ep0SubState);
#ifndef _FOR_UDISK_
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;
}
#else
if(USBD_flg==1)
{
while(1)
{
//Uart_Printf("[GDS1_%d]",ep0SubState);
if(descSetup.bLengthL+(descSetup.bLengthH<<8) <sizeof(descStr1_1))
{
if((ep0SubState*EP0_PKT_SIZE+EP0_PKT_SIZE) < /*sizeof(descStr1)*/descSetup.bLengthL+(descSetup.bLengthH<<8))
{
WrPktEp0((U8 *)descStr1_1+(ep0SubState*EP0_PKT_SIZE),EP0_PKT_SIZE);
SET_EP0_IN_PKT_RDY();
ep0State=EP0_STATE_GD_STR_I1;
ep0SubState++;
}
else
{
WrPktEp0((U8 *)descStr1_1+(ep0SubState*EP0_PKT_SIZE),
/*sizeof(descStr1)*/descSetup.bLengthL+(descSetup.bLengthH<<8)-(ep0SubState*EP0_PKT_SIZE));
SET_EP0_INPKTRDY_DATAEND();
ep0State=EP0_STATE_INIT;
ep0SubState=0;
break;
}
}
else
{
if((ep0SubState*EP0_PKT_SIZE+EP0_PKT_SIZE) < sizeof(descStr1_1))
{
WrPktEp0((U8 *)descStr1_1+(ep0SubState*EP0_PKT_SIZE),EP0_PKT_SIZE);
SET_EP0_IN_PKT_RDY();
ep0State=EP0_STATE_GD_STR_I1;
ep0SubState++;
}
else
{
WrPktEp0((U8 *)descStr1_1+(ep0SubState*EP0_PKT_SIZE),
sizeof(descStr1_1)-(ep0SubState*EP0_PKT_SIZE));
SET_EP0_INPKTRDY_DATAEND();
ep0State=EP0_STATE_INIT;
ep0SubState=0;
break;
}
}
}
}
else if(USBD_flg==0)
{
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;
}
}
#endif
break;
case EP0_STATE_GD_STR_I2:
//DbgPrintf("[GDS2_%d]",ep0SubState);
#ifndef _FOR_UDISK_
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
{
//DbgPrintf("[E]");
WrPktEp0((U8 *)descStr2+(ep0SubState*EP0_PKT_SIZE),
sizeof(descStr2)-(ep0SubState*EP0_PKT_SIZE));
SET_EP0_INPKTRDY_DATAEND();
ep0State=EP0_STATE_INIT;
ep0SubState=0;
}
#else
if(USBD_flg==1)
{
while(1)
{
// Uart_Printf("[EP0_STATE_GD_STR_I2:%d\n",ep0SubState);
if(descSetup.bLengthL+(descSetup.bLengthH<<8) <sizeof(descStr2_1))
{
if( (ep0SubState*EP0_PKT_SIZE+EP0_PKT_SIZE) < /*sizeof(descStr2)*/descSetup.bLengthL+(descSetup.bLengthH<<8) )
{
WrPktEp0((U8 *)descStr2_1+(ep0SubState*EP0_PKT_SIZE),EP0_PKT_SIZE);
SET_EP0_IN_PKT_RDY();
ep0State=EP0_STATE_GD_STR_I2;
ep0SubState++;
}
else
{
// Uart_Printf("[E]");
WrPktEp0((U8 *)descStr2_1+(ep0SubState*EP0_PKT_SIZE),
/* sizeof(descStr2)*/descSetup.bLengthL+(descSetup.bLengthH<<8)-(ep0SubState*EP0_PKT_SIZE));
SET_EP0_INPKTRDY_DATAEND();
ep0State=EP0_STATE_INIT;
ep0SubState=0;
break;
}
}
else
{
if( (ep0SubState*EP0_PKT_SIZE+EP0_PKT_SIZE) < sizeof(descStr2_1))
{
WrPktEp0((U8 *)descStr2_1+(ep0SubState*EP0_PKT_SIZE),EP0_PKT_SIZE);
SET_EP0_IN_PKT_RDY();
ep0State=EP0_STATE_GD_STR_I2;
ep0SubState++;
}
else
{
// Uart_Printf("[E]");
WrPktEp0((U8 *)descStr2_1+(ep0SubState*EP0_PKT_SIZE),
sizeof(descStr2_1)-(ep0SubState*EP0_PKT_SIZE));
SET_EP0_INPKTRDY_DATAEND();
ep0State=EP0_STATE_INIT;
ep0SubState=0;
break;
}
}
}
}
else if(USBD_flg==0)
{
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
{
//DbgPrintf("[E]");
WrPktEp0((U8 *)descStr2+(ep0SubState*EP0_PKT_SIZE),
sizeof(descStr2)-(ep0SubState*EP0_PKT_SIZE));
SET_EP0_INPKTRDY_DATAEND();
ep0State=EP0_STATE_INIT;
ep0SubState=0;
}
}
#endif
break;
default:
//DbgPrintf("UE:G?D");
break;
}//End of switch(ep0State)
}//End of Ep0Handler()
/*
void PrintEp0Pkt(U8 *pt)
{
int i;
DbgPrintf("[RCV:");
for(i=0;i<EP0_PKT_SIZE;i++)
DbgPrintf("%x,",pt[i]);
DbgPrintf("]");
}
*/
//Struct definition at "USB.H"
void InitDescriptorTable(void)
{
#ifndef _FOR_UDISK_
//Standard device descriptor
descDev.bLength=0x12;//EP0_DEV_DESC_SIZE=0x12 bytes
descDev.bDescriptorType=DEVICE_TYPE;
descDev.bcdUSBL=0x10;
descDev.bcdUSBH=0x01;//Indicate USB Ver 1.10
descDev.bDeviceClass=0xFF;//Vendor specific
descDev.bDeviceSubClass=0x0;
descDev.bDeviceProtocol=0x0;//?? should be 0xff
descDev.bMaxPacketSize0=0x8;//EndPoint_0's max Packet Size
descDev.idVendorL=0x45;//Vendor ID_h
descDev.idVendorH=0x53;//Vendor ID_l
descDev.idProductL=0x34;//Product ID_h
descDev.idProductH=0x12;//Product ID_l
descDev.bcdDeviceL=0x00;//Product version_h
descDev.bcdDeviceH=0x01;//Product version_l
descDev.iManufacturer=0x1;//index of string descriptor index
descDev.iProduct=0x2;//index of string descriptor index
descDev.iSerialNumber=0x0;//Product serial number string descriptor index
descDev.bNumConfigurations=0x1;//Device descriptor number
//Standard configuration descriptor
descConf.bLength=0x09;
descConf.bDescriptorType=CONFIGURATION_TYPE;//0x02
descConf.wTotalLengthL=0x20; //<cfg desc>+<if desc>+<endp0 desc>+<endp1 desc>
descConf.wTotalLengthH=0;
descConf.bNumInterfaces=1;
//dbg descConf.bConfigurationValue=2; //why 2? There's no reason.
descConf.bConfigurationValue=1;
descConf.iConfiguration=0;
descConf.bmAttributes=CONF_ATTR_DEFAULT;//bus powered only.
descConf.maxPower=25; //draws 50mA current from the USB bus.
//Standard interface descriptor
descIf.bLength=0x9;
descIf.bDescriptorType=INTERFACE_TYPE;//0x04
descIf.bInterfaceNumber=0x0;
descIf.bAlternateSetting=0x0; //?
descIf.bNumEndpoints=2; //# of endpoints except EP0
descIf.bInterfaceClass=0xff; //0x0 ?
descIf.bInterfaceSubClass=0x0;
descIf.bInterfaceProtocol=0x0;
descIf.iInterface=0x0;
//Standard endpoint0 descriptor
descEndpt0.bLength=0x7;
descEndpt0.bDescriptorType=ENDPOINT_TYPE;//0x05
descEndpt0.bEndpointAddress=1|EP_ADDR_IN;//0x80|0x01=0x81 // 2400Xendpoint 1 is IN endpoint.
descEndpt0.bmAttributes=EP_ATTR_BULK;//0x02,transmition type = Bulk
descEndpt0.wMaxPacketSizeL=EP1_PKT_SIZE; //64
descEndpt0.wMaxPacketSizeH=0x0;
descEndpt0.bInterval=0x0; //not used
//Standard endpoint1 descriptor
descEndpt1.bLength=0x7;
descEndpt1.bDescriptorType=ENDPOINT_TYPE;//0x05
descEndpt1.bEndpointAddress=3|EP_ADDR_OUT;//0x00|0x03=0x03 // 2400X endpoint 3 is OUT endpoint.
descEndpt1.bmAttributes=EP_ATTR_BULK;//0x02,transmition type = Bulk
descEndpt1.wMaxPacketSizeL=EP3_PKT_SIZE; //64
descEndpt1.wMaxPacketSizeH=0x0;
descEndpt1.bInterval=0x0; //not used
#else
if(USBD_flg==1)
{
//Uart_Printf("InitDescriptorTable()\n");
//Standard device descriptor
descDev.bLength=0x12;//EP0_DEV_DESC_SIZE=0x12 bytes
descDev.bDescriptorType=DEVICE_TYPE;
descDev.bcdUSBL=0x10;
descDev.bcdUSBH=0x01;//Indicate USB Ver 1.10
descDev.bDeviceClass=0x00;//Vendor specific
descDev.bDeviceSubClass=0x0;
descDev.bDeviceProtocol=0x0;//?? should be 0xff
descDev.bMaxPacketSize0=0x8;//EndPoint_0's max Packet Size
descDev.idVendorL=0x71;//0x40;//Vendor ID_h
descDev.idVendorH=0x11;//0x52;//Vendor ID_l
descDev.idProductL=0xf0;//0x03;//Product ID_h
descDev.idProductH=0xff;//0x04;//Product ID_l
descDev.bcdDeviceL=0x00;//Product version_h
descDev.bcdDeviceH=0x01;//Product version_l
descDev.iManufacturer=0x1;//index of string descriptor index
descDev.iProduct=0x2;//index of string descriptor index
descDev.iSerialNumber=0x0;//Product serial number string descriptor index
descDev.bNumConfigurations=0x1;//Device descriptor number
//Standard configuration descriptor
descConf.bLength=0x09;
descConf.bDescriptorType=CONFIGURATION_TYPE;//0x02
descConf.wTotalLengthL=0x20; //<cfg desc 9>+<if desc 9>+<endp1 desc 7>+<endp3 desc 7>
descConf.wTotalLengthH=0;
descConf.bNumInterfaces=1;
//dbg descConf.bConfigurationValue=2; //why 2? There's no reason.
descConf.bConfigurationValue=1;
descConf.iConfiguration=0;
descConf.bmAttributes=CONF_ATTR_DEFAULT;//0x0a;//bus powered only.
descConf.maxPower=0x32;//25; //draws 50mA current from the USB bus.
//Standard interface descriptor
descIf.bLength=0x9;
descIf.bDescriptorType=INTERFACE_TYPE;//0x04
descIf.bInterfaceNumber=0x0;
descIf.bAlternateSetting=0x0; //?
descIf.bNumEndpoints=2; //# of endpoints except EP0
descIf.bInterfaceClass=0x08; //0x0 ?
descIf.bInterfaceSubClass=0x06;//0x04;//0x04:软盘,oxo6:普通邋邋SCSI
descIf.bInterfaceProtocol=0x50;
descIf.iInterface=0x0;
//Standard endpoint1 descriptor(IN)
descEndpt0.bLength=0x7;
descEndpt0.bDescriptorType=ENDPOINT_TYPE;//0x05
descEndpt0.bEndpointAddress=1|EP_ADDR_IN;//0x80|0x01=0x81 // 2400Xendpoint 1 is IN endpoint.
descEndpt0.bmAttributes=EP_ATTR_BULK;//0x02,transmition type = Bulk
descEndpt0.wMaxPacketSizeL=EP1_PKT_SIZE; //64
descEndpt0.wMaxPacketSizeH=0x0;
descEndpt0.bInterval=0x0; //not used
//Standard endpoint3 descriptor(OUT)
descEndpt1.bLength=0x7;
descEndpt1.bDescriptorType=ENDPOINT_TYPE;//0x05
descEndpt1.bEndpointAddress=3|EP_ADDR_OUT;//0x00|0x03=0x03 // 2400X endpoint 3 is OUT endpoint.
descEndpt1.bmAttributes=EP_ATTR_BULK;//0x02,transmition type = Bulk
descEndpt1.wMaxPacketSizeL=EP3_PKT_SIZE; //64
descEndpt1.wMaxPacketSizeH=0x0;
descEndpt1.bInterval=0x0; //not used
}
else if(USBD_flg==0)
{
//Standard device descriptor
descDev.bLength=0x12;//EP0_DEV_DESC_SIZE=0x12 bytes
descDev.bDescriptorType=DEVICE_TYPE;
descDev.bcdUSBL=0x10;
descDev.bcdUSBH=0x01;//Indicate USB Ver 1.10
descDev.bDeviceClass=0xFF;//Vendor specific
descDev.bDeviceSubClass=0x0;
descDev.bDeviceProtocol=0x0;//?? should be 0xff
descDev.bMaxPacketSize0=0x8;//EndPoint_0's max Packet Size
descDev.idVendorL=0x45;//Vendor ID_h
descDev.idVendorH=0x53;//Vendor ID_l
descDev.idProductL=0x34;//Product ID_h
descDev.idProductH=0x12;//Product ID_l
descDev.bcdDeviceL=0x00;//Product version_h
descDev.bcdDeviceH=0x01;//Product version_l
descDev.iManufacturer=0x1;//index of string descriptor index
descDev.iProduct=0x2;//index of string descriptor index
descDev.iSerialNumber=0x0;//Product serial number string descriptor index
descDev.bNumConfigurations=0x1;//Device descriptor number
//Standard configuration descriptor
descConf.bLength=0x09;
descConf.bDescriptorType=CONFIGURATION_TYPE;//0x02
descConf.wTotalLengthL=0x20; //<cfg desc>+<if desc>+<endp0 desc>+<endp1 desc>
descConf.wTotalLengthH=0;
descConf.bNumInterfaces=1;
//dbg descConf.bConfigurationValue=2; //why 2? There's no reason.
descConf.bConfigurationValue=1;
descConf.iConfiguration=0;
descConf.bmAttributes=CONF_ATTR_DEFAULT;//bus powered only.
descConf.maxPower=25; //draws 50mA current from the USB bus.
//Standard interface descriptor
descIf.bLength=0x9;
descIf.bDescriptorType=INTERFACE_TYPE;//0x04
descIf.bInterfaceNumber=0x0;
descIf.bAlternateSetting=0x0; //?
descIf.bNumEndpoints=2; //# of endpoints except EP0
descIf.bInterfaceClass=0xff; //0x0 ?
descIf.bInterfaceSubClass=0x0;
descIf.bInterfaceProtocol=0x0;
descIf.iInterface=0x0;
//Standard endpoint0 descriptor
descEndpt0.bLength=0x7;
descEndpt0.bDescriptorType=ENDPOINT_TYPE;//0x05
descEndpt0.bEndpointAddress=1|EP_ADDR_IN;//0x80|0x01=0x81 // 2400Xendpoint 1 is IN endpoint.
descEndpt0.bmAttributes=EP_ATTR_BULK;//0x02,transmition type = Bulk
descEndpt0.wMaxPacketSizeL=EP1_PKT_SIZE; //64
descEndpt0.wMaxPacketSizeH=0x0;
descEndpt0.bInterval=0x0; //not used
//Standard endpoint1 descriptor
descEndpt1.bLength=0x7;
descEndpt1.bDescriptorType=ENDPOINT_TYPE;//0x05
descEndpt1.bEndpointAddress=3|EP_ADDR_OUT;//0x00|0x03=0x03 // 2400X endpoint 3 is OUT endpoint.
descEndpt1.bmAttributes=EP_ATTR_BULK;//0x02,transmition type = Bulk
descEndpt1.wMaxPacketSizeL=EP3_PKT_SIZE; //64
descEndpt1.wMaxPacketSizeH=0x0;
descEndpt1.bInterval=0x0; //not used
}
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -