mirror of https://github.com/acidanthera/audk.git
286 lines
8.1 KiB
C
286 lines
8.1 KiB
C
|
/** @file
|
||
|
"Terminal" Control functions for Interactive IO.
|
||
|
|
||
|
Copyright (c) 2012, 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 that accompanies this distribution.
|
||
|
The full text of the license may be found at
|
||
|
http://opensource.org/licenses/bsd-license.
|
||
|
|
||
|
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 <Uefi.h>
|
||
|
#include <Library/BaseMemoryLib.h>
|
||
|
|
||
|
#include <LibConfig.h>
|
||
|
|
||
|
#include <errno.h>
|
||
|
#include <sys/termios.h>
|
||
|
#include <Device/IIO.h>
|
||
|
#include <MainData.h>
|
||
|
|
||
|
/** Get input baud rate.
|
||
|
|
||
|
Extracts the input baud rate from the termios structure pointed to by the
|
||
|
pTermios argument.
|
||
|
|
||
|
@param[in] pTermios A pointer to the termios structure from which to extract
|
||
|
the input baud rate.
|
||
|
|
||
|
@return The value of the input speed is returned exactly as it is contained
|
||
|
in the termios structure, without interpretation.
|
||
|
**/
|
||
|
speed_t
|
||
|
cfgetispeed (
|
||
|
const struct termios *pTermios
|
||
|
)
|
||
|
{
|
||
|
return pTermios->c_ispeed;
|
||
|
}
|
||
|
|
||
|
/** Get output baud rate.
|
||
|
|
||
|
Extracts the output baud rate from the termios structure pointed to by the
|
||
|
pTermios argument.
|
||
|
|
||
|
@param[in] pTermios A pointer to the termios structure from which to extract
|
||
|
the output baud rate.
|
||
|
|
||
|
@return The value of the output speed is returned exactly as it is contained
|
||
|
in the termios structure, without interpretation.
|
||
|
**/
|
||
|
speed_t
|
||
|
cfgetospeed (
|
||
|
const struct termios *pTermios
|
||
|
)
|
||
|
{
|
||
|
return pTermios->c_ospeed;
|
||
|
}
|
||
|
|
||
|
/** Set input baud rate.
|
||
|
|
||
|
Replaces the input baud rate, in the termios structure pointed to by the
|
||
|
pTermios argument, with the value of NewSpeed.
|
||
|
|
||
|
@param[out] pTermios A pointer to the termios structure into which to set
|
||
|
the input baud rate.
|
||
|
@param[in] NewSpeed The new input baud rate.
|
||
|
|
||
|
@retval 0 The operation completed successfully.
|
||
|
@retval -1 An error occured and errno is set to indicate the error.
|
||
|
* EINVAL - The value of NewSpeed is outside the range of
|
||
|
possible speed values as specified in <sys/termios.h>.
|
||
|
**/
|
||
|
int
|
||
|
cfsetispeed (
|
||
|
struct termios *pTermios,
|
||
|
speed_t NewSpeed
|
||
|
)
|
||
|
{
|
||
|
int RetVal;
|
||
|
|
||
|
if(NewSpeed < B921600) {
|
||
|
pTermios->c_ispeed = NewSpeed;
|
||
|
RetVal = 0;
|
||
|
}
|
||
|
else {
|
||
|
RetVal = -1;
|
||
|
errno = EINVAL;
|
||
|
}
|
||
|
return RetVal;
|
||
|
}
|
||
|
|
||
|
/** Set output baud rate.
|
||
|
|
||
|
Replaces the output baud rate, in the termios structure pointed to by the
|
||
|
pTermios argument, with the value of NewSpeed.
|
||
|
|
||
|
@param[out] pTermios A pointer to the termios structure into which to set
|
||
|
the output baud rate.
|
||
|
@param[in] NewSpeed The new output baud rate.
|
||
|
|
||
|
@retval 0 The operation completed successfully.
|
||
|
@retval -1 An error occured and errno is set to indicate the error.
|
||
|
* EINVAL - The value of NewSpeed is outside the range of
|
||
|
possible speed values as specified in <sys/termios.h>.
|
||
|
**/
|
||
|
int
|
||
|
cfsetospeed (
|
||
|
struct termios *pTermios,
|
||
|
speed_t NewSpeed
|
||
|
)
|
||
|
{
|
||
|
int RetVal;
|
||
|
|
||
|
if(NewSpeed < B921600) {
|
||
|
pTermios->c_ospeed = NewSpeed;
|
||
|
RetVal = 0;
|
||
|
}
|
||
|
else {
|
||
|
RetVal = -1;
|
||
|
errno = EINVAL;
|
||
|
}
|
||
|
return RetVal;
|
||
|
}
|
||
|
|
||
|
/** Get the parameters associated with an interactive IO device.
|
||
|
|
||
|
Get the parameters associated with the device referred to by
|
||
|
fd and store them into the termios structure referenced by pTermios.
|
||
|
|
||
|
@param[in] fd The file descriptor for an open interactive IO device.
|
||
|
@param[out] pTermios A pointer to a termios structure into which to store
|
||
|
attributes of the interactive IO device.
|
||
|
|
||
|
@retval 0 The operation completed successfully.
|
||
|
@retval -1 An error occured and errno is set to indicate the error.
|
||
|
* EBADF - The fd argument is not a valid file descriptor.
|
||
|
* ENOTTY - The file associated with fd is not an interactive IO device.
|
||
|
**/
|
||
|
int
|
||
|
tcgetattr (
|
||
|
int fd,
|
||
|
struct termios *pTermios
|
||
|
)
|
||
|
{
|
||
|
cIIO *IIO;
|
||
|
int RetVal;
|
||
|
struct __filedes *filp;
|
||
|
struct termios *Termio;
|
||
|
|
||
|
RetVal = 0;
|
||
|
if(ValidateFD( fd, VALID_OPEN)) {
|
||
|
filp = &gMD->fdarray[fd];
|
||
|
|
||
|
if((filp->f_iflags & _S_ITTY) != 0) {
|
||
|
// fd is for a TTY or "Interactive IO" device
|
||
|
IIO = (cIIO *)filp->devdata;
|
||
|
Termio = &IIO->Termio;
|
||
|
(void)CopyMem((void *)pTermios, (const void *)Termio, sizeof(struct termios));
|
||
|
}
|
||
|
else {
|
||
|
errno = ENOTTY;
|
||
|
RetVal = -1;
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
errno = EBADF;
|
||
|
RetVal = -1;
|
||
|
}
|
||
|
return RetVal;
|
||
|
}
|
||
|
|
||
|
/** Set the parameters associated with an interactive IO device.
|
||
|
|
||
|
Set the parameters associated with the device referred to by
|
||
|
fd to the values in the termios structure referenced by pTermios.
|
||
|
|
||
|
Behavior is modified by the value of the OptAct parameter:
|
||
|
* TCSANOW: The change shall occur immediately.
|
||
|
* TCSADRAIN: The change shall occur after all output written to fd is
|
||
|
transmitted. This action should be used when changing parameters which
|
||
|
affect output.
|
||
|
* TCSAFLUSH: The change shall occur after all output written to fd is
|
||
|
transmitted, and all input so far received but not read shall be
|
||
|
discarded before the change is made.
|
||
|
|
||
|
@param[in] fd The file descriptor for an open interactive IO device.
|
||
|
@param[in] OptAct Currently has no effect.
|
||
|
@param[in] pTermios A pointer to a termios structure into which to retrieve
|
||
|
attributes to set in the interactive IO device.
|
||
|
|
||
|
@retval 0 The operation completed successfully.
|
||
|
@retval -1 An error occured and errno is set to indicate the error.
|
||
|
* EBADF - The fd argument is not a valid file descriptor.
|
||
|
* ENOTTY - The file associated with fd is not an interactive IO device.
|
||
|
**/
|
||
|
int
|
||
|
tcsetattr (
|
||
|
int fd,
|
||
|
int OptAct, // Currently ignored
|
||
|
const struct termios *pTermios
|
||
|
)
|
||
|
{
|
||
|
cIIO *IIO;
|
||
|
int RetVal;
|
||
|
struct __filedes *filp;
|
||
|
struct termios *Termio;
|
||
|
|
||
|
RetVal = 0;
|
||
|
if(ValidateFD( fd, VALID_OPEN)) {
|
||
|
filp = &gMD->fdarray[fd];
|
||
|
|
||
|
if((filp->f_iflags & _S_ITTY) != 0) {
|
||
|
// fd is for a TTY or "Interactive IO" device
|
||
|
IIO = (cIIO *)filp->devdata;
|
||
|
Termio = &IIO->Termio;
|
||
|
(void)CopyMem((void *)Termio, (const void *)pTermios, sizeof(struct termios));
|
||
|
}
|
||
|
else {
|
||
|
errno = ENOTTY;
|
||
|
RetVal = -1;
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
errno = EBADF;
|
||
|
RetVal = -1;
|
||
|
}
|
||
|
return RetVal;
|
||
|
}
|
||
|
|
||
|
/** Transmit pending output.
|
||
|
|
||
|
Function is not yet implemented for UEFI.
|
||
|
|
||
|
@param[in] fd Ignored
|
||
|
|
||
|
@retval -1 This function is not yet supported. errno is set to ENOTSUP.
|
||
|
**/
|
||
|
int
|
||
|
tcdrain (int fd)
|
||
|
{
|
||
|
errno = ENOTSUP;
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
/** Suspend or restart the transmission or reception of data.
|
||
|
|
||
|
This function will suspend or resume transmission or reception of data on
|
||
|
the file referred to by fd, depending on the value of Action.
|
||
|
|
||
|
Function is not yet implemented for UEFI.
|
||
|
|
||
|
@param[in] fd Ignored
|
||
|
@param[in] Action Ignored
|
||
|
|
||
|
@retval -1 This function is not yet supported. errno is set to ENOTSUP.
|
||
|
**/
|
||
|
int
|
||
|
tcflow (
|
||
|
int fd,
|
||
|
int Action)
|
||
|
{
|
||
|
errno = ENOTSUP;
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
/** Discard non-transmitted output data, non-read input data, or both.
|
||
|
|
||
|
Function is not yet implemented for UEFI.
|
||
|
|
||
|
@param[in] fd Ignored
|
||
|
@param[in] QueueSelector Ignored
|
||
|
|
||
|
@retval -1 This function is not yet supported. errno is set to ENOTSUP.
|
||
|
**/
|
||
|
int
|
||
|
tcflush (
|
||
|
int fd,
|
||
|
int QueueSelector)
|
||
|
{
|
||
|
errno = ENOTSUP;
|
||
|
return -1;
|
||
|
}
|
||
|
|