/** @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; | |
} | |