mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-10-31 06:39:42 +00:00 
			
		
		
		
	 6c6c850ad6
			
		
	
	
		6c6c850ad6
		
	
	
	
	
		
			
			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
		
	
			
		
			
				
	
	
		
			159 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|     Device Abstraction: device creation utility functions.
 | |
| 
 | |
|     Copyright (c) 2011 - 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.php.
 | |
| 
 | |
|     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/BaseLib.h>
 | |
| #include  <Library/MemoryAllocationLib.h>
 | |
| 
 | |
| #include  <LibConfig.h>
 | |
| 
 | |
| #include  <errno.h>
 | |
| #include  <stdarg.h>
 | |
| #include  <sys/poll.h>
 | |
| #include  <kfile.h>
 | |
| #include  <Device/Device.h>
 | |
| #include  <MainData.h>
 | |
| 
 | |
| LIST_ENTRY    daDeviceList    = INITIALIZE_LIST_HEAD_VARIABLE(daDeviceList);
 | |
| DeviceNode   *daDefaultDevice = NULL;     ///< Device to use if nothing else found
 | |
| DeviceNode   *daRootDevice    = NULL;     ///< Device containing the root file system
 | |
| DeviceNode   *daCurrentDevice = NULL;     ///< Device currently being accessed
 | |
| 
 | |
| /* Commonly used fileops
 | |
|       fnullop_*   Does nothing and returns success.
 | |
|       fbadop_*    Does nothing and returns EPERM
 | |
| */
 | |
| int     EFIAPI fnullop_fcntl (struct __filedes *filp, UINT32 Cmd, void *p3, void *p4)
 | |
| { return 0; }
 | |
| 
 | |
| short  EFIAPI fnullop_poll  (struct __filedes *filp, short Events)
 | |
| {
 | |
|   return ((POLLIN | POLLRDNORM | POLLOUT) & Events);
 | |
| }
 | |
| 
 | |
| int     EFIAPI fnullop_flush (struct __filedes *filp)
 | |
| { return 0; }
 | |
| 
 | |
| int     EFIAPI fbadop_stat   (struct __filedes *filp, struct stat *StatBuf, void *Buf)
 | |
| {
 | |
|   errno = EPERM;
 | |
|   return -1;
 | |
| }
 | |
| 
 | |
| int     EFIAPI fbadop_ioctl  (struct __filedes *filp, ULONGN Cmd, va_list argp)
 | |
| {
 | |
|   errno = EPERM;
 | |
|   return -1;
 | |
| }
 | |
| 
 | |
| int     EFIAPI fbadop_delete (struct __filedes *filp)
 | |
| {
 | |
|   errno = EPERM;
 | |
|   return -1;
 | |
| }
 | |
| 
 | |
| int     EFIAPI fbadop_mkdir  (const char *path, __mode_t perms)
 | |
| {
 | |
|   errno = EPERM;
 | |
|   return -1;
 | |
| }
 | |
| 
 | |
| int     EFIAPI fbadop_rename   (const char *from, const char *to)
 | |
| {
 | |
|   errno = EPERM;
 | |
|   return -1;
 | |
| }
 | |
| 
 | |
| int     EFIAPI fbadop_rmdir    (struct __filedes *filp)
 | |
| {
 | |
|   errno = EPERM;
 | |
|   return -1;
 | |
| }
 | |
| 
 | |
| /** Add a new device to the device list.
 | |
|     If both DevName and DevProto are NULL, register this as the Default device.
 | |
| 
 | |
|     @param  DevName       Name of the device to add.
 | |
|     @param  DevProto      Pointer to the GUID identifying the protocol associated with this device.
 | |
|                           If DevProto is NULL, startup code will not try to find instances
 | |
|                           of this device.
 | |
|     @param  OpenFunc      Pointer to the device's Open function.
 | |
|     @param  InstanceList  Optional pointer to the device's initialized instance list.
 | |
|                           If InstanceList is NULL, the application startup code will
 | |
|                           scan for instances of the protocol identified by DevProto and
 | |
|                           populate the InstanceList in the order those protocols are found.
 | |
|     @param  NumInstance   Number of instances in InstanceList.
 | |
|     @param  Modes         Bit-mapped flags indicating operations (R, W, RW, ...) permitted to this device.
 | |
| 
 | |
| **/
 | |
| DeviceNode *
 | |
| EFIAPI
 | |
| __DevRegister(
 | |
|   IN const CHAR16          *DevName,
 | |
|   IN GUID                  *DevProto,
 | |
|   IN FO_OPEN                OpenFunc,
 | |
|   IN void                  *InstanceList,
 | |
|   IN int                    NumInstance,
 | |
|   IN UINT32                 InstanceSize,
 | |
|   IN UINT32                 Modes
 | |
|   )
 | |
| {
 | |
|   DeviceNode         *Node;
 | |
|   GenericInstance    *GIp;
 | |
|   char               *GenPtr;
 | |
|   int                 i;
 | |
| 
 | |
|   /* Validate parameters */
 | |
|   if(((DevName == NULL) && (DevProto != NULL)) ||
 | |
|       (OpenFunc == NULL)) {
 | |
|     EFIerrno = RETURN_INVALID_PARAMETER;
 | |
|     return NULL;
 | |
|   }
 | |
|   Node = (DeviceNode *)AllocateZeroPool(sizeof(DeviceNode));
 | |
|   if(Node == NULL) {
 | |
|     EFIerrno = RETURN_OUT_OF_RESOURCES;
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   Node->DevName       = DevName;
 | |
|   Node->DevProto      = DevProto;
 | |
|   Node->InstanceList  = InstanceList;
 | |
|   Node->OpenFunc      = OpenFunc;
 | |
|   Node->InstanceSize  = InstanceSize;
 | |
|   Node->NumInstances  = NumInstance;
 | |
|   Node->OpModes       = Modes;
 | |
| 
 | |
|   /* Update the Parent member of each element of the InstanceList */
 | |
|   if(InstanceList != NULL) {
 | |
|     GenPtr = InstanceList;
 | |
| 
 | |
|     for(i = 0; i < NumInstance; ++i) {    // Iterate through each element of InstanceList
 | |
|       GIp = (GenericInstance *)GenPtr;
 | |
|       GIp->Parent = Node;                     // Initializing the Parent member & InstanceNum
 | |
|       //GIp->InstanceNum = i;
 | |
|       GenPtr += InstanceSize;
 | |
|     }
 | |
|   }
 | |
|   if(DevName == NULL) {
 | |
|     if(daDefaultDevice != NULL) {
 | |
|       EFIerrno = RETURN_INVALID_PARAMETER;
 | |
|       return NULL;
 | |
|     }
 | |
|     daDefaultDevice = Node;
 | |
|   }
 | |
|   else {
 | |
|     (void) InsertTailList(&daDeviceList, &Node->DevList);
 | |
|   }
 | |
|   EFIerrno = RETURN_SUCCESS;
 | |
|   return Node;
 | |
| }
 |