mirror of https://github.com/acidanthera/audk.git
OptionRomPkg: Added bus driver for FTDI USB to serial adapters
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ashley DeSimone <ashley.e.desimone@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14817 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
5b5cd144f3
commit
3f1484f6f7
|
@ -0,0 +1,5 @@
|
|||
The following devices have been confirmed to work with the USB Serial Driver:
|
||||
|
||||
Brand Model Name Product Name Vendor ID Device ID
|
||||
Gearmo USA_FTDI-36 USB to RS-232 0x0403 0x6001
|
||||
Sabrent CB-FTDI 0x0403 0x6001
|
|
@ -0,0 +1,224 @@
|
|||
/** @file
|
||||
UEFI Component Name(2) protocol implementation for USB Serial driver.
|
||||
|
||||
Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD
|
||||
License which accompanies this distribution. The full text of the license may
|
||||
be found at http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include "FtdiUsbSerialDriver.h"
|
||||
|
||||
//
|
||||
// EFI Component Name Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gUsbSerialComponentName = {
|
||||
(EFI_COMPONENT_NAME_GET_DRIVER_NAME) UsbSerialComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME_GET_CONTROLLER_NAME) UsbSerialComponentNameGetControllerName,
|
||||
"eng"
|
||||
};
|
||||
|
||||
//
|
||||
// EFI Component Name 2 Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gUsbSerialComponentName2 = {
|
||||
UsbSerialComponentNameGetDriverName,
|
||||
UsbSerialComponentNameGetControllerName,
|
||||
"en"
|
||||
};
|
||||
|
||||
//
|
||||
// Driver name string table
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mUsbSerialDriverNameTable[] = {
|
||||
{ "eng;en", L"FTDI-232 USB Serial Driver" },
|
||||
{ NULL , NULL }
|
||||
};
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the driver.
|
||||
|
||||
This function retrieves the user readable name of a driver in the form of a
|
||||
Unicode string. If the driver specified by This has a user readable name in
|
||||
the language specified by Language, then a pointer to the driver name is
|
||||
returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
|
||||
by This does not support the language specified by Language,
|
||||
then EFI_UNSUPPORTED is returned.
|
||||
|
||||
@param This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
|
||||
EFI_COMPONENT_NAME_PROTOCOL instance.
|
||||
@param Language A pointer to a Null-terminated ASCII string
|
||||
array indicating the language. This is the
|
||||
language of the driver name that the caller is
|
||||
requesting, and it must match one of the
|
||||
languages specified in SupportedLanguages. The
|
||||
number of languages supported by a driver is up
|
||||
to the driver writer. Language is specified
|
||||
in RFC 4646 or ISO 639-2 language code format.
|
||||
@param DriverName A pointer to the Unicode string to return.
|
||||
This Unicode string is the name of the
|
||||
driver specified by This in the language
|
||||
specified by Language.
|
||||
|
||||
@retval EFI_SUCCESS The Unicode string for the Driver specified by
|
||||
This and the language specified by Language was
|
||||
returned in DriverName.
|
||||
@retval EFI_INVALID_PARAMETER Language is NULL.
|
||||
@retval EFI_INVALID_PARAMETER DriverName is NULL.
|
||||
@retval EFI_UNSUPPORTED The driver specified by This does not support
|
||||
the language specified by Language.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
UsbSerialComponentNameGetDriverName (
|
||||
IN EFI_COMPONENT_NAME2_PROTOCOL *This,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **DriverName
|
||||
)
|
||||
{
|
||||
return LookupUnicodeString2 (
|
||||
Language,
|
||||
This->SupportedLanguages,
|
||||
mUsbSerialDriverNameTable,
|
||||
DriverName,
|
||||
(BOOLEAN)(This == &gUsbSerialComponentName2)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the controller
|
||||
that is being managed by a driver.
|
||||
|
||||
This function retrieves the user readable name of the controller specified by
|
||||
ControllerHandle and ChildHandle in the form of a Unicode string. If the
|
||||
driver specified by This has a user readable name in the language specified by
|
||||
Language, then a pointer to the controller name is returned in ControllerName,
|
||||
and EFI_SUCCESS is returned. If the driver specified by This is not currently
|
||||
managing the controller specified by ControllerHandle and ChildHandle,
|
||||
then EFI_UNSUPPORTED is returned. If the driver specified by This does not
|
||||
support the language specified by Language, then EFI_UNSUPPORTED is returned.
|
||||
|
||||
@param This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
|
||||
EFI_COMPONENT_NAME_PROTOCOL instance.
|
||||
@param ControllerHandle The handle of a controller that the driver
|
||||
specified by This is managing. This handle
|
||||
specifies the controller whose name is to be
|
||||
returned.
|
||||
@param ChildHandle The handle of the child controller to retrieve
|
||||
the name of. This is an optional parameter that
|
||||
may be NULL. It will be NULL for device
|
||||
drivers. It will also be NULL for a bus drivers
|
||||
that wish to retrieve the name of the bus
|
||||
controller. It will not be NULL for a bus
|
||||
driver that wishes to retrieve the name of a
|
||||
child controller.
|
||||
@param Language A pointer to a Null-terminated ASCII string
|
||||
array indicating the language. This is the
|
||||
language of the driver name that the caller is
|
||||
requesting, and it must match one of the
|
||||
languages specified in SupportedLanguages. The
|
||||
number of languages supported by a driver is up
|
||||
to the driver writer. Language is specified in
|
||||
RFC 4646 or ISO 639-2 language code format.
|
||||
@param ControllerName A pointer to the Unicode string to return.
|
||||
This Unicode string is the name of the
|
||||
controller specified by ControllerHandle and
|
||||
ChildHandle in the language specified by
|
||||
Language from the point of view of the driver
|
||||
specified by This.
|
||||
|
||||
@retval EFI_SUCCESS The Unicode string for the user readable name in
|
||||
the language specified by Language for the
|
||||
driver specified by This was returned in
|
||||
DriverName.
|
||||
@retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.
|
||||
@retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
|
||||
EFI_HANDLE.
|
||||
@retval EFI_INVALID_PARAMETER Language is NULL.
|
||||
@retval EFI_INVALID_PARAMETER ControllerName is NULL.
|
||||
@retval EFI_UNSUPPORTED The driver specified by This is not currently
|
||||
managing the controller specified by
|
||||
ControllerHandle and ChildHandle.
|
||||
@retval EFI_UNSUPPORTED The driver specified by This does not support
|
||||
the language specified by Language.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
UsbSerialComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME2_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
USB_SER_DEV *UsbSerDev;
|
||||
EFI_SERIAL_IO_PROTOCOL *SerialIo;
|
||||
EFI_USB_IO_PROTOCOL *UsbIoProtocol;
|
||||
|
||||
//
|
||||
// This is a device driver, so ChildHandle must be NULL.
|
||||
//
|
||||
if (ChildHandle != NULL) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Controller's handle
|
||||
//
|
||||
Status = gBS->OpenProtocol (
|
||||
ControllerHandle,
|
||||
&gEfiUsbIoProtocolGuid,
|
||||
(VOID **) &UsbIoProtocol,
|
||||
gUsbSerialDriverBinding.DriverBindingHandle,
|
||||
ControllerHandle,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
gBS->CloseProtocol (
|
||||
ControllerHandle,
|
||||
&gEfiUsbIoProtocolGuid,
|
||||
gUsbSerialDriverBinding.DriverBindingHandle,
|
||||
ControllerHandle
|
||||
);
|
||||
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
if (Status != EFI_ALREADY_STARTED) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
//
|
||||
// Get the device context
|
||||
//
|
||||
Status = gBS->OpenProtocol (
|
||||
ControllerHandle,
|
||||
&gEfiSerialIoProtocolGuid,
|
||||
(VOID **) &SerialIo,
|
||||
gUsbSerialDriverBinding.DriverBindingHandle,
|
||||
ControllerHandle,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
UsbSerDev = USB_SER_DEV_FROM_THIS (SerialIo);
|
||||
|
||||
return LookupUnicodeString2 (
|
||||
Language,
|
||||
This->SupportedLanguages,
|
||||
UsbSerDev->ControllerNameTable,
|
||||
ControllerName,
|
||||
(BOOLEAN)(This == &gUsbSerialComponentName2)
|
||||
);
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,595 @@
|
|||
/** @file
|
||||
Header file for USB Serial Driver's Data Structures.
|
||||
|
||||
Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.
|
||||
Portions Copyright 2012 Ashley DeSimone
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD
|
||||
License which accompanies this distribution. The full text of the license may
|
||||
be found at http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef _FTDI_USB_SERIAL_DRIVER_H_
|
||||
#define _FTDI_USB_SERIAL_DRIVER_H_
|
||||
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Library/UefiLib.h>
|
||||
#include <Library/DevicePathLib.h>
|
||||
|
||||
#include <Protocol/DevicePath.h>
|
||||
#include <Protocol/UsbIo.h>
|
||||
#include <Protocol/SerialIo.h>
|
||||
|
||||
//
|
||||
// US English LangID
|
||||
//
|
||||
#define USB_US_LANG_ID 0x0409
|
||||
|
||||
//
|
||||
// Supported Vendor Ids
|
||||
//
|
||||
#define VID_FTDI 0x0403
|
||||
|
||||
//
|
||||
// Supported product ids
|
||||
//
|
||||
#define DID_FTDI_FT232 0x6001
|
||||
|
||||
//
|
||||
// FTDI Commands
|
||||
//
|
||||
#define FTDI_COMMAND_RESET_PORT 0
|
||||
#define FTDI_COMMAND_MODEM_CTRL 1
|
||||
#define FTDI_COMMAND_SET_FLOW_CTRL 2
|
||||
#define FTDI_COMMAND_SET_BAUDRATE 3
|
||||
#define FTDI_COMMAND_SET_DATA 4
|
||||
#define FTDI_COMMAND_GET_MODEM_STATUS 5
|
||||
#define FTDI_COMMAND_SET_EVENT_CHAR 6
|
||||
#define FTDI_COMMAND_SET_ERROR_CHAR 7
|
||||
#define FTDI_COMMAND_SET_LATENCY_TIMER 9
|
||||
#define FTDI_COMMAND_GET_LATENCY_TIMER 10
|
||||
|
||||
//
|
||||
// FTDI_PORT_IDENTIFIER
|
||||
// Used in the usb control transfers that issue FTDI commands as the index value.
|
||||
//
|
||||
#define FTDI_PORT_IDENTIFIER 0x1 // For FTDI USB serial adapter the port
|
||||
// identifier is always 1.
|
||||
|
||||
//
|
||||
// RESET_PORT
|
||||
//
|
||||
#define RESET_PORT_RESET 0x0 // Purges RX and TX, clears DTR and RTS sets
|
||||
// flow control to none, disables event
|
||||
// trigger, sets the event char to 0x0d and
|
||||
// does nothing to baudrate or data settings
|
||||
#define RESET_PORT_PURGE_RX 0x1
|
||||
#define RESET_PORT_PURGE_TX 0x2
|
||||
|
||||
//
|
||||
// SET_FLOW_CONTROL
|
||||
//
|
||||
#define NO_FLOW_CTRL 0x0
|
||||
#define XON_XOFF_CTRL 0x4
|
||||
|
||||
//
|
||||
// SET_BAUD_RATE
|
||||
// To set baud rate, one must calculate an encoding of the baud rate from
|
||||
// UINT32 to UINT16.See EncodeBaudRateForFtdi() for details
|
||||
//
|
||||
#define FTDI_UART_FREQUENCY 3000000
|
||||
#define FTDI_MIN_DIVISOR 0x20
|
||||
#define FTDI_MAX_DIVISOR 0x3FFF8
|
||||
//
|
||||
// Special case baudrate values
|
||||
// 300,000 and 200,000 are special cases for calculating the encoded baudrate
|
||||
//
|
||||
#define FTDI_SPECIAL_CASE_300_MIN (3000000 * 100) / 103 // minimum adjusted
|
||||
// value for 300,000
|
||||
#define FTDI_SPECIAL_CASE_300_MAX (3000000 * 100) / 97 // maximum adjusted
|
||||
// value for 300,000
|
||||
#define FTDI_SPECIAL_CASE_200_MIN (2000000 * 100) / 103 // minimum adjusted
|
||||
// value for 200,000
|
||||
#define FTDI_SPECIAL_CASE_200_MAX (2000000 * 100) / 97 // maximum adjusted
|
||||
// value for 200,000
|
||||
//
|
||||
// Min and max frequency values that the FTDI chip can attain
|
||||
//.all generated frequencies must be between these values
|
||||
//
|
||||
#define FTDI_MIN_FREQUENCY 46601941 // (3MHz * 1600) / 103 = 46601941
|
||||
#define FTDI_MAX_FREQUENCY 49484536 // (3MHz * 1600) / 97 = 49484536
|
||||
|
||||
//
|
||||
// SET_DATA_BITS
|
||||
//
|
||||
#define SET_DATA_BITS(n) (n)
|
||||
|
||||
//
|
||||
// SET_PARITY
|
||||
//
|
||||
#define SET_PARITY_NONE 0x0
|
||||
#define SET_PARITY_ODD BIT8 // (0x1 << 8)
|
||||
#define SET_PARITY_EVEN BIT9 // (0x2 << 8)
|
||||
#define SET_PARITY_MARK BIT9 | BIT8 // (0x3 << 8)
|
||||
#define SET_PARITY_SPACE BIT10 // (0x4 << 8)
|
||||
|
||||
//
|
||||
// SET_STOP_BITS
|
||||
//
|
||||
#define SET_STOP_BITS_1 0x0
|
||||
#define SET_STOP_BITS_15 BIT11 // (0x1 << 11)
|
||||
#define SET_STOP_BITS_2 BIT12 // (0x2 << 11)
|
||||
|
||||
//
|
||||
// SET_MODEM_CTRL
|
||||
// SET_DTR_HIGH = (1 | (1 << 8)), SET_DTR_LOW = (0 | (1 << 8)
|
||||
// SET_RTS_HIGH = (2 | (2 << 8)), SET_RTS_LOW = (0 | (2 << 8)
|
||||
//
|
||||
#define SET_DTR_HIGH (BIT8 | BIT0)
|
||||
#define SET_DTR_LOW (BIT8)
|
||||
#define SET_RTS_HIGH (BIT9 | BIT1)
|
||||
#define SET_RTS_LOW (BIT9)
|
||||
|
||||
//
|
||||
// MODEM_STATUS
|
||||
//
|
||||
#define CTS_MASK BIT4
|
||||
#define DSR_MASK BIT5
|
||||
#define RI_MASK BIT6
|
||||
#define SD_MASK BIT7
|
||||
#define MSR_MASK (CTS_MASK | DSR_MASK | RI_MASK | SD_MASK)
|
||||
|
||||
//
|
||||
// Macro used to check for USB transfer errors
|
||||
//
|
||||
#define USB_IS_ERROR(Result, Error) (((Result) & (Error)) != 0)
|
||||
|
||||
//
|
||||
// USB request timeouts
|
||||
//
|
||||
#define WDR_TIMEOUT 5000 // default urb timeout in ms
|
||||
#define WDR_SHORT_TIMEOUT 1000 // shorter urb timeout in ms
|
||||
|
||||
//
|
||||
// FTDI timeout
|
||||
//
|
||||
#define FTDI_TIMEOUT 16
|
||||
|
||||
//
|
||||
// FTDI FIFO depth
|
||||
//
|
||||
#define FTDI_MAX_RECEIVE_FIFO_DEPTH 384
|
||||
|
||||
//
|
||||
// FTDI Endpoint Descriptors
|
||||
//
|
||||
#define FTDI_ENDPOINT_ADDRESS_IN 0x81 //the endpoint address for the in enpoint generated by the device
|
||||
#define FTDI_ENDPOINT_ADDRESS_OUT 0x02 //the endpoint address for the out endpoint generated by the device
|
||||
|
||||
//
|
||||
// Max buffer size for USB transfers
|
||||
//
|
||||
#define SW_FIFO_DEPTH 1024
|
||||
|
||||
//
|
||||
// struct to define a usb device as a vendor and product id pair
|
||||
//
|
||||
typedef struct {
|
||||
UINTN VendorId;
|
||||
UINTN DeviceId;
|
||||
} USB_DEVICE;
|
||||
|
||||
//
|
||||
//struct to describe the control bits of the device
|
||||
//true indicates enabled
|
||||
//false indicates disabled
|
||||
//
|
||||
typedef struct {
|
||||
BOOLEAN HardwareFlowControl;
|
||||
BOOLEAN DtrState;
|
||||
BOOLEAN RtsState;
|
||||
BOOLEAN HardwareLoopBack;
|
||||
BOOLEAN SoftwareLoopBack;
|
||||
} CONTROL_BITS;
|
||||
|
||||
//
|
||||
//struct to describe the status bits of the device
|
||||
//true indicates enabled
|
||||
//false indicated disabled
|
||||
//
|
||||
typedef struct {
|
||||
BOOLEAN CtsState;
|
||||
BOOLEAN DsrState;
|
||||
BOOLEAN RiState;
|
||||
BOOLEAN SdState;
|
||||
} STATUS_BITS;
|
||||
|
||||
//
|
||||
// Structure to describe the last attributes of the Usb Serial device
|
||||
//
|
||||
typedef struct {
|
||||
UINT64 BaudRate;
|
||||
UINT32 ReceiveFifoDepth;
|
||||
UINT32 Timeout;
|
||||
EFI_PARITY_TYPE Parity;
|
||||
UINT8 DataBits;
|
||||
EFI_STOP_BITS_TYPE StopBits;
|
||||
} PREVIOUS_ATTRIBUTES;
|
||||
|
||||
//
|
||||
// Structure to describe USB serial device
|
||||
//
|
||||
#define USB_SER_DEV_SIGNATURE SIGNATURE_32 ('u', 's', 'b', 's')
|
||||
|
||||
typedef struct {
|
||||
UINTN Signature;
|
||||
EFI_HANDLE ControllerHandle;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
UART_DEVICE_PATH UartDevicePath;
|
||||
UART_FLOW_CONTROL_DEVICE_PATH FlowControlDevicePath;
|
||||
EFI_USB_IO_PROTOCOL *UsbIo;
|
||||
EFI_USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
|
||||
EFI_USB_ENDPOINT_DESCRIPTOR InEndpointDescriptor;
|
||||
EFI_USB_ENDPOINT_DESCRIPTOR OutEndpointDescriptor;
|
||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||
UINT32 DataBufferHead;
|
||||
UINT32 DataBufferTail;
|
||||
UINT8 *DataBuffer;
|
||||
EFI_SERIAL_IO_PROTOCOL SerialIo;
|
||||
BOOLEAN Shutdown;
|
||||
EFI_EVENT PollingLoop;
|
||||
UINT32 ControlBits;
|
||||
PREVIOUS_ATTRIBUTES LastSettings;
|
||||
CONTROL_BITS ControlValues;
|
||||
STATUS_BITS StatusValues;
|
||||
UINT8 ReadBuffer[512];
|
||||
} USB_SER_DEV;
|
||||
|
||||
#define USB_SER_DEV_FROM_THIS(a) \
|
||||
CR(a, USB_SER_DEV, SerialIo, USB_SER_DEV_SIGNATURE)
|
||||
|
||||
//
|
||||
// Global Variables
|
||||
//
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gUsbSerialDriverBinding;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gUsbSerialComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gUsbSerialComponentName2;
|
||||
|
||||
//
|
||||
// Functions of Driver Binding Protocol
|
||||
//
|
||||
/**
|
||||
Check whether USB Serial driver supports this device.
|
||||
|
||||
@param This[in] The USB Serial driver binding protocol.
|
||||
@param Controller[in] The controller handle to check.
|
||||
@param RemainingDevicePath[in] The remaining device path.
|
||||
|
||||
@retval EFI_SUCCESS The driver supports this controller.
|
||||
@retval other This device isn't supported.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
UsbSerialDriverBindingSupported (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
Starts the Serial device with this driver.
|
||||
|
||||
This function produces Serial IO Protocol and initializes the USB
|
||||
Serial device to manage this USB Serial device.
|
||||
|
||||
@param This[in] The USB Serial driver binding instance.
|
||||
@param Controller[in] Handle of device to bind driver to.
|
||||
@param RemainingDevicePath[in] Optional parameter use to pick a specific
|
||||
child device to start.
|
||||
|
||||
@retval EFI_SUCCESS The controller is controlled by the USB
|
||||
Serial driver.
|
||||
@retval EFI_UNSUPPORTED No interrupt endpoint can be found.
|
||||
@retval Other This controller cannot be started.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
UsbSerialDriverBindingStart (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
Stop the USB Serial device handled by this driver.
|
||||
|
||||
@param This[in] The USB Serial driver binding protocol.
|
||||
@param Controller[in] The controller to release.
|
||||
@param NumberOfChildren[in] The number of handles in ChildHandleBuffer.
|
||||
@param ChildHandleBuffer[in] The array of child handle.
|
||||
|
||||
@retval EFI_SUCCESS The device was stopped.
|
||||
@retval EFI_UNSUPPORTED Simple Text In Protocol or Simple Text In Ex
|
||||
Protocol is not installed on Controller.
|
||||
@retval EFI_DEVICE_ERROR The device could not be stopped due to a
|
||||
device error.
|
||||
@retval Others Fail to uninstall protocols attached on the
|
||||
device.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
UsbSerialDriverBindingStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
);
|
||||
|
||||
//
|
||||
// Serial IO Member Functions
|
||||
//
|
||||
|
||||
/**
|
||||
Writes data to a serial device.
|
||||
|
||||
@param This[in] Protocol instance pointer.
|
||||
@param BufferSize[in, out] On input, the size of the Buffer. On output,
|
||||
the amount of data actually written.
|
||||
@param Buffer[in] The buffer of data to write
|
||||
|
||||
@retval EFI_SUCCESS The data was written.
|
||||
@retval EFI_DEVICE_ERROR The device reported an error.
|
||||
@retval EFI_TIMEOUT The data write was stopped due to a timeout.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
WriteSerialIo (
|
||||
IN EFI_SERIAL_IO_PROTOCOL *This,
|
||||
IN OUT UINTN *BufferSize,
|
||||
IN VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
Reads data from a serial device.
|
||||
|
||||
@param This[in] Protocol instance pointer.
|
||||
@param BufferSize[in, out] On input, the size of the Buffer. On output,
|
||||
the amount of data returned in Buffer.
|
||||
@param Buffer[out] The buffer to return the data into.
|
||||
|
||||
@retval EFI_SUCCESS The data was read.
|
||||
@retval EFI_DEVICE_ERROR The device reported an error.
|
||||
@retval EFI_TIMEOUT The data write was stopped due to a timeout.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ReadSerialIo (
|
||||
IN EFI_SERIAL_IO_PROTOCOL *This,
|
||||
IN OUT UINTN *BufferSize,
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
Retrieves the status of the control bits on a serial device.
|
||||
|
||||
@param This[in] Protocol instance pointer.
|
||||
@param Control[out] A pointer to return the current Control signals
|
||||
from the serial device.
|
||||
|
||||
@retval EFI_SUCCESS The control bits were read from the serial
|
||||
device.
|
||||
@retval EFI_DEVICE_ERROR The serial device is not functioning correctly.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GetControlBits (
|
||||
IN EFI_SERIAL_IO_PROTOCOL *This,
|
||||
OUT UINT32 *Control
|
||||
);
|
||||
|
||||
/**
|
||||
Set the control bits on a serial device.
|
||||
|
||||
@param This[in] Protocol instance pointer.
|
||||
@param Control[in] Set the bits of Control that are settable.
|
||||
|
||||
@retval EFI_SUCCESS The new control bits were set on the serial device.
|
||||
@retval EFI_UNSUPPORTED The serial device does not support this operation.
|
||||
@retval EFI_DEVICE_ERROR The serial device is not functioning correctly.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SetControlBits (
|
||||
IN EFI_SERIAL_IO_PROTOCOL *This,
|
||||
IN UINT32 Control
|
||||
);
|
||||
|
||||
/**
|
||||
Calls SetAttributesInternal() to set the baud rate, receive FIFO depth,
|
||||
transmit/receice time out, parity, data buts, and stop bits on a serial device.
|
||||
|
||||
@param This[in] Protocol instance pointer.
|
||||
@param BaudRate[in] The requested baud rate. A BaudRate value of 0
|
||||
will use the device's default interface speed.
|
||||
@param ReveiveFifoDepth[in] The requested depth of the FIFO on the receive
|
||||
side of the serial interface. A ReceiveFifoDepth
|
||||
value of 0 will use the device's default FIFO
|
||||
depth.
|
||||
@param Timeout[in] The requested time out for a single character in
|
||||
microseconds.This timeout applies to both the
|
||||
transmit and receive side of the interface.A
|
||||
Timeout value of 0 will use the device's default
|
||||
time out value.
|
||||
@param Parity[in] The type of parity to use on this serial device.A
|
||||
Parity value of DefaultParity will use the
|
||||
device's default parity value.
|
||||
@param DataBits[in] The number of data bits to use on the serial
|
||||
device. A DataBits value of 0 will use the
|
||||
device's default data bit setting.
|
||||
@param StopBits[in] The number of stop bits to use on this serial
|
||||
device. A StopBits value of DefaultStopBits will
|
||||
use the device's default number of stop bits.
|
||||
|
||||
@retval EFI_SUCCESS The attributes were set
|
||||
@retval EFI_DEVICE_ERROR The attributes were not able to be
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SetAttributes (
|
||||
IN EFI_SERIAL_IO_PROTOCOL *This,
|
||||
IN UINT64 BaudRate,
|
||||
IN UINT32 ReceiveFifoDepth,
|
||||
IN UINT32 Timeout,
|
||||
IN EFI_PARITY_TYPE Parity,
|
||||
IN UINT8 DataBits,
|
||||
IN EFI_STOP_BITS_TYPE StopBits
|
||||
);
|
||||
|
||||
/**
|
||||
Reset the serial device.
|
||||
|
||||
@param This Protocol instance pointer.
|
||||
|
||||
@retval EFI_SUCCESS The device was reset.
|
||||
@retval EFI_DEVICE_ERROR The serial device could not be reset.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SerialReset (
|
||||
IN EFI_SERIAL_IO_PROTOCOL *This
|
||||
);
|
||||
|
||||
//
|
||||
// EFI Component Name Functions
|
||||
//
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the driver.
|
||||
|
||||
This function retrieves the user readable name of a driver in the form of a
|
||||
Unicode string. If the driver specified by This has a user readable name in
|
||||
the language specified by Language, then a pointer to the driver name is
|
||||
returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
|
||||
by This does not support the language specified by Language,
|
||||
then EFI_UNSUPPORTED is returned.
|
||||
|
||||
@param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL
|
||||
or EFI_COMPONENT_NAME_PROTOCOL instance.
|
||||
@param Language[in] A pointer to a Null-terminated ASCII string
|
||||
array indicating the language. This is the
|
||||
language of the driver name that the caller
|
||||
is requesting, and it must match one of the
|
||||
languages specified in SupportedLanguages.
|
||||
The number of languages supported by a
|
||||
driver is up to the driver writer. Language
|
||||
is specified in RFC 4646 or ISO 639-2
|
||||
language code format.
|
||||
@param DriverName[out] A pointer to the Unicode string to return.
|
||||
This Unicode string is the name of the
|
||||
driver specified by This in the language
|
||||
specified by Language.
|
||||
|
||||
@retval EFI_SUCCESS The Unicode string for the Driver specified
|
||||
by This and the language specified by
|
||||
Language was returned in DriverName.
|
||||
@retval EFI_INVALID_PARAMETER Language is NULL.
|
||||
@retval EFI_INVALID_PARAMETER DriverName is NULL.
|
||||
@retval EFI_UNSUPPORTED The driver specified by This does not
|
||||
support the language specified by Language.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
UsbSerialComponentNameGetDriverName (
|
||||
IN EFI_COMPONENT_NAME2_PROTOCOL *This,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **DriverName
|
||||
);
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the controller
|
||||
that is being managed by a driver.
|
||||
|
||||
This function retrieves the user readable name of the controller specified by
|
||||
ControllerHandle and ChildHandle in the form of a Unicode string. If the
|
||||
driver specified by This has a user readable name in the language specified by
|
||||
Language, then a pointer to the controller name is returned in ControllerName,
|
||||
and EFI_SUCCESS is returned. If the driver specified by This is not currently
|
||||
managing the controller specified by ControllerHandle and ChildHandle,
|
||||
then EFI_UNSUPPORTED is returned. If the driver specified by This does not
|
||||
support the language specified by Language, then EFI_UNSUPPORTED is returned.
|
||||
|
||||
@param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL
|
||||
or EFI_COMPONENT_NAME_PROTOCOL instance.
|
||||
@param ControllerHandle[in] The handle of a controller that the driver
|
||||
specified by This is managing. This handle
|
||||
specifies the controller whose name is to
|
||||
be returned.
|
||||
@param ChildHandle[in] The handle of the child controller to
|
||||
retrieve the name of. This is an optional
|
||||
parameter that may be NULL. It will be NULL
|
||||
for device drivers. It will also be NULL
|
||||
for a bus drivers that wish to retrieve the
|
||||
name of the bus controller. It will not be
|
||||
NULL for a bus driver that wishes to
|
||||
retrieve the name of a child controller.
|
||||
@param Language[in] A pointer to a Null-terminated ASCII string
|
||||
array indicating the language. This is the
|
||||
language of the driver name that the caller
|
||||
is requesting, and it must match one of the
|
||||
languages specified in SupportedLanguages.
|
||||
The number of languages supported by a
|
||||
driver is up to the driver writer. Language
|
||||
is specified in RFC 4646 or ISO 639-2
|
||||
language code format.
|
||||
@param ControllerName[out] A pointer to the Unicode string to return.
|
||||
This Unicode string is the name of the
|
||||
controller specified by ControllerHandle
|
||||
and ChildHandle in the language specified
|
||||
by Language from the point of view of the
|
||||
driver specified by This.
|
||||
|
||||
@retval EFI_SUCCESS The Unicode string for the user readable
|
||||
name in the language specified by Language
|
||||
for the driver specified by This was
|
||||
returned in DriverName.
|
||||
@retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.
|
||||
@retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a
|
||||
valid EFI_HANDLE.
|
||||
@retval EFI_INVALID_PARAMETER Language is NULL.
|
||||
@retval EFI_INVALID_PARAMETER ControllerName is NULL.
|
||||
@retval EFI_UNSUPPORTED The driver specified by This is not
|
||||
currently managing the controller specified
|
||||
by ControllerHandle and ChildHandle.
|
||||
@retval EFI_UNSUPPORTED The driver specified by This does not
|
||||
support the language specified by Language.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
UsbSerialComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME2_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,61 @@
|
|||
## @file
|
||||
# USB Serial Driver that manages USB Serial device and produces Serial IO
|
||||
# Protocol.
|
||||
#
|
||||
# USB Serial Driver consumes USB I/O Protocol and Device Path Protocol, and
|
||||
# produces Serial IO Protocol on USB Serial devices.
|
||||
# It manages the USB Serial device via USB Bulk Transfer of USB I/O Protocol.
|
||||
# This module refers to following specifications:
|
||||
# 1. UEFI Specification, v2.1
|
||||
#
|
||||
# Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
#
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD
|
||||
# License which accompanies this distribution. The full text of the license may
|
||||
# be found at http://opensource.org/licenses/bsd-license.php
|
||||
#
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = FtdiUsbSerialDxe
|
||||
FILE_GUID = A8154B55-2021-4D40-AE81-2E23A02dCC46
|
||||
MODULE_TYPE = UEFI_DRIVER
|
||||
VERSION_STRING = 1.0
|
||||
ENTRY_POINT = FtdiUsbSerialEntryPoint
|
||||
UNLOAD_IMAGE = FtdiUsbSerialUnload
|
||||
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
FtdiUsbSerialDriver.c
|
||||
FtdiUsbSerialDriver.h
|
||||
ComponentName.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
UefiDriverEntryPoint
|
||||
BaseMemoryLib
|
||||
DebugLib
|
||||
MemoryAllocationLib
|
||||
UefiBootServicesTableLib
|
||||
UefiLib
|
||||
DevicePathLib
|
||||
|
||||
[Guids]
|
||||
gEfiUartDevicePathGuid
|
||||
|
||||
[Protocols]
|
||||
## TO_START
|
||||
## BY_START
|
||||
gEfiDevicePathProtocolGuid
|
||||
gEfiUsbIoProtocolGuid ## TO_START
|
||||
gEfiSerialIoProtocolGuid ## BY_START
|
|
@ -0,0 +1,32 @@
|
|||
|
||||
=== FTDI USB SERIAL OVERVIEW ===
|
||||
|
||||
This is a bus driver that enables the EfiSerialIoProtocol interface
|
||||
for FTDI8U232AM based USB-to-Serial adapters.
|
||||
|
||||
=== STATUS ===
|
||||
|
||||
Serial Input: Functional on real hardware.
|
||||
Serial Output: Functional on real hardware.
|
||||
|
||||
Operating Modes: Currently the user is able to change all operating modes
|
||||
except timeout and FIFO depth.
|
||||
The default operating mode is:
|
||||
Baudrate: 115200
|
||||
Parity: None
|
||||
Flow Control: None
|
||||
Data Bits: 8
|
||||
Stop Bits: 1
|
||||
Notes:
|
||||
Data Bits setting of 6,7,8 can not be combined with a Stop Bits setting of 1.5
|
||||
|
||||
At baudrates less than 9600 some of the characters may be transmitted incorrectly.
|
||||
|
||||
=== COMPATIBILITY ===
|
||||
|
||||
Tested with:
|
||||
An FTDI8U232AM based USB-To-Serial adapter, the UEFI Shell, and the SerialTest application
|
||||
using a PuTTY Terminal
|
||||
|
||||
See CompatibleDevices.txt for a list of devices which have been confirmed to work with this
|
||||
driver.
|
|
@ -104,6 +104,7 @@
|
|||
OptionRomPkg/AtapiPassThruDxe/AtapiPassThruDxe.inf
|
||||
OptionRomPkg/CirrusLogic5430Dxe/CirrusLogic5430Dxe.inf
|
||||
OptionRomPkg/UndiRuntimeDxe/UndiRuntimeDxe.inf
|
||||
OptionRomPkg/Usb/FtdiUsbSerialDxe/FtdiUsbSerialDxe.inf
|
||||
|
||||
[Components.IA32, Components.X64, Components.IPF]
|
||||
OptionRomPkg/Application/BltLibSample/BltLibSample.inf
|
||||
|
|
Loading…
Reference in New Issue