📄 usb_transaction_layer.c
字号:
/*================================================================================================== 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 + -