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

📄 usb_transaction_layer.c

📁 freescale atk source code
💻 C
📖 第 1 页 / 共 3 页
字号:
		    ipl_set_device_address(device_addrs);			    	    /* Change state to ADDRESSED STATE  */    		    g_usb_dev_state = USB_DEV_DEFAULT_STATE;    		}		else		{		    /* Send STALL Handshake  */ 		    ipl_send_stall_handshake(EP0,OUT);		}	    default :    		break;	}    }    else    {        /* Send STALL Handshake */        ipl_send_stall_handshake(EP0,OUT);	    }    }/*==================================================================================================FUNCTION: tl_handle_get_device_descDESCRIPTION:    	This function Handle the GET DEVICE DESCRIPTOR requestARGUMENTS PASSED:	None  RETURN VALUE:	None	IMPORTANT NOTES:	None		==================================================================================================*/void tl_handle_get_device_desc(void){    usb_buffer_descriptor_t bd ;    U32 buffer_addrs;    U16 desc_length = 0x0;    BOOL zlt = FALSE;	    /* get the buffer address for data transfer over EP0 */    buffer_addrs = ipl_get_ep0_rxtx_buffer();	    /* Fill the buffer with the descriptor data */    tl_fill_buffer_ep0in(FILL_DEVICE_DESC,buffer_addrs);    /* Get the length of descriptor requested */    desc_length = g_usb_setup_data[WLENGTH_LOWBYTE];    desc_length |= ( g_usb_setup_data[WLENGTH_HIGHBYTE] <<0x8);    /* If requested length of descriptor is lesser than actual length of descriptor then send      * requested length of descroptor only else send the actual length of descriptor*/#ifdef SIMULATOR_TESTING    if(desc_length <= g_usb_desc.device_desc->length)    {        bd.size = desc_length;    }    else    {        bd.size = g_usb_desc.device_desc->length;        if ( bd.size > 8)	{	    zlt = TRUE;	}    }#else       if( g_usb_dev_state == USB_DEV_DEFAULT_STATE )    {        bd.size = MPS_8;    }    else     {        bd.size = USB_DEV_DESC_LEN;    }#endif    /* Send descriptor */    ipl_send_data(EP0,&bd,zlt);		    /* Status Phase -- OUT */    tl_status_phase(OUT); }/*==================================================================================================FUNCTION: tl_handle_get_config_descDESCRIPTION:    	This function Handle the GET CONFIGURATION DESCRIPTOR requestARGUMENTS PASSED:RETURN VALUE:	None	IMPORTANT NOTES:	None		==================================================================================================*/void tl_handle_get_config_desc(void){    usb_buffer_descriptor_t bd;    U32 buffer_addrs;    U16 desc_length_req = 0x0;    U16 desc_length = 0x0;    BOOL zlt = FALSE;    /* get the buffer address for data transfer over EP0 */    buffer_addrs = ipl_get_ep0_rxtx_buffer();        /* Fill the buffer with the descriptor data */        tl_fill_buffer_ep0in(FILL_CONF_DESC, buffer_addrs);    	/* total length of descriptor */	desc_length = ((g_usb_desc.config_desc->total_length_l) | ( g_usb_desc.config_desc->total_length_h << 0x8 ));    /* Get the length of descriptor requested */    desc_length_req = g_usb_setup_data[WLENGTH_LOWBYTE];    desc_length_req |= ( g_usb_setup_data[WLENGTH_HIGHBYTE] <<0x8);    /* If requested length of descriptor is lesser than actual length of descriotor then send      * requested length of descroptor only else send the actual length of descriptor*/    if(desc_length_req <= desc_length)    {        bd.size = desc_length_req;    }    else    {        bd.size = desc_length;        if ( bd.size > MPS_64)	{	    zlt = TRUE;	}    }    ipl_send_data(EP0,&bd,zlt);		    /* Status Phase -- OUT */    tl_status_phase(OUT); }/*==================================================================================================FUNCTION: tl_handle_get_string_descDESCRIPTION:    	This function Handle the GET STRING DESCRIPTOR requestARGUMENTS PASSED:	NoneRETURN VALUE:	None	IMPORTANT NOTES:	None		==================================================================================================*/void tl_handle_get_string_desc(void){    usb_buffer_descriptor_t bd;    U32 buffer_addrs;    U16 desc_length_req = 0x0;    U16 length_of_desc = 0x0;    BOOL zlt = FALSE;    /* Get Buufer to fill the data to be received/transmitted.    */     buffer_addrs = ipl_get_ep0_rxtx_buffer();	       /* Get the length of descriptor requested */    desc_length_req = g_usb_setup_data[WLENGTH_LOWBYTE];    desc_length_req |= ( g_usb_setup_data[WLENGTH_HIGHBYTE] <<0x8);    switch (g_usb_setup_data[WVALUE_LOWBYTE])    {        case STR_DES0:            tl_fill_buffer_ep0in(FILL_STR_DES0,buffer_addrs);    	    /* If requested length of descriptor is lesser than actual length of descriotor then send 	     * requested length of descroptor only else send the actual length of descriptor*/	    if(desc_length_req <= g_usb_desc.str_desc0->length )	    {	        bd.size = desc_length_req;	    }	    else	    {		bd.size = g_usb_desc.str_desc0->length;                if (  bd.size > MPS_64)	        {	            zlt = TRUE;	        }	    }	    /* Data Phase -- IN */	    ipl_send_data(EP0,&bd,zlt);			    /* Status Phase -- OUT */	    tl_status_phase(OUT);         	    break;                case STR_DES1:		/*iManufacturer */            tl_fill_buffer_ep0in(FILL_STR_DES1,buffer_addrs);	    	    /* If requested length of descriptor is lesser than actual length of descriotor then send 	     * requested length of descroptor only else send the actual length of descriptor*/	    if(desc_length_req <= g_usb_desc.str_desc1->length )	    {	        bd.size = desc_length_req;	    }	    else	    {		bd.size = g_usb_desc.str_desc1->length;                if (  bd.size > MPS_64)	        {	            zlt = TRUE;	        }	    }	    /* Data Phase -- IN */	    ipl_send_data(EP0,&bd,zlt);			    /* Status Phase -- OUT */	    tl_status_phase(OUT);         	    break;                case STR_DES2:		/*iProduct */            tl_fill_buffer_ep0in(FILL_STR_DES2,buffer_addrs );	                  length_of_desc = g_usb_desc.str_desc2->length; 	    /* If requested length of descriptor is lesser than actual length of descriotor then send 	     * requested length of descroptor only else send the actual length of descriptor*/	    if(desc_length_req <= length_of_desc )	    {	        bd.size = desc_length_req;	    }	    else	    {		bd.size = length_of_desc;                if (  bd.size > MPS_64)	        {	            zlt = TRUE;	        }	    }	    /* Data Phase -- IN */	    ipl_send_data(EP0,&bd,zlt);			    /* Status Phase -- OUT */	    tl_status_phase(OUT);        	    break;                case STR_DES3:			/* send zero length data */                tl_status_phase(IN);			/* Status Phase -- OUT */                tl_status_phase(OUT);		break;        case STR_DES4:		/*iSerialNumber */        case STR_DES5:		/*iSerialNumber */            tl_fill_buffer_ep0in(FILL_STR_DES3,buffer_addrs );            	    /* If requested length of descriptor is lesser than actual length of descriotor then send 	     * requested length of descroptor only else send the actual length of descriptor*/	    if(desc_length_req <= g_usb_desc.str_desc3->length )	    {	        bd.size = desc_length_req;	    }	    else	    {		bd.size = g_usb_desc.str_desc3->length;                if (  bd.size > MPS_64)	        {	            zlt = TRUE;	        }	    }		    /* Data Phase -- IN */	    ipl_send_data(EP0,&bd,zlt);			    /* Status Phase -- OUT */	    tl_status_phase(OUT);         	    break;	default:	    /* Send STALL Handshake  */	    ipl_send_stall_handshake(EP0,OUT);	    	    break;    }}/*==================================================================================================FUNCTION: tl_fill_buffer_ep0inDESCRIPTION:    	This function is used to fill the corresponding response for the data phase of SETUP TransferARGUMENTS PASSED:	U8 type: type of descriptor	U32 buffer_addrs - buffer pointer to be filled	 RETURN VALUE:	None	IMPORTANT NOTES:	None==================================================================================================*/void tl_fill_buffer_ep0in(U8 type, U32 buffer_addrs){    const U8 *data=0;    U32 *buffer_page = (P_U32)buffer_addrs;        int k = 0;	    switch (type)    {        case FILL_DEVICE_DESC:	/*5*32 bit */	    data = (U8 *)g_usb_desc.device_desc;    	    break;	    	case FILL_CONF_DESC:		/*8*32 bit */	    data = (U8 *)g_usb_desc.config_desc;	    break;		case FILL_STR_DES0:		/*1*32 bit */	    data = (U8 *)g_usb_desc.str_desc0;	    break;		case FILL_STR_DES1:		/*7*32 bit */	    data =(U8 *)g_usb_desc.str_desc1; 	    break;		case FILL_STR_DES2:		/*7*32 bit */            data = (U8 *)g_usb_desc.str_desc2;	    break;		case FILL_STR_DES3:		/*6*32 bit */	    data = (U8 *)g_usb_desc.str_desc3;	    break;    }        for (k=0; k<(MPS_64/sizeof(U32)); k++)    {        #ifdef SIMULATOR_TESTING               #if (ENDIANESS == b)		         *buffer_page = data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24);         #else         *buffer_page = data[3] + (data[2] << 8) + (data[1] << 16) + (data[0] << 24); 		         #endif	    #else          *buffer_page = data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24);     #endif	buffer_page++;	data += 4;    }}/*==================================================================================================FUNCTION: tl_status_phaseDESCRIPTION:    	This function Send/Receive the Status to/from Host.ARGUMENTS PASSED:	U8    direction		OUT 	Receive Status Command From Host			 	IN 	Send Status Command to Host  RETURN VALUE:	None	IMPORTANT NOTES:	==================================================================================================*/void tl_status_phase(U8 direction){    usb_buffer_descriptor_t bd ;    /* Buffer pointer is not used for EP0 */    bd.buffer = (U32 *) 0xFFFFFFFF;    bd.size = 0x0;    switch ( direction )    {	case OUT :	    /*  Receive ZERO length Length Data */	    ipl_receive_data(EP0,&bd);    	    break;	case IN :	    /* Send ZERO length Length Data */	    ipl_send_data(EP0,&bd,FALSE);	    break;    }}/*==================================================================================================FUNCTION: tl_handle_bus_resetDESCRIPTION:    	This function Handle the USB Bus Reset Event ARGUMENTS PASSED:	None  RETURN VALUE:	None	IMPORTANT NOTES:	==================================================================================================*/void tl_handle_bus_reset(){    /* Change USB State to Default */    g_usb_dev_state = USB_DEV_DEFAULT_STATE;        /* Initialise the IP Layer  */    ipl_handle_bus_reset();}/*==================================================================================================FUNCTION: tl_check_for_bus_activityDESCRIPTION:    	This function Check for Bus Reset Event ARGUMENTS PASSED:	None  RETURN VALUE:        BOOL rtn 	: return TRUE is BUS RESET event detected else return FALSE.		IMPORTANT NOTES:	==================================================================================================*/BOOL tl_check_for_bus_activity(void){    BOOL rtn = FALSE;    /* Check if Bus Reset Received */    if(ipl_check_bus_reset() == TRUE)    {        rtn = TRUE;    }   return rtn;}#ifdef SIMULATOR_TESTINGvoid test_stub_set_config(void){    U8 i;    usb_end_pt_info_t config_data ;    /* 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

⌨️ 快捷键说明

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