]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/FtdiUsbSerialDriver.h
OptionRomPkg: Added bus driver for FTDI USB to serial adapters
[mirror_edk2.git] / OptionRomPkg / Bus / Usb / FtdiUsbSerialDxe / FtdiUsbSerialDriver.h
diff --git a/OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/FtdiUsbSerialDriver.h b/OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/FtdiUsbSerialDriver.h
new file mode 100644 (file)
index 0000000..07f4133
--- /dev/null
@@ -0,0 +1,595 @@
+/** @file\r
+  Header file for USB Serial Driver's Data Structures.\r
+\r
+Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.\r
+Portions Copyright 2012 Ashley DeSimone\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD\r
+License which accompanies this distribution.  The full text of the license may\r
+be found at http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _FTDI_USB_SERIAL_DRIVER_H_\r
+#define _FTDI_USB_SERIAL_DRIVER_H_\r
+\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/UefiLib.h>\r
+#include <Library/DevicePathLib.h>\r
+\r
+#include <Protocol/DevicePath.h>\r
+#include <Protocol/UsbIo.h>\r
+#include <Protocol/SerialIo.h>\r
+\r
+//\r
+// US English LangID\r
+//\r
+#define USB_US_LANG_ID  0x0409\r
+\r
+//\r
+// Supported Vendor Ids\r
+//\r
+#define VID_FTDI    0x0403\r
+\r
+//\r
+// Supported product ids\r
+//\r
+#define DID_FTDI_FT232    0x6001\r
+\r
+//\r
+// FTDI Commands\r
+//\r
+#define FTDI_COMMAND_RESET_PORT          0\r
+#define FTDI_COMMAND_MODEM_CTRL          1\r
+#define FTDI_COMMAND_SET_FLOW_CTRL       2\r
+#define FTDI_COMMAND_SET_BAUDRATE        3\r
+#define FTDI_COMMAND_SET_DATA            4\r
+#define FTDI_COMMAND_GET_MODEM_STATUS    5\r
+#define FTDI_COMMAND_SET_EVENT_CHAR      6\r
+#define FTDI_COMMAND_SET_ERROR_CHAR      7\r
+#define FTDI_COMMAND_SET_LATENCY_TIMER   9\r
+#define FTDI_COMMAND_GET_LATENCY_TIMER   10\r
+\r
+//\r
+// FTDI_PORT_IDENTIFIER\r
+// Used in the usb control transfers that issue FTDI commands as the index value.\r
+//\r
+#define FTDI_PORT_IDENTIFIER    0x1 // For FTDI USB serial adapter the port\r
+                                    // identifier is always 1.\r
+\r
+//\r
+// RESET_PORT\r
+//\r
+#define RESET_PORT_RESET        0x0 // Purges RX and TX, clears DTR and RTS sets\r
+                                    // flow control to none, disables event\r
+                                    // trigger, sets the event char to 0x0d and\r
+                                    // does nothing to baudrate or data settings\r
+#define RESET_PORT_PURGE_RX     0x1\r
+#define RESET_PORT_PURGE_TX     0x2\r
+\r
+//\r
+// SET_FLOW_CONTROL\r
+//\r
+#define NO_FLOW_CTRL                     0x0\r
+#define XON_XOFF_CTRL                    0x4\r
+\r
+//\r
+// SET_BAUD_RATE\r
+// To set baud rate, one must calculate an encoding of the baud rate from\r
+// UINT32 to UINT16.See EncodeBaudRateForFtdi() for details\r
+//\r
+#define FTDI_UART_FREQUENCY              3000000\r
+#define FTDI_MIN_DIVISOR                 0x20\r
+#define FTDI_MAX_DIVISOR                 0x3FFF8\r
+//\r
+// Special case baudrate values\r
+// 300,000 and 200,000 are special cases for calculating the encoded baudrate\r
+//\r
+#define FTDI_SPECIAL_CASE_300_MIN        (3000000 * 100) / 103 // minimum adjusted\r
+                                                               // value for 300,000\r
+#define FTDI_SPECIAL_CASE_300_MAX        (3000000 * 100) / 97  // maximum adjusted\r
+                                                               // value for 300,000\r
+#define FTDI_SPECIAL_CASE_200_MIN        (2000000 * 100) / 103 // minimum adjusted\r
+                                                               // value for 200,000\r
+#define FTDI_SPECIAL_CASE_200_MAX        (2000000 * 100) / 97  // maximum adjusted\r
+                                                               // value for 200,000\r
+//\r
+// Min and max frequency values that the FTDI chip can attain\r
+//.all generated frequencies must be between these values\r
+//\r
+#define FTDI_MIN_FREQUENCY              46601941 // (3MHz * 1600) / 103 = 46601941\r
+#define FTDI_MAX_FREQUENCY              49484536 // (3MHz * 1600) / 97 = 49484536\r
+\r
+//\r
+// SET_DATA_BITS\r
+//\r
+#define SET_DATA_BITS(n)                 (n)\r
+\r
+//\r
+// SET_PARITY\r
+//\r
+#define SET_PARITY_NONE                   0x0\r
+#define SET_PARITY_ODD                    BIT8 // (0x1 << 8)\r
+#define SET_PARITY_EVEN                   BIT9 // (0x2 << 8)\r
+#define SET_PARITY_MARK                   BIT9 | BIT8 // (0x3 << 8)\r
+#define SET_PARITY_SPACE                  BIT10 // (0x4 << 8)\r
+\r
+//\r
+// SET_STOP_BITS\r
+//\r
+#define SET_STOP_BITS_1                   0x0\r
+#define SET_STOP_BITS_15                  BIT11 // (0x1 << 11)\r
+#define SET_STOP_BITS_2                   BIT12 // (0x2 << 11)\r
+\r
+//\r
+// SET_MODEM_CTRL\r
+// SET_DTR_HIGH = (1 | (1 << 8)), SET_DTR_LOW = (0 | (1 << 8)\r
+// SET_RTS_HIGH = (2 | (2 << 8)), SET_RTS_LOW = (0 | (2 << 8)\r
+//\r
+#define SET_DTR_HIGH                     (BIT8 | BIT0)\r
+#define SET_DTR_LOW                      (BIT8)\r
+#define SET_RTS_HIGH                     (BIT9 | BIT1)\r
+#define SET_RTS_LOW                      (BIT9)\r
+\r
+//\r
+// MODEM_STATUS\r
+//\r
+#define CTS_MASK                         BIT4\r
+#define DSR_MASK                         BIT5\r
+#define RI_MASK                          BIT6\r
+#define SD_MASK                          BIT7\r
+#define MSR_MASK                         (CTS_MASK | DSR_MASK | RI_MASK | SD_MASK)\r
+\r
+//\r
+// Macro used to check for USB transfer errors\r
+//\r
+#define USB_IS_ERROR(Result, Error)           (((Result) & (Error)) != 0)\r
+\r
+//\r
+// USB request timeouts\r
+//\r
+#define WDR_TIMEOUT        5000  // default urb timeout in ms\r
+#define WDR_SHORT_TIMEOUT  1000  // shorter urb timeout in ms\r
+\r
+//\r
+// FTDI timeout\r
+//\r
+#define FTDI_TIMEOUT       16\r
+\r
+//\r
+// FTDI FIFO depth\r
+//\r
+#define FTDI_MAX_RECEIVE_FIFO_DEPTH  384\r
+\r
+//\r
+// FTDI Endpoint Descriptors\r
+//\r
+#define FTDI_ENDPOINT_ADDRESS_IN   0x81 //the endpoint address for the in enpoint generated by the device\r
+#define FTDI_ENDPOINT_ADDRESS_OUT  0x02 //the endpoint address for the out endpoint generated by the device\r
+\r
+//\r
+// Max buffer size for USB transfers\r
+//\r
+#define SW_FIFO_DEPTH 1024\r
+\r
+//\r
+// struct to define a usb device as a vendor and product id pair\r
+//\r
+typedef struct {\r
+  UINTN     VendorId;\r
+  UINTN     DeviceId;\r
+} USB_DEVICE;\r
+\r
+//\r
+//struct to describe the control bits of the device\r
+//true indicates enabled\r
+//false indicates disabled\r
+// \r
+typedef struct {\r
+  BOOLEAN    HardwareFlowControl;\r
+  BOOLEAN    DtrState;\r
+  BOOLEAN    RtsState;\r
+  BOOLEAN    HardwareLoopBack;\r
+  BOOLEAN    SoftwareLoopBack;\r
+} CONTROL_BITS;\r
+\r
+//\r
+//struct to describe the status bits of the device \r
+//true indicates enabled\r
+//false indicated disabled\r
+//\r
+typedef struct {\r
+  BOOLEAN    CtsState;\r
+  BOOLEAN    DsrState;\r
+  BOOLEAN    RiState;\r
+  BOOLEAN    SdState;\r
+} STATUS_BITS;\r
+\r
+//\r
+// Structure to describe the last attributes of the Usb Serial device\r
+//\r
+typedef struct {\r
+  UINT64              BaudRate;\r
+  UINT32              ReceiveFifoDepth;\r
+  UINT32              Timeout;\r
+  EFI_PARITY_TYPE     Parity;\r
+  UINT8               DataBits;\r
+  EFI_STOP_BITS_TYPE  StopBits;\r
+} PREVIOUS_ATTRIBUTES;\r
+\r
+//\r
+// Structure to describe USB serial device\r
+//\r
+#define USB_SER_DEV_SIGNATURE  SIGNATURE_32 ('u', 's', 'b', 's')\r
+\r
+typedef struct {\r
+  UINTN                         Signature;\r
+  EFI_HANDLE                    ControllerHandle;\r
+  EFI_DEVICE_PATH_PROTOCOL      *DevicePath;\r
+  EFI_DEVICE_PATH_PROTOCOL      *ParentDevicePath;\r
+  UART_DEVICE_PATH              UartDevicePath;\r
+  UART_FLOW_CONTROL_DEVICE_PATH FlowControlDevicePath;\r
+  EFI_USB_IO_PROTOCOL           *UsbIo;\r
+  EFI_USB_INTERFACE_DESCRIPTOR  InterfaceDescriptor;\r
+  EFI_USB_ENDPOINT_DESCRIPTOR   InEndpointDescriptor;\r
+  EFI_USB_ENDPOINT_DESCRIPTOR   OutEndpointDescriptor;\r
+  EFI_UNICODE_STRING_TABLE      *ControllerNameTable;\r
+  UINT32                        DataBufferHead;\r
+  UINT32                        DataBufferTail;\r
+  UINT8                         *DataBuffer;\r
+  EFI_SERIAL_IO_PROTOCOL        SerialIo;\r
+  BOOLEAN                       Shutdown;\r
+  EFI_EVENT                     PollingLoop;\r
+  UINT32                        ControlBits;\r
+  PREVIOUS_ATTRIBUTES           LastSettings;\r
+  CONTROL_BITS                  ControlValues;\r
+  STATUS_BITS                   StatusValues;\r
+  UINT8                         ReadBuffer[512];\r
+} USB_SER_DEV;\r
+\r
+#define USB_SER_DEV_FROM_THIS(a) \\r
+  CR(a, USB_SER_DEV, SerialIo, USB_SER_DEV_SIGNATURE)\r
+\r
+//\r
+// Global Variables\r
+//\r
+extern EFI_DRIVER_BINDING_PROTOCOL   gUsbSerialDriverBinding;\r
+extern EFI_COMPONENT_NAME_PROTOCOL   gUsbSerialComponentName;\r
+extern EFI_COMPONENT_NAME2_PROTOCOL  gUsbSerialComponentName2;\r
+\r
+//\r
+// Functions of Driver Binding Protocol\r
+//\r
+/**\r
+  Check whether USB Serial driver supports this device.\r
+\r
+  @param  This[in]                   The USB Serial driver binding protocol.\r
+  @param  Controller[in]             The controller handle to check.\r
+  @param  RemainingDevicePath[in]    The remaining device path.\r
+\r
+  @retval EFI_SUCCESS                The driver supports this controller.\r
+  @retval other                      This device isn't supported.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+UsbSerialDriverBindingSupported (\r
+  IN EFI_DRIVER_BINDING_PROTOCOL  *This,\r
+  IN EFI_HANDLE                   Controller,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath\r
+  );\r
+\r
+/**\r
+  Starts the Serial device with this driver.\r
+\r
+  This function produces Serial IO Protocol and initializes the USB\r
+  Serial device to manage this USB Serial device.\r
+\r
+  @param  This[in]                   The USB Serial driver binding instance.\r
+  @param  Controller[in]             Handle of device to bind driver to.\r
+  @param  RemainingDevicePath[in]    Optional parameter use to pick a specific\r
+                                     child device to start.\r
+\r
+  @retval EFI_SUCCESS                The controller is controlled by the USB\r
+                                     Serial driver.\r
+  @retval EFI_UNSUPPORTED            No interrupt endpoint can be found.\r
+  @retval Other                      This controller cannot be started.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+UsbSerialDriverBindingStart (\r
+  IN EFI_DRIVER_BINDING_PROTOCOL  *This,\r
+  IN EFI_HANDLE                   Controller,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath\r
+  );\r
+\r
+/**\r
+  Stop the USB Serial device handled by this driver.\r
+\r
+  @param  This[in]                   The USB Serial driver binding protocol.\r
+  @param  Controller[in]             The controller to release.\r
+  @param  NumberOfChildren[in]       The number of handles in ChildHandleBuffer.\r
+  @param  ChildHandleBuffer[in]      The array of child handle.\r
+\r
+  @retval EFI_SUCCESS                The device was stopped.\r
+  @retval EFI_UNSUPPORTED            Simple Text In Protocol or Simple Text In Ex\r
+                                     Protocol is not installed on Controller.\r
+  @retval EFI_DEVICE_ERROR           The device could not be stopped due to a\r
+                                     device error.\r
+  @retval Others                     Fail to uninstall protocols attached on the\r
+                                     device.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+UsbSerialDriverBindingStop (\r
+  IN  EFI_DRIVER_BINDING_PROTOCOL  *This,\r
+  IN  EFI_HANDLE                   Controller,\r
+  IN  UINTN                        NumberOfChildren,\r
+  IN  EFI_HANDLE                   *ChildHandleBuffer\r
+  );\r
+\r
+//\r
+// Serial IO Member Functions\r
+//\r
+\r
+/**\r
+  Writes data to a serial device.\r
+\r
+  @param  This[in]                   Protocol instance pointer.\r
+  @param  BufferSize[in, out]        On input, the size of the Buffer. On output,\r
+                                     the amount of data actually written.\r
+  @param  Buffer[in]                 The buffer of data to write\r
+\r
+  @retval EFI_SUCCESS                The data was written.\r
+  @retval EFI_DEVICE_ERROR           The device reported an error.\r
+  @retval EFI_TIMEOUT                The data write was stopped due to a timeout.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+WriteSerialIo (\r
+  IN EFI_SERIAL_IO_PROTOCOL  *This,\r
+  IN OUT UINTN               *BufferSize,\r
+  IN VOID                    *Buffer\r
+  );\r
+\r
+/**\r
+  Reads data from a serial device.\r
+\r
+  @param  This[in]                   Protocol instance pointer.\r
+  @param  BufferSize[in, out]        On input, the size of the Buffer. On output,\r
+                                     the amount of data returned in Buffer.\r
+  @param  Buffer[out]                The buffer to return the data into.\r
+\r
+  @retval EFI_SUCCESS                The data was read.\r
+  @retval EFI_DEVICE_ERROR           The device reported an error.\r
+  @retval EFI_TIMEOUT                The data write was stopped due to a timeout.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+ReadSerialIo (\r
+  IN EFI_SERIAL_IO_PROTOCOL  *This,\r
+  IN OUT UINTN               *BufferSize,\r
+  OUT VOID                   *Buffer\r
+  );\r
+\r
+/**\r
+  Retrieves the status of the control bits on a serial device.\r
+\r
+  @param  This[in]               Protocol instance pointer.\r
+  @param  Control[out]           A pointer to return the current Control signals\r
+                                 from the serial device.\r
+\r
+  @retval EFI_SUCCESS            The control bits were read from the serial\r
+                                 device.\r
+  @retval EFI_DEVICE_ERROR       The serial device is not functioning correctly.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetControlBits (\r
+  IN EFI_SERIAL_IO_PROTOCOL  *This,\r
+  OUT UINT32                 *Control\r
+  );\r
+\r
+/**\r
+  Set the control bits on a serial device.\r
+\r
+  @param  This[in]             Protocol instance pointer.\r
+  @param  Control[in]          Set the bits of Control that are settable.\r
+\r
+  @retval EFI_SUCCESS          The new control bits were set on the serial device.\r
+  @retval EFI_UNSUPPORTED      The serial device does not support this operation.\r
+  @retval EFI_DEVICE_ERROR     The serial device is not functioning correctly.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SetControlBits (\r
+  IN EFI_SERIAL_IO_PROTOCOL  *This,\r
+  IN UINT32                  Control\r
+  );\r
+\r
+/**\r
+  Calls SetAttributesInternal() to set the baud rate, receive FIFO depth,\r
+  transmit/receice time out, parity, data buts, and stop bits on a serial device.\r
+\r
+  @param  This[in]             Protocol instance pointer.\r
+  @param  BaudRate[in]         The requested baud rate. A BaudRate value of 0\r
+                               will use the device's default interface speed.\r
+  @param  ReveiveFifoDepth[in] The requested depth of the FIFO on the receive\r
+                               side of the serial interface. A ReceiveFifoDepth\r
+                               value of 0 will use the device's default FIFO\r
+                               depth.\r
+  @param  Timeout[in]          The requested time out for a single character in\r
+                               microseconds.This timeout applies to both the\r
+                               transmit and receive side of the interface.A\r
+                               Timeout value of 0 will use the device's default\r
+                               time out value.\r
+  @param  Parity[in]           The type of parity to use on this serial device.A\r
+                               Parity value of DefaultParity will use the\r
+                               device's default parity value.\r
+  @param  DataBits[in]         The number of data bits to use on the serial\r
+                               device. A DataBits value of 0 will use the\r
+                               device's default data bit setting.\r
+  @param  StopBits[in]         The number of stop bits to use on this serial\r
+                               device. A StopBits value of DefaultStopBits will\r
+                               use the device's default number of stop bits.\r
+\r
+  @retval EFI_SUCCESS          The attributes were set\r
+  @retval EFI_DEVICE_ERROR     The attributes were not able to be\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SetAttributes (\r
+  IN EFI_SERIAL_IO_PROTOCOL  *This,\r
+  IN UINT64                  BaudRate,\r
+  IN UINT32                  ReceiveFifoDepth,\r
+  IN UINT32                  Timeout,\r
+  IN EFI_PARITY_TYPE         Parity,\r
+  IN UINT8                   DataBits,\r
+  IN EFI_STOP_BITS_TYPE      StopBits\r
+  );\r
+\r
+/**\r
+  Reset the serial device.\r
+\r
+  @param  This              Protocol instance pointer.\r
+\r
+  @retval EFI_SUCCESS       The device was reset.\r
+  @retval EFI_DEVICE_ERROR  The serial device could not be reset.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SerialReset (\r
+  IN EFI_SERIAL_IO_PROTOCOL  *This\r
+  );\r
+\r
+//\r
+// EFI Component Name Functions\r
+//\r
+\r
+/**\r
+  Retrieves a Unicode string that is the user readable name of the driver.\r
+\r
+  This function retrieves the user readable name of a driver in the form of a\r
+  Unicode string. If the driver specified by This has a user readable name in\r
+  the language specified by Language, then a pointer to the driver name is\r
+  returned in DriverName, and EFI_SUCCESS is returned. If the driver specified\r
+  by This does not support the language specified by Language,\r
+  then EFI_UNSUPPORTED is returned.\r
+\r
+  @param  This[in]                   A pointer to the EFI_COMPONENT_NAME2_PROTOCOL\r
+                                     or EFI_COMPONENT_NAME_PROTOCOL instance.\r
+  @param  Language[in]               A pointer to a Null-terminated ASCII string\r
+                                     array indicating the language. This is the\r
+                                     language of the driver name that the caller\r
+                                     is requesting, and it must match one of the\r
+                                     languages specified in SupportedLanguages.\r
+                                     The number of languages supported by a\r
+                                     driver is up to the driver writer. Language\r
+                                     is specified in RFC 4646 or ISO 639-2\r
+                                     language code format.\r
+  @param  DriverName[out]            A pointer to the Unicode string to return.\r
+                                     This Unicode string is the name of the\r
+                                     driver specified by This in the language\r
+                                     specified by Language.\r
+\r
+  @retval EFI_SUCCESS                The Unicode string for the Driver specified\r
+                                     by This and the language specified by\r
+                                     Language was returned in DriverName.\r
+  @retval EFI_INVALID_PARAMETER      Language is NULL.\r
+  @retval EFI_INVALID_PARAMETER      DriverName is NULL.\r
+  @retval EFI_UNSUPPORTED            The driver specified by This does not\r
+                                     support the language specified by Language.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+UsbSerialComponentNameGetDriverName (\r
+  IN  EFI_COMPONENT_NAME2_PROTOCOL  *This,\r
+  IN  CHAR8                         *Language,\r
+  OUT CHAR16                        **DriverName\r
+  );\r
+\r
+/**\r
+  Retrieves a Unicode string that is the user readable name of the controller\r
+  that is being managed by a driver.\r
+\r
+  This function retrieves the user readable name of the controller specified by\r
+  ControllerHandle and ChildHandle in the form of a Unicode string. If the\r
+  driver specified by This has a user readable name in the language specified by\r
+  Language, then a pointer to the controller name is returned in ControllerName,\r
+  and EFI_SUCCESS is returned.  If the driver specified by This is not currently\r
+  managing the controller specified by ControllerHandle and ChildHandle,\r
+  then EFI_UNSUPPORTED is returned.  If the driver specified by This does not\r
+  support the language specified by Language, then EFI_UNSUPPORTED is returned.\r
+\r
+  @param  This[in]                   A pointer to the EFI_COMPONENT_NAME2_PROTOCOL\r
+                                     or EFI_COMPONENT_NAME_PROTOCOL instance.\r
+  @param  ControllerHandle[in]       The handle of a controller that the driver\r
+                                     specified by This is managing.  This handle\r
+                                     specifies the controller whose name is to\r
+                                     be returned.\r
+  @param  ChildHandle[in]            The handle of the child controller to\r
+                                     retrieve the name of. This is an optional\r
+                                     parameter that may be NULL. It will be NULL\r
+                                     for device drivers. It will also be NULL\r
+                                     for a bus drivers that wish to retrieve the\r
+                                     name of the bus controller. It will not be\r
+                                     NULL for a bus driver that wishes to\r
+                                     retrieve the name of a child controller.\r
+  @param  Language[in]               A pointer to a Null-terminated ASCII string\r
+                                     array indicating the language.  This is the\r
+                                     language of the driver name that the caller\r
+                                     is requesting, and it must match one of the\r
+                                     languages specified in SupportedLanguages.\r
+                                     The number of languages supported by a\r
+                                     driver is up to the driver writer. Language\r
+                                     is specified in RFC 4646 or ISO 639-2\r
+                                     language code format.\r
+  @param  ControllerName[out]        A pointer to the Unicode string to return.\r
+                                     This Unicode string is the name of the\r
+                                     controller specified by ControllerHandle\r
+                                     and ChildHandle in the language specified\r
+                                     by Language from the point of view of the\r
+                                     driver specified by This.\r
+\r
+  @retval EFI_SUCCESS                The Unicode string for the user readable\r
+                                     name in the language specified by Language\r
+                                     for the driver specified by This was\r
+                                     returned in DriverName.\r
+  @retval EFI_INVALID_PARAMETER      ControllerHandle is not a valid EFI_HANDLE.\r
+  @retval EFI_INVALID_PARAMETER      ChildHandle is not NULL and it is not a\r
+                                     valid EFI_HANDLE.\r
+  @retval EFI_INVALID_PARAMETER      Language is NULL.\r
+  @retval EFI_INVALID_PARAMETER      ControllerName is NULL.\r
+  @retval EFI_UNSUPPORTED            The driver specified by This is not\r
+                                     currently managing the controller specified\r
+                                     by ControllerHandle and ChildHandle.\r
+  @retval EFI_UNSUPPORTED            The driver specified by This does not\r
+                                     support the language specified by Language.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+UsbSerialComponentNameGetControllerName (\r
+  IN  EFI_COMPONENT_NAME2_PROTOCOL  *This,\r
+  IN  EFI_HANDLE                    ControllerHandle,\r
+  IN  EFI_HANDLE                    ChildHandle      OPTIONAL,\r
+  IN  CHAR8                         *Language,\r
+  OUT CHAR16                        **ControllerName\r
+  );\r
+\r
+#endif\r