Adds a subset of the terminal I/O capabilities described in the Single Unix Specification, V4.
Supports:
    Erase previous character.  Default is Backspace or ^H
    Erase line.  Default is ^U
TAB characters are supported and, by default, are rendered as 8 spaces.  They will still be read as a single TAB character.
Both Canonical and Non-Canonical modes are supported.
If a terminal device is opened with O_TTY_INIT in the mode, the device will be initialized to "sane" values for interactive use.  It will be in Canonical mode, Enter will be translated to NewLine and on output, a NewLine is translated to CRLF.  Echoing will be on, control characters are output as ^X, and TABs are expanded.
See the new <sys/termios.h> file for more information.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by:  daryl.mcdaniel@intel.com
Reviewed-by:    erik.c.bjorge@intel.com
Reviewed-by:    leroy.p.leahy@intel.com
Reviewed-by:    lee.g.rosenbaum@intel.com
Reviewed-by:    jaben.carsey@intel.com
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13989 6f19259b-4bc3-4df7-8a09-765794883524
		
	
		
			
				
	
	
		
			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;
 | 
						|
}
 | 
						|
 |