Home | History | Annotate | Line # | Download | only in apps
      1  1.1  jmcneill /*	$NetBSD: drv0_use.c,v 1.1.1.1 2018/08/16 18:17:47 jmcneill Exp $	*/
      2  1.1  jmcneill 
      3  1.1  jmcneill /*
      4  1.1  jmcneill  * Copyright (C) 2013 David Decotigny <decot (at) googlers.com>
      5  1.1  jmcneill  *
      6  1.1  jmcneill  * See drv0.c for an example session.
      7  1.1  jmcneill  */
      8  1.1  jmcneill 
      9  1.1  jmcneill #include <efi.h>
     10  1.1  jmcneill #include <efilib.h>
     11  1.1  jmcneill #include "drv0.h"
     12  1.1  jmcneill 
     13  1.1  jmcneill 
     14  1.1  jmcneill static EFI_GUID GnuEfiAppsDrv0ProtocolGuid
     15  1.1  jmcneill   = GNU_EFI_APPS_DRV0_PROTOCOL_GUID;
     16  1.1  jmcneill 
     17  1.1  jmcneill 
     18  1.1  jmcneill static
     19  1.1  jmcneill EFI_STATUS
     20  1.1  jmcneill PlayWithGnuEfiAppsDrv0Protocol(IN EFI_HANDLE DrvHandle) {
     21  1.1  jmcneill   EFI_STATUS Status;
     22  1.1  jmcneill   GNU_EFI_APPS_DRV0_PROTOCOL *drv = NULL;
     23  1.1  jmcneill   UINTN NumberOfHello = 0;
     24  1.1  jmcneill 
     25  1.1  jmcneill   Status = uefi_call_wrapper(BS->OpenProtocol, 6,
     26  1.1  jmcneill                              DrvHandle,
     27  1.1  jmcneill                              &GnuEfiAppsDrv0ProtocolGuid,
     28  1.1  jmcneill                              (void**)&drv,
     29  1.1  jmcneill                              DrvHandle,
     30  1.1  jmcneill                              NULL,
     31  1.1  jmcneill                              EFI_OPEN_PROTOCOL_GET_PROTOCOL);
     32  1.1  jmcneill   if (EFI_ERROR(Status)) {
     33  1.1  jmcneill     Print(L"Cannot open proto: %d\n", Status);
     34  1.1  jmcneill     return Status;
     35  1.1  jmcneill   }
     36  1.1  jmcneill 
     37  1.1  jmcneill   Status = uefi_call_wrapper(drv->SayHello, 2, L"Sample UEFI Driver");
     38  1.1  jmcneill   if (EFI_ERROR(Status)) {
     39  1.1  jmcneill     Print(L"Cannot call SayHello: %d\n", Status);
     40  1.1  jmcneill   }
     41  1.1  jmcneill 
     42  1.1  jmcneill   Status = uefi_call_wrapper(drv->GetNumberOfHello, 2, &NumberOfHello);
     43  1.1  jmcneill   if (EFI_ERROR(Status)) {
     44  1.1  jmcneill     Print(L"Cannot call GetNumberOfHello: %d\n", Status);
     45  1.1  jmcneill   } else {
     46  1.1  jmcneill     Print(L"Hello was called %d time(s).\n", NumberOfHello);
     47  1.1  jmcneill   }
     48  1.1  jmcneill 
     49  1.1  jmcneill   return EFI_SUCCESS;
     50  1.1  jmcneill }
     51  1.1  jmcneill 
     52  1.1  jmcneill 
     53  1.1  jmcneill EFI_STATUS
     54  1.1  jmcneill efi_main (EFI_HANDLE Image, EFI_SYSTEM_TABLE *SysTab)
     55  1.1  jmcneill {
     56  1.1  jmcneill   EFI_STATUS Status;
     57  1.1  jmcneill   EFI_HANDLE *Handles = NULL;
     58  1.1  jmcneill   UINTN i, NoHandles = 0;
     59  1.1  jmcneill 
     60  1.1  jmcneill   InitializeLib(Image, SysTab);
     61  1.1  jmcneill 
     62  1.1  jmcneill   Status = LibLocateHandle(ByProtocol, &GnuEfiAppsDrv0ProtocolGuid,
     63  1.1  jmcneill                            NULL, &NoHandles, &Handles);
     64  1.1  jmcneill   if (EFI_ERROR(Status)) {
     65  1.1  jmcneill     Print(L"Error looking up handles for proto: %d\n", Status);
     66  1.1  jmcneill     return Status;
     67  1.1  jmcneill   }
     68  1.1  jmcneill 
     69  1.1  jmcneill   for (i = 0 ; i < NoHandles ; ++i)
     70  1.1  jmcneill   {
     71  1.1  jmcneill     Print(L"Playing with driver instance %d...\n", i);
     72  1.1  jmcneill     Status = PlayWithGnuEfiAppsDrv0Protocol(Handles[i]);
     73  1.1  jmcneill     if (EFI_ERROR(Status))
     74  1.1  jmcneill       Print(L"Error playing with instance %d, skipping\n", i);
     75  1.1  jmcneill   }
     76  1.1  jmcneill 
     77  1.1  jmcneill   if (Handles)
     78  1.1  jmcneill     FreePool(Handles);
     79  1.1  jmcneill 
     80  1.1  jmcneill   return EFI_SUCCESS;
     81  1.1  jmcneill }
     82