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

📄 usb_transaction_layer.c

📁 freescale atk source code
💻 C
📖 第 1 页 / 共 3 页
字号:
  RETURN VALUE:	IMPORTANT NOTES:	==================================================================================================*/usb_status_ttl_send_data(usb_buffer_descriptor_t* bd){    usb_status_t status = USB_FAILURE;    U8 i,endpoint = 0x0;#ifndef SIMULATOR_TESTING        /* Check if Bus Reset Received */    if(ipl_check_bus_reset() == TRUE)    {	/* Handle Bus Reset and return Failure*/        tl_handle_bus_reset();     }    /* Check if set up token Received */    else if(ipl_check_setup_token() == TRUE)    {	/* Handle the setup token*/        tl_handle_setup_phase();     }#endif        /* Check the State of USB . If It is in  configured state than send data */    if ( g_usb_dev_state == USB_DEV_CONFIGURED_STATE )    {        /* buffer pointer should not be NULL */        if( bd->buffer != NULL )	{	    /* Get the endpoint number which is configured for IN */	    for ( i = 0 ; i< g_number_of_endpoints ; i++)	    {                if(g_end_pt_info[i].direction == IN)		{		    endpoint = g_end_pt_info[i].end_pt_no;		    break;		}		    	    }	    /* Check for endpoint number */	    if(endpoint)	    {		/* Send Data */                status = (usb_status_t )ipl_send_data(endpoint,bd,FALSE);	    }	    else	    {	        status = USB_INVALID; /* If no endpoint is configured */	    }	}	else	{	    status = USB_INVALID; /* if the buffer pointer is NULL */	}    }    return(status);}/*==================================================================================================FUNCTION: tl_receive_dataDESCRIPTION: 	This Function Handles the received request on usb busARGUMENTS PASSED:	usb_buffer_descriptor_t* bd  RETURN VALUE:	IMPORTANT NOTES:	==================================================================================================*/usb_status_ttl_receive_data(usb_buffer_descriptor_t* bd){    usb_status_t status = USB_FAILURE;     U8 i,endpoint = 0x0;#ifndef SIMULATOR_TESTING       /* Check if Bus Reset Received  */    if(ipl_check_bus_reset() == TRUE)    {	/* Handle Bus Reset and return Failure */        tl_handle_bus_reset();     }    /* Check if set up token Received. */    else if(ipl_check_setup_token() == TRUE)    {	/* Handle the setup token */        tl_handle_setup_phase();     }#endif    /* Check the State of USB . If It is in  configured state than receive data */    if ( g_usb_dev_state == USB_DEV_CONFIGURED_STATE )    {        /* buffer pointer should not be NULL */	if( bd->buffer != NULL )	{	    /* Get the endpoint number which is configured for OUT */	    for ( i = 0 ; i< g_number_of_endpoints ; i++)	    {                if(g_end_pt_info[i].direction == OUT)		{		    endpoint = g_end_pt_info[i].end_pt_no;		    break;		}		    	    }	    /* endpoint number should not be EP0 */	    if(endpoint)	    {		/* Receive data */                status = (usb_status_t )ipl_receive_data(endpoint,bd);	    }	    else	    {	        status = USB_INVALID; /* If no endpoint is configured */	    }	}	else	{	    status = USB_INVALID; /* if the buffer pointer is NULL */	}    }    return(status);}/*==================================================================================================FUNCTION: tl_handle_setup_phaseDESCRIPTION:    	This function Handle the Setup Token from USB HostARGUMENTS PASSED:	None  RETURN VALUE:	None	IMPORTANT NOTES:	==================================================================================================*/void tl_handle_setup_phase(void){    usb_buffer_descriptor_t bd ;    usb_status_t status;    /* Receive the SetUp Data */    bd.buffer = (P_U32)g_usb_setup_data;    bd.size   = 0;    status = ipl_receive_setup_data(&bd);    if( status == USB_SUCCESS)    {         /* Parser the Setup Request Type */        switch (g_usb_setup_data[BREQUEST])                     {             case USB_GET_DESCRIPTOR:                /* Handle the GET DESCRIPTOR Request */	            tl_handle_get_descriptor();	            break;		        case USB_SET_ADDRESS:                /* Handle the SET ADDRESS Request */	            tl_handle_set_addrs();	            break;	    	        case USB_SET_CONFIGURATION:                /* Handle the SET CONFIGURATION Request */	            if ((g_usb_setup_data[WINDEX_LOWBYTE] == 0) &&                    (g_usb_setup_data[WINDEX_HIGHBYTE] == 0) &&                    (g_usb_setup_data[WLENGTH_LOWBYTE] == 0) &&                    (g_usb_setup_data[WLENGTH_HIGHBYTE] == 0) &&                    (g_usb_setup_data[WVALUE_HIGHBYTE] == 0)) 	            {                    tl_handle_set_configuration();	            }	            else	            {	                /* Send STALL Handshake   */	                ipl_send_stall_handshake(EP0,OUT);	            }	         break;	        case USB_GET_CONFIGURATION:	            /* GET CONFIGURATION request handler */	            tl_handle_get_configuration();	        default:	            /* Send STALL Handshake   */	            ipl_send_stall_handshake(EP0,OUT);	            break;	    }        /* service watch dog */        //HAPI_WATCHDOG_service ( );        *(volatile U16 *)(WDOG_WSR) = 0x5555;	    *(volatile U16 *)(WDOG_WSR) = 0xAAAA;    }    }/*==================================================================================================FUNCTION: tl_handle_get_descriptorDESCRIPTION:    	This function Handle the GET DESCRIPTOR requestARGUMENTS PASSED:	None  RETURN VALUE:	None	IMPORTANT NOTES:	None		==================================================================================================*/void tl_handle_get_descriptor(){    switch (g_usb_setup_data[WVALUE_HIGHBYTE])    {        case DEVICE_DESC:  	/* device descriptor*/			            tl_handle_get_device_desc();	    break;	case CONF_DESC:  	/* configuration descriptor*/	    tl_handle_get_config_desc();	    break;	case STRING_DESC:	/* string descriptor*/	    tl_handle_get_string_desc();	    break;	default:	/* Send STALL Handshake  */	    	    ipl_send_stall_handshake(EP0,OUT);	    break;    }}/*==================================================================================================FUNCTION:  tl_handle_set_configurationDESCRIPTION:    	This function Handle the SET CONFIGURATION requestARGUMENTS PASSED:	None  RETURN VALUE:	None	IMPORTANT NOTES:	None		==================================================================================================*/void tl_handle_set_configuration(){#ifndef SIMULATOR_TESTING    usb_end_pt_info_t config_data ;     U32 i;	#endif		    switch (g_usb_dev_state)    {	case USB_DEV_ADDRESSED_STATE :            if (g_usb_setup_data[WVALUE_LOWBYTE] == USB_DEV_VALUE_OF_UNCONFIG)	    {			/* Send Ack to Host*/		tl_status_phase(IN);	    }            /* Check if the configuration value received request is same as in Config descriptor */	    else if(g_usb_setup_data[WVALUE_LOWBYTE] == g_usb_desc.config_desc->configuration_value)	    {#ifndef SIMULATOR_TESTING		/* Configure endpoints */		for ( i = 0 ; i< g_number_of_endpoints ; i++)		{		    config_data.end_pt_no	= g_end_pt_info[i].end_pt_no; 		    config_data.direction  	= g_end_pt_info[i].direction;		    config_data.transfer_type	= g_end_pt_info[i].transfer_type;		    config_data.max_pkt_size	= g_end_pt_info[i].max_pkt_size;				    ipl_set_configuration(&config_data);		}#endif		/* Send Ack to Host*/		tl_status_phase(IN);		g_usb_dev_state = USB_DEV_CONFIGURED_STATE ;	    }	    else	    {		/* Invalid configuration value.  Send STALL Handshake */	        ipl_send_stall_handshake(EP0,OUT);	    }	break;		case USB_DEV_CONFIGURED_STATE :	    if(g_usb_setup_data[WVALUE_LOWBYTE] == USB_DEV_CONFIG_DESC_CONFIG_VALUE)	    {		/* Send Ack to Host*/		tl_status_phase(IN);	    }	    else if (g_usb_setup_data[WVALUE_LOWBYTE] == USB_DEV_VALUE_OF_UNCONFIG)	    {			/* Send Ack to Host*/		tl_status_phase(IN);		/* Change USB State to Addressed State	*/		g_usb_dev_state = USB_DEV_ADDRESSED_STATE;	    }	break;	default :	        /* Send STALL Handshake */	        ipl_send_stall_handshake(EP0,OUT);	break;	    }}/*==================================================================================================FUNCTION:  tl_handle_get_configurationDESCRIPTION:    	This function Handle the GET CONFIGURATION requestARGUMENTS PASSED:	None  RETURN VALUE:	None	IMPORTANT NOTES:	None		==================================================================================================*/void tl_handle_get_configuration(void){    usb_buffer_descriptor_t bd;    U32 buffer_addrs;    U32* buffer_ptr;     if((g_usb_setup_data[WINDEX_LOWBYTE] == 0) &&        (g_usb_setup_data[WINDEX_HIGHBYTE] == 0) &&       	(g_usb_setup_data[WVALUE_LOWBYTE] == 0) &&       	(g_usb_setup_data[WVALUE_HIGHBYTE] == 0) &&	(g_usb_setup_data[WLENGTH_LOWBYTE] == LEN_OF_CONFIG_VALUE) &&       	(g_usb_setup_data[WLENGTH_HIGHBYTE] == 0))     {        switch(g_usb_dev_state)	{	    case USB_DEV_DEFAULT_STATE :	        /* Send STALL Handshake */	        ipl_send_stall_handshake(EP0,OUT);		break;	    case USB_DEV_ADDRESSED_STATE:		/* If the Device is in Address state then return 0x0 : See USB2.0 Spec */		buffer_addrs = ipl_get_ep0_rxtx_buffer();		buffer_ptr = (U32 *)buffer_addrs;		*buffer_ptr = 0x0;		bd.buffer = buffer_ptr;		bd.size=LEN_OF_CONFIG_VALUE;		ipl_send_data(EP0,&bd,FALSE);		/* Receive Ack from Host*/		tl_status_phase(OUT);				break;	    case USB_DEV_CONFIGURED_STATE:		buffer_addrs = ipl_get_ep0_rxtx_buffer();                buffer_ptr = (U32 *)buffer_addrs;		*buffer_ptr = (UINT32 )g_usb_desc.config_desc->configuration_value;		bd.buffer = buffer_ptr;		bd.size=LEN_OF_CONFIG_VALUE;		ipl_send_data(EP0,&bd,FALSE);				/* Receive Ack from Host*/		tl_status_phase(OUT);				break;	    default:	        /* Send STALL Handshake */	        ipl_send_stall_handshake(EP0,OUT);	}    } }/*==================================================================================================FUNCTION: tl_handle_set_addrsDESCRIPTION:    	This function Handle the SET ADDRESS Request from USB HostARGUMENTS PASSED:	None  RETURN VALUE:	None	IMPORTANT NOTES:	==================================================================================================*/void tl_handle_set_addrs(){    U16 device_addrs;       /* Get the Device Address to be SET from the Setup Data  */    device_addrs = g_usb_setup_data[WVALUE_LOWBYTE] + (g_usb_setup_data[WVALUE_HIGHBYTE]<<8);           if ((g_usb_setup_data[WINDEX_LOWBYTE] == 0) &&          (g_usb_setup_data[WINDEX_HIGHBYTE] == 0) &&	  (g_usb_setup_data[WLENGTH_LOWBYTE] == 0) &&	  (g_usb_setup_data[WLENGTH_HIGHBYTE] == 0) &&      	  (device_addrs <= USB_MAX_DEVICE_ADDR))    {         switch(g_usb_dev_state)	{	    case USB_DEV_DEFAULT_STATE :	        		/* Send Ack to Host */		tl_status_phase(IN);		if (device_addrs == USB_DEFAULT_ADDR)		{		/* no handling needed */   		}		else		{		    /* Set the Device Address */	            ipl_set_device_address(device_addrs);			    /* Change state to ADDRESSED STATE  */		    g_usb_dev_state = USB_DEV_ADDRESSED_STATE;		}	      	break;			    case USB_DEV_ADDRESSED_STATE :		    		/* Send Ack to Host */		tl_status_phase(IN);		if ( device_addrs == USB_DEFAULT_ADDR )		{		    /* Set the Device Address */		    ipl_set_device_address(USB_DEFAULT_ADDR);				    /* Change state to ADDRESSED STATE  */	    	    g_usb_dev_state = USB_DEV_DEFAULT_STATE;        		}		else		{		    /* Set the Device Address */	            ipl_set_device_address(device_addrs);		}	    	break;	    	    case USB_DEV_CONFIGURED_STATE :	    			/* Send Ack to Host */		tl_status_phase(IN);			    	if ( device_addrs == USB_DEFAULT_ADDR)	    	{		    /* Set the Device Address */

⌨️ 快捷键说明

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