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;
 | |
| }
 | |
| 
 |