⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbsetup.c

📁 基于arm9的,usb设备(u盘)的读写操作实现.
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -