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

📄 usb.c

📁 一个简单的基于s3c2410的bootloader
💻 C
📖 第 1 页 / 共 2 页
字号:
						DbgPrintf( "GT_EP0\n" );
						pBuffer = ( U8 * )&DescriptorEndpoint_0;
						uSize = sizeof( DescriptorEndpoint_0 );
						uPos = 0;				
						rEP0_CSR |= BIT_EP0_CSR_SERVICED_OUT_PKT_RDY;
			    	    break;
			    	case 1:
						DbgPrintf( "GT_EP1\n" );
						pBuffer = ( U8 * )&DescriptorEndpoint_1;
						uSize = sizeof( DescriptorEndpoint_1 );
						uPos = 0;				
						rEP0_CSR |= BIT_EP0_CSR_SERVICED_OUT_PKT_RDY;
			    	    break;
			    	default:
						DbgPrintf( "GT_EP_DEF\n" );
						pBuffer = 0;
			    	    break;
			    	}
					uPos = 0;				
					rEP0_CSR = ( ustatus_EP0_CSR & ( BIT_EP0_WR_BITS ) 
							| BIT_EP0_CSR_SERVICED_OUT_PKT_RDY );
					break;
				case TYPE_STRING:
	    			DbgPrintf( "GT_ST\n" );
			    	switch( SetupData.bValueL )
			    	{
		    	    case 0:
    					DbgPrintf( "GT_ST0\n" );
						pBuffer = ( U8 * )&DescriptorString0;
						uSize = sizeof( DescriptorString0 );
						uPos = 0;				
		    	    	break;
		    	    case 1:
    					DbgPrintf( "GT_ST1\n" );
						pBuffer = ( U8 * )&DescriptorString1;
						uSize = sizeof( DescriptorString1 );
						uPos = 0;				
		    	    	break;
		    	    case 2:	
    					DbgPrintf( "GT_ST2\n" );
						pBuffer = ( U8 * )&DescriptorString2;
						uSize = sizeof( DescriptorString2 );
						uPos = 0;				
		    	    	break;
		    	    default:
    					DbgPrintf( "GT_ST_DEF\n" );
    					pBuffer = 0;
		    			break;
			    	}
					rEP0_CSR = ( ustatus_EP0_CSR & ( BIT_EP0_WR_BITS ) 
							| BIT_EP0_CSR_SERVICED_OUT_PKT_RDY );
					break;
				default:
					DbgPrintf( "GT_DF\x0d\x0a" );
					pBuffer = 0;
					break;
				}
				break;
			case SET_ADDRESS:
				DbgPrintf( "ST_AD, %d\n", SetupData.bValueL );
				rFUNC_ADDR_REG = SetupData.bValueL | 0x80;
				rEP0_CSR = ( ustatus_EP0_CSR & ( BIT_EP0_WR_BITS ) 
						| BIT_EP0_CSR_SERVICED_OUT_PKT_RDY | BIT_EP0_DATA_END );
				pBuffer = 0;
				break;
			case SET_CONFIGURATION:
				DbgPrintf( "ST_CF\n" );
				ConfiguratioSet = SetupData.bValueL;
				rEP0_CSR = ( ustatus_EP0_CSR & ( BIT_EP0_WR_BITS ) 
						| BIT_EP0_CSR_SERVICED_OUT_PKT_RDY | BIT_EP0_DATA_END );
				pBuffer = 0;
				break;
///////////////////////////////////////////////////////////////////////////////////
    		case SET_DESCRIPTOR:
				DbgPrintf( "ST_DE\n" );
				rEP0_CSR = ( ustatus_EP0_CSR & ( BIT_EP0_WR_BITS ) 
						| BIT_EP0_CSR_SERVICED_OUT_PKT_RDY | BIT_EP0_DATA_END );
				pBuffer = 0;
				break;
	       	case GET_CONFIGURATION:
				DbgPrintf( "GT_CF\n" );
				pBuffer = ( U8 * )&ConfiguratioSet;
				uSize = sizeof( ConfiguratioSet );
				uPos = 0;
				rEP0_CSR = ( ustatus_EP0_CSR & ( BIT_EP0_WR_BITS ) 
						| BIT_EP0_CSR_SERVICED_OUT_PKT_RDY );
    	    	break;
			case SET_INTERFACE:
				DbgPrintf( "ST_IF\n" );
				InterfaceSet = SetupData.bValueL;
				rEP0_CSR = ( ustatus_EP0_CSR & ( BIT_EP0_WR_BITS ) 
						| BIT_EP0_CSR_SERVICED_OUT_PKT_RDY | BIT_EP0_DATA_END );
				pBuffer = 0;
				break;
	       	case GET_INTERFACE:
				DbgPrintf( "GT_IF\n" );
				pBuffer = ( U8 * )&InterfaceSet;
				uSize = sizeof( InterfaceSet );
				uPos = 0;				
				rEP0_CSR = ( ustatus_EP0_CSR & ( BIT_EP0_WR_BITS ) 
						| BIT_EP0_CSR_SERVICED_OUT_PKT_RDY );
    	    	break;
    	    case SET_FEATURE:
	    		DbgPrintf("ST_FT\n");
	    	  	switch( SetupData.bmRequestType )
	    	  	{
				case RECIPIENT_DEVICE:
					if ( SetupData.bValueL == 1 );
						//Rwuen = TRUE;
					break;
				case RECIPIENT_ENDPOINT:
					if ( SetupData.bValueL == 0)
					{
						if( ( SetupData.bIndexL & 0x7F ) == 0x00 )
						{
							StatusGet.Endpoint0 = 1;
						}
						if( ( SetupData.bIndexL & 0x8F ) == 0x81 )
						{
							StatusGet.Endpoint1 = 1;
						}
						if( ( SetupData.bIndexL & 0x8F ) == 0x03 )
						{
							StatusGet.Endpoint3 = 1;
						}
					}
	    	  	  	break;
	    	  	  default:
	    	  	  	break;
	    	  	}
				rEP0_CSR = ( ustatus_EP0_CSR & ( BIT_EP0_WR_BITS ) 
						| BIT_EP0_CSR_SERVICED_OUT_PKT_RDY | BIT_EP0_DATA_END );
				pBuffer = 0;
	    	  	break;
//////////////////////////////////////////////////////////////////////////////////	    	  	
			default:
				DbgPrintf( "Req_def\n" );
				pBuffer = 0;
				break;
		}
	}
	
	if ( pBuffer !=0 )
	{
		if ( ( uSize - uPos ) >= EP0_PKT_SIZE )
		{   
			USBD_WriteFIFO( pBuffer, &rEP0_FIFO, EP0_PKT_SIZE );
			pBuffer += EP0_PKT_SIZE;
			uPos += EP0_PKT_SIZE;
			rEP0_CSR = ( ustatus_EP0_CSR & ( BIT_EP0_WR_BITS ) 
					| BIT_EP0_IN_PKT_RDY );
			DbgPrintf("if\x0d\x0a");
		}
		else
		{
			USBD_WriteFIFO( pBuffer, &rEP0_FIFO, uSize - uPos );
			pBuffer = 0;
			uPos = 0;
			rEP0_CSR = ( ustatus_EP0_CSR & ( BIT_EP0_WR_BITS ) 
					| BIT_EP0_IN_PKT_RDY | BIT_EP0_DATA_END );
			DbgPrintf("else\x0d\x0a");
		}
	}
	else
	{
		DbgPrintf("EP0_UD\n");
	}
	
	rINDEX_REG = ubakup_rINDEX_REG;
}

void __irq USBDIsr( void )
{
	U8 ustatus_EP_INT_REG;
	U8 ustatus_USB_INT_REG;
	U8 uBakIndexReg;
	
	ustatus_EP_INT_REG = rEP_INT_REG;
	ustatus_USB_INT_REG = rUSB_INT_REG;
	uBakIndexReg = rINDEX_REG;
	
	if ( ustatus_USB_INT_REG & BIT_USBD_SUSPEND_INT )
	{
    	rUSB_INT_REG = BIT_USBD_SUSPEND_INT;
		DbgPrintf( "SUSPEND\n" );
	}
	if ( ustatus_USB_INT_REG & BIT_USBD_RESUME_INT )
	{
    	rUSB_INT_REG = BIT_USBD_RESUME_INT;
		DbgPrintf( "RESUME\n" );
	}
	if ( ustatus_USB_INT_REG & BIT_USBD_RESET_INT )
	{
	
		ResetUsbdReg();
    	rUSB_INT_REG = BIT_USBD_RESET_INT;
    	
    	DbgPrintf( "RESET\n" );
	}
	
	if ( ustatus_EP_INT_REG & BIT_USBD_EP0_INT )
	{
		rEP_INT_REG = BIT_USBD_EP0_INT;
		Handler_Ep0();
	}
	if ( ustatus_EP_INT_REG & BIT_USBD_EP1_INT )
	{
		rEP_INT_REG = BIT_USBD_EP1_INT;
		Handler_Ep1();
		DbgPrintf( "EP1\n" );
	}
	if ( ustatus_EP_INT_REG & BIT_USBD_EP2_INT )
	{
		rEP_INT_REG = BIT_USBD_EP2_INT;
		DbgPrintf( "EP2\n" );
	}
	if ( ustatus_EP_INT_REG & BIT_USBD_EP3_INT )
	{
		rEP_INT_REG = BIT_USBD_EP3_INT;
		Handler_Ep3();
		//DbgPrintf( "EP3\n" );
	}
	if ( ustatus_EP_INT_REG & BIT_USBD_EP4_INT )
	{
		rEP_INT_REG = BIT_USBD_EP4_INT;
		DbgPrintf( "EP4\n" );
	}
		
	ClearPending( BIT_USBD );
	
	rINDEX_REG = uBakIndexReg;
}

void __irq IsrDma2( void )
{
	DbgPrintf( "DMA\n" );
}

void Handler_Ep1( void )
{
}

void Handler_Ep3( void )
{
    U8 ustatus_EP3_OUT_CSR1;
    U8 ubakup_rINDEX_REG = rINDEX_REG;
    U8 buffTemp[16];
    
    rINDEX_REG = 3;
	ustatus_EP3_OUT_CSR1 = rOUT_CSR1_REG;
	
	//	exception, host end the control transfer befor DATA_END is set
	if ( ustatus_EP3_OUT_CSR1 & BIT_EPOUT1_SENT_STALL )
	{
		rOUT_CSR1_REG = ( ustatus_EP3_OUT_CSR1 & ~( BIT_EPOUT1_WR_BITS ) & 
						~( BIT_EPOUT1_SENT_STALL ) );
		if ( ustatus_EP3_OUT_CSR1 & BIT_EPOUT1_OUT_PKT_READY )
		{
			rOUT_CSR1_REG = ( ustatus_EP3_OUT_CSR1 & ~( BIT_EPOUT1_WR_BITS ) & 
						~( BIT_EPOUT1_OUT_PKT_READY ) );
			DbgPrintf("STALL if\n");	
		}
		else
		{
			DbgPrintf("STALL else\n");	
		}
	}
	
	else if ( ustatus_EP3_OUT_CSR1 & BIT_EPOUT1_OUT_PKT_READY )
	{
	
		U8 fifoCount; 
		fifoCount = rOUT_FIFO_CNT1_REG;
		
		if ( uDownSize == 0 )
		{
			USBD_ReadFIFO( buffTemp, &rEP3_FIFO, 8);
			uDownAddr = buffTemp[0] 
					+ ( buffTemp[1] << 8 )
					+ ( buffTemp[2] << 16 )
					+ ( buffTemp[3] << 24 );
			uDownSize = buffTemp[4] 
					+ ( buffTemp[5] << 8 )
					+ ( buffTemp[6] << 16 )
					+ ( buffTemp[7] << 24 );
			pDownAddr = ( U8 * )uDownAddr;
			
			DbgPrintf( "Addr:%X,Size:%X\n", uDownAddr, uDownSize);
			
			uCheckSum = USBD_ReadFIFO_WithChecksumReturn( ( U8 * )pDownAddr, 
				&rEP3_FIFO, fifoCount - 8 );
			pDownAddr += ( fifoCount - 8 );
			uTempDownSize = fifoCount;
		}
		else
		{
			uCheckSum += USBD_ReadFIFO_WithChecksumReturn( ( U8 * )pDownAddr, 
				&rEP3_FIFO, fifoCount);
			pDownAddr += fifoCount;
			uTempDownSize += fifoCount;
			if ( uTempDownSize == uDownSize )
			{
				U16 uChecksumInPacket;
				DbgPrintf( "Download Fininshed, Addr:%X,Size:%X\n", uDownAddr, uDownSize);
				uChecksumInPacket = *( ( U8 *)( uDownAddr+uDownSize - 8 - 2 ) ) +
					( *( ( U8 * )( uDownAddr+uDownSize - 8 - 1 ) ) << 8 );
				uChecksumInPacket += ( U8 )( uChecksumInPacket ) + ( U8 )( uChecksumInPacket >> 8 );
				if ( uChecksumInPacket == uCheckSum )
				{
					DbgPrintf( "Checksum is correct! 0x%X\n", uCheckSum );
					DownStatus = 1;
				}
				else
				{
					DbgPrintf( "Checksum isnot correct! 0x%X, 0x%X\n", uCheckSum, uChecksumInPacket );
					DownStatus = 0;
				}
			}
		}
		rOUT_CSR1_REG = ( ustatus_EP3_OUT_CSR1 & ~( BIT_EPOUT1_WR_BITS ) & 
				~( BIT_EPOUT1_OUT_PKT_READY ) );
	}
	
    rINDEX_REG = ubakup_rINDEX_REG;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -