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

📄 usb_transaction_layer.c

📁 freescale atk source code
💻 C
📖 第 1 页 / 共 3 页
字号:
/*==================================================================================================                                                                                   Module Name:  usb_transaction_layer.c    General Description: This file contains the USB transaction Layer functionality .====================================================================================================    Copyright (C) 2006, Freescale Semiconductor, Inc. All Rights Reserved    THIS SOURCE CODE IS CONFIDENTIAL AND PROPRIETARY AND MAY NOT    BE USED OR DISTRIBUTED WITHOUT THE WRITTEN PERMISSION OF    Freescale Semiconductor, Inc.  Revision History:                            Modification     TrackingAuthor                          Date          Number     Description of Changes-------------------------   ------------    ----------   -------------------------------------------Siva Pothireddy              31-12-2007       engcm02429         Added support for LPB FeatureSiva Pothireddy                01/Dec/2007   engcm02041   Changed String Descriptor and included endianess check for simulatorMahima Verma                 26/Sep/2007    ENGcm00387   Watch dog is not serviced properly when                                                         Enumerate test is being executed.Mahima Verma                 19/Jul/2007    TLSbo94597   Changes in USB to support simulator testing.Mahima Verma                 11/Jun/2007    TLSbo93857   Ported to Marley.Suresh Kumar                 18/Oct/2006    TLSbo80774   Ported to Zappa.Bharat Bhushan               24-Aug-2006    TLSbo76463   Porting to SKYE+ .Bharat Bhushan               04/08/2006     TLSbo74877   Maximum Packet Size changed from 0x08 to                                                          0x40 for EP0.Bharat Bhushan               05/10/2006     TLSbo68884   Initial Version ( USB Layer Architecture).-------------------------   ------------    ----------   ------------------------------------------- Portability: Portable.====================================================================================================                                        INCLUDE FILES==================================================================================================*/#include "suapi.h"#include "usb_common.h"#include "usb_transaction_layer.h"#include "usb_ipl_tl_extern.h"#include "usb_tl_al_extern.h"#include "platform.h"/*==================================================================================================                                     GLOBAL VARIABLES==================================================================================================*//*==================================================================================================                                     LOCAL CONSTANTS==================================================================================================*/#define IIM_BASE_ADDR               0x83F98000#define IIM_FB0_BASE                (IIM_BASE_ADDR + 0x0800)#define IIM_SCS0_REG                (IIM_BASE_ADDR + 0x2c )#define IIM_SCS1_REG                (IIM_BASE_ADDR + 0x30 )#define IIM_SCS2_REG                (IIM_BASE_ADDR + 0x34 )#define IIM_SCS3_REG                (IIM_BASE_ADDR + 0x38 )/*IIM register masks*/#define IIM_SCS1_LPB_MASK           0x01#define HAPI_IIM_SCS1_LPB_READ_STATUS() ((*(VP_U32)IIM_SCS1_REG) &  IIM_SCS1_LPB_MASK)   /*=================================================================================================                                 LOCAL FUNCTION PROTOTYPES==================================================================================================*/static void tl_handle_setup_phase(void);static void tl_handle_get_descriptor(void);static void tl_handle_set_addrs(void);static void tl_fill_buffer_ep0in(U8 type, U32 buffer_addrs);static void tl_handle_set_configuration(void);static void tl_handle_get_device_desc(void);static void tl_handle_get_config_desc(void);static void tl_handle_get_string_desc(void);static void tl_status_phase(U8 Direction);static void tl_handle_get_configuration(void);/*==================================================================================================                                      LOCAL VARIABLES==================================================================================================*//* USB Device Descriptor according to USB2.0 Specification */usb_device_desc_t g_usb_device_desc = {    USB_DEV_DESC_LEN,    USB_DEV_DESC_TYPE,                 USB_DEV_DESC_SPEC_LB,                  USB_DEV_DESC_SPEC_HB,            USB_DEV_DESC_DEV_CLASS,              USB_DEV_DESC_DEV_SUBCLASS,            USB_DEV_DESC_DEV_PROTOCOL,             USB_DEV_DESC_EP0_MAXPACKETSIZE,         USB_DEV_DESC_VENDORID_LB,                   USB_DEV_DESC_VENDORID_HB,                   USB_DEV_DESC_PRODUCTID_LB,                   USB_DEV_DESC_PRODUCTID_HB,                   USB_DEV_DESC_DEV_RELEASE_NUM_LB,              USB_DEV_DESC_DEV_RELEASE_NUM_HB,             USB_DEV_DESC_DEV_STRING_IND_MANUFACTURE,    USB_DEV_DESC_DEV_STRING_IND_PRODUCT,      USB_DEV_DESC_DEV_STRING_IND_SERIAL_NUM,    USB_DEV_DESC_DEV_NUM_CONFIGURATIONS};/* USB Config Descriptor according to USB2.0 Specification *//* Full Speed Non Secure */usb_config_desc_t g_usb_config_desc_fs_ns = {    USB_DEV_CONFIG_DESC_LEN,       USB_DEV_CONFIG_DESC_TYPE,       USB_DEV_CONFIG_DESC_TTL_LEN_LB ,       USB_DEV_CONFIG_DESC_TTL_LEN_HB ,       USB_DEV_CONFIG_DESC_NUM_0F_INF,      USB_DEV_CONFIG_DESC_CONFIG_VALUE ,      USB_DEV_CONFIG_DESC_STRING_INDEX,     USB_DEV_CONFIG_DESC_ATTRIBUTES,        USB_DEV_CONFIG_DESC_MAX_POWER,/* USB Interface Descriptor according to USB2.0 Specification */    USB_DEV_INF_DESC_LEN,      USB_DEV_INF_DESC_TYPE,      USB_DEV_INF_DESC_INF_INDEX,     USB_DEV_INF_DESC_ALT_SETTING,    USB_DEV_INF_DESC_NUM_OF_EP,  /* NOTE : This should not be more than 2 */    USB_DEV_INF_DESC_INF_CLASS,     USB_DEV_INF_DESC_INF_SUBCLASS_NS_BLANK,       USB_DEV_INF_DESC_INF_PROTOCOL,     USB_DEV_INF_DESC_STRING_INDEX,  /* USB Endpoint 1 Descriptors according to USB2.0 Specification */    USB_EP1_DESC_SIZE,    USB_EP1_DESC_TYPE,    USB_EP1_DESC_EP_ADDR,    USB_EP1_DESC_ATTRIBUTES,     USB_EP1_DESC_MAX_PACKET_SIZE_FS_LB,     USB_EP1_DESC_MAX_PACKET_SIZE_FS_HB,     USB_EP1_DESC_INTERVAL,  /* USB Endpoint 2 Descriptors according to USB2.0 Specification */    USB_EP2_DESC_SIZE,     USB_EP2_DESC_TYPE,    USB_EP2_DESC_EP_ADDR,        USB_EP2_DESC_ATTRIBUTES,      USB_EP2_DESC_MAX_PACKET_SIZE_FS_LB,      USB_EP2_DESC_MAX_PACKET_SIZE_FS_HB,      USB_EP2_DESC_INTERVAL    };/* Full Speed Secure */usb_config_desc_t g_usb_config_desc_fs_s = {    USB_DEV_CONFIG_DESC_LEN,       USB_DEV_CONFIG_DESC_TYPE,       USB_DEV_CONFIG_DESC_TTL_LEN_LB ,       USB_DEV_CONFIG_DESC_TTL_LEN_HB ,       USB_DEV_CONFIG_DESC_NUM_0F_INF,      USB_DEV_CONFIG_DESC_CONFIG_VALUE ,      USB_DEV_CONFIG_DESC_STRING_INDEX,     USB_DEV_CONFIG_DESC_ATTRIBUTES,        USB_DEV_CONFIG_DESC_MAX_POWER,/* USB Interface Descriptor according to USB2.0 Specification */    USB_DEV_INF_DESC_LEN,      USB_DEV_INF_DESC_TYPE,      USB_DEV_INF_DESC_INF_INDEX,     USB_DEV_INF_DESC_ALT_SETTING,    USB_DEV_INF_DESC_NUM_OF_EP,  /* NOTE : This should not be more than 2 */    USB_DEV_INF_DESC_INF_CLASS,     USB_DEV_INF_DESC_INF_SUBCLASS_S_BLANK,       USB_DEV_INF_DESC_INF_PROTOCOL,     USB_DEV_INF_DESC_STRING_INDEX,  /* USB Endpoint 1 Descriptors according to USB2.0 Specification */    USB_EP1_DESC_SIZE,    USB_EP1_DESC_TYPE,    USB_EP1_DESC_EP_ADDR,    USB_EP1_DESC_ATTRIBUTES,     USB_EP1_DESC_MAX_PACKET_SIZE_FS_LB,     USB_EP1_DESC_MAX_PACKET_SIZE_FS_HB,     USB_EP1_DESC_INTERVAL,  /* USB Endpoint 2 Descriptors according to USB2.0 Specification */    USB_EP2_DESC_SIZE,     USB_EP2_DESC_TYPE,    USB_EP2_DESC_EP_ADDR,        USB_EP2_DESC_ATTRIBUTES,      USB_EP2_DESC_MAX_PACKET_SIZE_FS_LB,      USB_EP2_DESC_MAX_PACKET_SIZE_FS_HB,      USB_EP2_DESC_INTERVAL    };/* USB String Descriptors 0, according to USB2.0 Specification */usb_str0_desc_t g_usb_otg_str0_desc = {    USB_STR0_DESC_SIZE,    USB_STR0_DESC_TYPE,    USB_LANGUAGE_ID_LB,    USB_LANGUAGE_ID_HB};/*  STRING DESCRIPTOR See table 9-15 in USB2.0 spec (www.usb.org) iManufacturer*/usb_str1_desc_t g_usb_otg_string_desc1 = {	USB_STR1_DESC_SIZE, 		/* bLength */	USB_STR1_DESC_TYPE,		/* bDescriptorType */	'F', 0x00,			/* bString */	'r', 0x00,	'e', 0x00,	'e', 0x00,	's', 0x00,	'c', 0x00,	'a', 0x00,	'l', 0x00,	'e', 0x00,	' ', 0x00,	'S', 0x00,	'e', 0x00,	'm', 0x00,	'i', 0x00,	'C', 0x00,	'o', 0x00,	'n', 0x00,	'd', 0x00,	'u', 0x00,	'c', 0x00,	't', 0x00,	'o', 0x00,	'r', 0x00,	' ', 0x00,	'I', 0x00,	'n', 0x00,	'c', 0x00,	' ', 0x00};	 /* STRING DESCRIPTOR   See table 9-15 in USB2.0 spec (www.usb.org)   iProduct*/usb_str2_desc_t g_usb_otg_string_desc2_se = {	USB_STR2_DESC_SIZE_SE,      	/* bLength */	USB_STR2_DESC_TYPE,		/* bDescriptorType */	'S', 0x00,	                /* bString */	'E', 0x00,			' ', 0x00,				'B', 0x00,	'l', 0x00,		'a', 0x00,			'n', 0x00,		'k', 0x00,			' ', 0x00,				'E', 0x00,				'L', 0x00,	'V', 0x00,	'I', 0x00,	'S', 0x00,};usb_str2_desc_t g_usb_otg_string_desc2_sp = {	USB_STR2_DESC_SIZE_S,      	/* bLength */	USB_STR2_DESC_TYPE,		/* bDescriptorType */	'S', 0x00,	                /* bString */	'P', 0x00,	                /* bString */	' ', 0x00,				'B', 0x00,	'l', 0x00,		'a', 0x00,			'n', 0x00,		'k', 0x00,			' ', 0x00,			        'E', 0x00,        'L', 0x00,        'V', 0x00,        'I', 0x00,        'S', 0x00,};usb_str2_desc_t g_usb_otg_string_desc2_ns = {	USB_STR2_DESC_SIZE_NS,      	/* bLength */	USB_STR2_DESC_TYPE,		/* bDescriptorType */	'N', 0x00,	                /* bString */	'S', 0x00,			' ', 0x00,				'B', 0x00,	'l', 0x00,		'a', 0x00,			'n', 0x00,		'k', 0x00,			' ', 0x00,			        'E', 0x00,        'L', 0x00,        'V', 0x00,        'I', 0x00,        'S', 0x00,	};/* STRING DESCRIPTOR   See table 9-15 in USB2.0 spec (www.usb.org)   iSerialNumber */usb_str3_desc_t g_usb_otg_string_desc3 = {	USB_STR3_DESC_SIZE,			/* bLength */	USB_STR3_DESC_TYPE,			/* bDescriptorType */	'F', 0x00,			/* bString */	'r', 0x00,	'e', 0x00,	'e', 0x00,	's', 0x00,	'c', 0x00,	'a', 0x00,	'l', 0x00,	'e', 0x00,	' ', 0x00,        'F', 0x00,        'l', 0x00,        'a', 0x00,        's', 0x00,        'h', 0x00};usb_state_t g_usb_dev_state = USB_DEV_DUMMY_STATE; /* State os USB Device */static U8 g_usb_setup_data[SETUP_DATA_LENGTH];		/* Length of setup data received */static usb_end_pt_info_t  g_end_pt_info[USB_DEV_INF_DESC_NUM_OF_EP]; /* Array to keep information about the endpoints used */static U8 g_number_of_endpoints;     /* Number of endpoints */static usb_desc_t g_usb_desc;     /* USB Descriptors *//*==================================================================================================                                        LOCAL MACROS==================================================================================================*//*==================================================================================================                                     LOCAL FUNCTIONS==================================================================================================*//*==================================================================================================FUNCTION: tl_initDESCRIPTION: 	This Function does the Transaction Layer initialisation.ARGUMENTS PASSED:	NoneRETURN VALUE:	None	IMPORTANT NOTES:	==================================================================================================*/voidtl_init(void){    U8 i;    U8 u8Type = 0;    /* Select the common descriptors , these descriptor are independent of speed and security mode */     g_usb_desc.device_desc = &g_usb_device_desc ;    g_usb_desc.str_desc0 = &g_usb_otg_str0_desc;    g_usb_desc.str_desc1 = &g_usb_otg_string_desc1;    g_usb_desc.str_desc3 = &g_usb_otg_string_desc3;    /* Get hab_su_type */    u8Type = (U8)((*((volatile U8 *)(IIM_FB0_BASE + 0x10))) & 0x7);    switch(u8Type)    {        case HAB_SEC_DISABLED:            /* Select the descriptors which are specific to Non Secure Boot */            g_usb_desc.str_desc2 = &g_usb_otg_string_desc2_ns;            g_usb_desc.config_desc = &g_usb_config_desc_fs_ns;        break;                 case HAB_ENGINEERING:            /* Select the descriptors which are specific to Secure Engineering Boot */            g_usb_desc.str_desc2 = &g_usb_otg_string_desc2_se;                g_usb_desc.config_desc = &g_usb_config_desc_fs_s;                default:            /* Select the descriptors which are specific to Secure Production Boot */            g_usb_desc.str_desc2 = &g_usb_otg_string_desc2_sp;                g_usb_desc.config_desc = &g_usb_config_desc_fs_s;        break;    }    if(HAPI_IIM_SCS1_LPB_READ_STATUS())/*If LPB Enabled*/    {        g_usb_desc.config_desc->attributes = (UINT8)USB_DEV_CONFIG_DESC_LPB_ATTRIBUTES;        g_usb_desc.config_desc->max_power = (UINT8)USB_DEV_CONFIG_DESC_LPB_MAX_POWER;    }         /* Get Number of Endpoints supported from Configuration Descriptor ( Use Secure Config Descriptor as Endpoint information for       both Secure and Non Secure is same */    g_number_of_endpoints = g_usb_desc.config_desc->usb_interface_desc.num_of_endpts;      /* Store the Endpoint specific information in local variable structure to this Layer */    for ( i = 0 ; i< g_number_of_endpoints ; i++)    {        g_end_pt_info[i].end_pt_no = ((g_usb_desc.config_desc->usb_endpoint_desc[i].endpoint_addrs) & ENDPT_NUMBER_MASK);    		g_end_pt_info[i].direction = (((g_usb_desc.config_desc->usb_endpoint_desc[i].endpoint_addrs) & ENDPT_DIR_MASK )>>ENDPT_DIR_SHIFT);		g_end_pt_info[i].transfer_type = (g_usb_desc.config_desc->usb_endpoint_desc[i].attributes & ENDPT_TRNS_TYPE_MASK);		g_end_pt_info[i].max_pkt_size = ((g_usb_desc.config_desc->usb_endpoint_desc[i].max_pkt_size_l) | (( g_usb_desc.config_desc->usb_endpoint_desc[i].max_pkt_size_h ) << 8 ));    }}/*==================================================================================================FUNCTION: tl_get_stateDESCRIPTION:    	This function return the current state of USB Bus.ARGUMENTS PASSED:	None  RETURN VALUE:	usb_state_t  g_usb_dev_state : State of the USB Bus .  	IMPORTANT NOTES:	==================================================================================================*/usb_state_ttl_get_state(void){    return g_usb_dev_state;}/*==================================================================================================FUNCTION: tl_configureDESCRIPTION:    	This function Does the enumeration of the USB . ARGUMENTS PASSED:	None  RETURN VALUE:	None	IMPORTANT NOTES:	==================================================================================================*/voidtl_configure(void){   #ifdef SIMULATOR_TESTING    int i;#endif    while(g_usb_dev_state!= USB_DEV_CONFIGURED_STATE)    {        /* Check if Bus Reset Received */        if(ipl_check_bus_reset() == TRUE)        {    	    /* Handle Bus Reset */            tl_handle_bus_reset();         }	    #ifdef SIMULATOR_TESTING        /* Required to wait endlessly for setup pkt , not checking for reset as per behavior in simulator */        while(g_usb_dev_state != USB_DEV_CONFIGURED_STATE)        {#endif            /* Check if Reset is already received and Setup Token Received */            if((g_usb_dev_state != USB_DEV_DUMMY_STATE) && (ipl_check_setup_token() == TRUE))            {	            /* Handle Setup Token */                tl_handle_setup_phase();            }#ifdef SIMULATOR_TESTING        }    /* Delay needs to be introduced for CORE simulated in simulator to reach DONE state */    for(i =0;i<1000000;i++);#endif    } }/*==================================================================================================FUNCTION: tl_send_dataDESCRIPTION:    	This function Handle the Send Request on USB Bus ARGUMENTS PASSED:	usb_buffer_descriptor_t* bd

⌨️ 快捷键说明

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