Home | History | Annotate | Download | only in InteractiveIO
      1 /** @file
      2     "Terminal" Control functions for Interactive IO.
      3 
      4     Copyright (c) 2012, Intel Corporation. All rights reserved.<BR>
      5     This program and the accompanying materials are licensed and made available under
      6     the terms and conditions of the BSD License that accompanies this distribution.
      7     The full text of the license may be found at
      8     http://opensource.org/licenses/bsd-license.
      9 
     10     THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11     WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 **/
     13 #include  <Uefi.h>
     14 #include  <Library/BaseMemoryLib.h>
     15 
     16 #include  <LibConfig.h>
     17 
     18 #include  <errno.h>
     19 #include  <sys/termios.h>
     20 #include  <Device/IIO.h>
     21 #include  <MainData.h>
     22 
     23 /** Get input baud rate.
     24 
     25     Extracts the input baud rate from the termios structure pointed to by the
     26     pTermios argument.
     27 
     28     @param[in]  pTermios  A pointer to the termios structure from which to extract
     29                           the input baud rate.
     30 
     31     @return The value of the input speed is returned exactly as it is contained
     32             in the termios structure, without interpretation.
     33 **/
     34 speed_t
     35 cfgetispeed (
     36   const struct termios *pTermios
     37   )
     38 {
     39   return pTermios->c_ispeed;
     40 }
     41 
     42 /** Get output baud rate.
     43 
     44     Extracts the output baud rate from the termios structure pointed to by the
     45     pTermios argument.
     46 
     47     @param[in]  pTermios  A pointer to the termios structure from which to extract
     48                           the output baud rate.
     49 
     50     @return The value of the output speed is returned exactly as it is contained
     51             in the termios structure, without interpretation.
     52 **/
     53 speed_t
     54 cfgetospeed (
     55   const struct termios *pTermios
     56   )
     57 {
     58   return pTermios->c_ospeed;
     59 }
     60 
     61 /** Set input baud rate.
     62 
     63     Replaces the input baud rate, in the termios structure pointed to by the
     64     pTermios argument, with the value of NewSpeed.
     65 
     66     @param[out]   pTermios  A pointer to the termios structure into which to set
     67                             the input baud rate.
     68     @param[in]    NewSpeed  The new input baud rate.
     69 
     70     @retval 0     The operation completed successfully.
     71     @retval -1    An error occured and errno is set to indicate the error.
     72                     * EINVAL - The value of NewSpeed is outside the range of
     73                       possible speed values as specified in <sys/termios.h>.
     74 **/
     75 int
     76 cfsetispeed (
     77   struct termios *pTermios,
     78   speed_t         NewSpeed
     79   )
     80 {
     81   int RetVal;
     82 
     83   if(NewSpeed < B921600) {
     84     pTermios->c_ispeed = NewSpeed;
     85     RetVal = 0;
     86   }
     87   else {
     88     RetVal = -1;
     89     errno = EINVAL;
     90   }
     91   return RetVal;
     92 }
     93 
     94 /** Set output baud rate.
     95 
     96     Replaces the output baud rate, in the termios structure pointed to by the
     97     pTermios argument, with the value of NewSpeed.
     98 
     99     @param[out]   pTermios  A pointer to the termios structure into which to set
    100                             the output baud rate.
    101     @param[in]    NewSpeed  The new output baud rate.
    102 
    103     @retval 0     The operation completed successfully.
    104     @retval -1    An error occured and errno is set to indicate the error.
    105                     * EINVAL - The value of NewSpeed is outside the range of
    106                       possible speed values as specified in <sys/termios.h>.
    107 **/
    108 int
    109 cfsetospeed (
    110   struct termios *pTermios,
    111   speed_t         NewSpeed
    112   )
    113 {
    114   int RetVal;
    115 
    116   if(NewSpeed < B921600) {
    117     pTermios->c_ospeed = NewSpeed;
    118     RetVal = 0;
    119   }
    120   else {
    121     RetVal = -1;
    122     errno = EINVAL;
    123   }
    124   return RetVal;
    125 }
    126 
    127 /** Get the parameters associated with an interactive IO device.
    128 
    129     Get the parameters associated with the device referred to by
    130     fd and store them into the termios structure referenced by pTermios.
    131 
    132     @param[in]    fd        The file descriptor for an open interactive IO device.
    133     @param[out]   pTermios  A pointer to a termios structure into which to store
    134                             attributes of the interactive IO device.
    135 
    136     @retval 0     The operation completed successfully.
    137     @retval -1    An error occured and errno is set to indicate the error.
    138                     * EBADF - The fd argument is not a valid file descriptor.
    139                     * ENOTTY - The file associated with fd is not an interactive IO device.
    140 **/
    141 int
    142 tcgetattr (
    143   int             fd,
    144   struct termios *pTermios
    145   )
    146 {
    147   cIIO             *IIO;
    148   int               RetVal;
    149   struct __filedes *filp;
    150   struct termios   *Termio;
    151 
    152   RetVal = 0;
    153   if(ValidateFD( fd, VALID_OPEN)) {
    154     filp = &gMD->fdarray[fd];
    155 
    156     if((filp->f_iflags & _S_ITTY) != 0) {
    157       // fd is for a TTY or "Interactive IO" device
    158       IIO = (cIIO *)filp->devdata;
    159       Termio = &IIO->Termio;
    160       (void)CopyMem((void *)pTermios, (const void *)Termio, sizeof(struct termios));
    161     }
    162     else {
    163       errno   = ENOTTY;
    164       RetVal  = -1;
    165     }
    166   }
    167   else {
    168     errno   = EBADF;
    169     RetVal  = -1;
    170   }
    171   return RetVal;
    172 }
    173 
    174 /** Set the parameters associated with an interactive IO device.
    175 
    176     Set the parameters associated with the device referred to by
    177     fd to the values in the termios structure referenced by pTermios.
    178 
    179     Behavior is modified by the value of the OptAct parameter:
    180       * TCSANOW: The change shall occur immediately.
    181       * TCSADRAIN: The change shall occur after all output written to fd is
    182         transmitted. This action should be used when changing parameters which
    183         affect output.
    184       * TCSAFLUSH: The change shall occur after all output written to fd is
    185         transmitted, and all input so far received but not read shall be
    186         discarded before the change is made.
    187 
    188     @param[in]  fd        The file descriptor for an open interactive IO device.
    189     @param[in]  OptAct    Currently has no effect.
    190     @param[in]  pTermios  A pointer to a termios structure into which to retrieve
    191                           attributes to set in the interactive IO device.
    192 
    193     @retval 0     The operation completed successfully.
    194     @retval -1    An error occured and errno is set to indicate the error.
    195                     * EBADF - The fd argument is not a valid file descriptor.
    196                     * ENOTTY - The file associated with fd is not an interactive IO device.
    197 **/
    198 int
    199 tcsetattr (
    200   int                   fd,
    201   int                   OptAct,   // Currently ignored
    202   const struct termios *pTermios
    203   )
    204 {
    205   cIIO             *IIO;
    206   int               RetVal;
    207   struct __filedes *filp;
    208   struct termios   *Termio;
    209 
    210   RetVal = 0;
    211   if(ValidateFD( fd, VALID_OPEN)) {
    212     filp = &gMD->fdarray[fd];
    213 
    214     if((filp->f_iflags & _S_ITTY) != 0) {
    215       // fd is for a TTY or "Interactive IO" device
    216       IIO = (cIIO *)filp->devdata;
    217       Termio = &IIO->Termio;
    218       (void)CopyMem((void *)Termio, (const void *)pTermios, sizeof(struct termios));
    219     }
    220     else {
    221       errno   = ENOTTY;
    222       RetVal  = -1;
    223     }
    224   }
    225   else {
    226     errno   = EBADF;
    227     RetVal  = -1;
    228   }
    229   return RetVal;
    230 }
    231 
    232 /** Transmit pending output.
    233 
    234     Function is not yet implemented for UEFI.
    235 
    236     @param[in]  fd        Ignored
    237 
    238     @retval -1    This function is not yet supported.  errno is set to ENOTSUP.
    239 **/
    240 int
    241 tcdrain (int fd)
    242 {
    243   errno = ENOTSUP;
    244   return -1;
    245 }
    246 
    247 /** Suspend or restart the transmission or reception of data.
    248 
    249     This function will suspend or resume transmission or reception of data on
    250     the file referred to by fd, depending on the value of Action.
    251 
    252     Function is not yet implemented for UEFI.
    253 
    254     @param[in]  fd        Ignored
    255     @param[in]  Action    Ignored
    256 
    257     @retval -1    This function is not yet supported.  errno is set to ENOTSUP.
    258 **/
    259 int
    260 tcflow (
    261   int fd,
    262   int Action)
    263 {
    264   errno = ENOTSUP;
    265   return -1;
    266 }
    267 
    268 /** Discard non-transmitted output data, non-read input data, or both.
    269 
    270     Function is not yet implemented for UEFI.
    271 
    272     @param[in]  fd              Ignored
    273     @param[in]  QueueSelector   Ignored
    274 
    275     @retval -1    This function is not yet supported.  errno is set to ENOTSUP.
    276 **/
    277 int
    278 tcflush (
    279   int fd,
    280   int QueueSelector)
    281 {
    282   errno = ENOTSUP;
    283   return -1;
    284 }
    285 
    286