📄 usb_transaction_layer.c
字号:
/*================================================================================================== Module Name: usb_transaction_layer.c General Description: This file contains the USB transaction Layer functionality .====================================================================================================Copyright 2008 Freescale Semiconductor, Inc. All Rights Reserved.This file contains copyrighted material. Use of this file isrestricted by the provisions of a Freescale Software LicenseAgreement, which has either been electronically accepted byyou or has been expressly executed between the parties. Revision History:------------------------- ------------ ---------- ------------------------------------------- Portability: Portable.==================================================================================================== INCLUDE FILES==================================================================================================*/#include "su_basictypes.h"#include <usb_common.h>#include <usb_transaction_layer.h>#include <usb_ipl_tl_extern.h>#include <usb_tl_al_extern.h>#include <usb_global.h>/*================================================================================================== GLOBAL VARIABLES==================================================================================================*//*================================================================================================== LOCAL CONSTANTS==================================================================================================*//*================================================================================================= 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_device_qf_desc(void);static void tl_handle_get_config_desc(U8 descriptor);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 Device Qualifier Descriptor according to USB2.0 Specification */usb_device_qualifier_desc_t g_usb_device_qf_desc = { USB_DEV_QUALIFIER_DESC_LEN, USB_DEV_QUALIFIER_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_NUM_OT_SPEED_CONF, USB_DEV_DESC_RESERVED };/* 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 };/* High Speed Non Secure */usb_config_desc_t g_usb_config_desc_hs_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_HS_LB, USB_EP1_DESC_MAX_PACKET_SIZE_HS_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_HS_LB, USB_EP2_DESC_MAX_PACKET_SIZE_HS_HB, USB_EP2_DESC_INTERVAL };/* High Speed Secure */usb_config_desc_t g_usb_config_desc_hs_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_HS_LB, USB_EP1_DESC_MAX_PACKET_SIZE_HS_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_HS_LB, USB_EP2_DESC_MAX_PACKET_SIZE_HS_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, 'R', 0x00, 'I', 0x00, 'N', 0x00, 'G', 0x00, 'O', 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, 'R', 0x00, 'I', 0x00, 'N', 0x00, 'G', 0x00, 'O', 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, 'R', 0x00, 'I', 0x00, 'N', 0x00, 'G', 0x00, 'O', 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};static 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; BOOL hs_interface; U8 type;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -