UEFI原理与编程实践--UEFI工程模块文件

标准应用程序工程模块

该模块是其他应用程序工程模块的基础,也是UEFI中常见的一种应用程序工程模块,标准应用程序工程模块,UefiMain就是这个模块的入口函数

EFI_STATUS
EFIAPI
UefiMain (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
  UINT32 Index;

  Index = 0;

  //
  // Three PCD type (FeatureFlag, UINT32 and String) are used as the sample.
  //
  if (FeaturePcdGet (PcdHelloWorldPrintEnable)) {
    for (Index = 0; Index < PcdGet32 (PcdHelloWorldPrintTimes); Index ++) {
      //
      // Use UefiLib Print API to print string to UEFI console
      //
      Print ((CHAR16*)PcdGetPtr (PcdHelloWorldPrintString));
    }
  }

  return EFI_SUCCESS;
}

 再来看一下.inf工程文件

[Defines]
  INF_VERSION                    = 0x00010005
  BASE_NAME                      = HelloWorld
  MODULE_UNI_FILE                = HelloWorld.uni
  FILE_GUID                      = 6987936E-ED34-44db-AE97-1FA5E4ED2116
  MODULE_TYPE                    = UEFI_APPLICATION
  VERSION_STRING                 = 1.0
  ENTRY_POINT                    = UefiMain

 ShellAppMain应用程序工程模块

这种应用程序能在shell中执行命令时输入指定参数,Argc是命令行参数个数,包括应用名字本身,第二个参数Argv是命令参数行列表,也就是说是第几个参数,先看一下主函数:

EFI_STATUS
EFIAPI
ShellAppMain (
  IN UINTN Argc,
  IN CHAR16 **Argv
  )
{
    EFI_STATUS      Status = EFI_SUCCESS ;
    UINTN	qUsbProvFileSize;
  //  UINT8                    Embedded_Checksum=0;
    UINTN                     FileSize;//CalSize;
  //  UINT32                    FileCheckum=0xFF;
	BYTE i;
        CHAR16 	   *gFileName=0;
	int FW_H,FW_L;
	int bram_base;
	//int	err=0;
	int FW_v[9];
	if(Argc<2) {
		clrscr();
  		vShowUsage();
		return EFI_SUCCESS;
	}
	if(Argc>1) {
		clrscr();
		//gotoxy(1,10);

	for(i=1;i<Argc;i++)
	{
		if((Argv[i][0]=='/') && (Argv[i][1]=='V')){
			FW_flag=1;	
			if(Argv[i][2]=='B') BRAM_flag=1;
		        else if(Argv[i][2]=='C')	Compal_flag=1;
			if(Argv[i][3]=='F')
			  {
			    FileVer_flag=1;
			    gFileName = Argv[i+1];
			    BIN_Ver_offset=Argv[i+2];
			}else{
                            if((i+1)<Argc) FW_CP=Argv[i+1];
			}
			break;
                    }else if((Argv[i][0]!='/')&&(Argv[i-1][1]!='O')&&(Argv[i-1][1]!='R')&&(Argv[i-1][1]!='V')){	
                         hasFile =1; ......

 上面的代码为EC更新工具中的一部分,看一下.inf工程文件:

  INF_VERSION                    = 0x00010005
  BASE_NAME                      = GwiEcFlash
  FILE_GUID                      = 05ECD32B-E737-47ee-A504-334A79064997
  MODULE_TYPE                    = UEFI_APPLICATION
  VERSION_STRING                 = 1.0
  ENTRY_POINT                    = EntryPoint

为啥是EntryPoint呢,因为ShellAppMain函数是再EntryPoint函数中运行的

EFI_STATUS
EFIAPI
EntryPoint (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
  EFI_SHELL_PARAMETERS_PROTOCOL *EfiShellParametersProtocol;
  EFI_SHELL_INTERFACE           *EfiShellInterface;
  CHAR16                        *Argv[] = {L"GwiEcFlash.efi",
                                           L"ec.bin"};
  EFI_STATUS                    Status;

  EfiShellParametersProtocol = NULL;
  EfiShellInterface = NULL;

  Status = SystemTable->BootServices->OpenProtocol(ImageHandle,
                             &gEfiShellParametersProtocolGuid,
                             (VOID **)&EfiShellParametersProtocol,
                             ImageHandle,
                             NULL,
                             EFI_OPEN_PROTOCOL_GET_PROTOCOL
                            );
  if (!EFI_ERROR(Status)) {
    //
    // use shell 2.0 interface
    //
    Status = ShellAppMain (
               EfiShellParametersProtocol->Argc,
               EfiShellParametersProtocol->Argv
               );
  } else {
    //
    // try to get shell 1.0 interface instead.
    //
    Status = SystemTable->BootServices->OpenProtocol(ImageHandle,
                               &gEfiShellInterfaceGuid,
                               (VOID **)&EfiShellInterface,
                               ImageHandle,
                               NULL,
                               EFI_OPEN_PROTOCOL_GET_PROTOCOL
                              );
    if (!EFI_ERROR(Status)) {
      //
      // use shell 1.0 interface
      //
      Status = ShellAppMain (
                 EfiShellInterface->Argc,
                 EfiShellInterface->Argv
                 );
    } else {
      // Update BIOS with fixed file name
      Status = ShellAppMain (2, Argv);
    }
  }

所以每一个ShellAppMain应用程序工程必须还包含一个UefiShellCEntryLib.c文件

main应用程序工程模块

 这个应用程序工程模块和shellappmain应用程序工程模块类似,不过不包含UefiShellCEntryLib.c

int
EFIAPI
main (
  IN int argc,
  IN char **argv
  )
{
	UINTN	qUsbProvFileSize;
	FILE *fi;
	BYTE i;

	int FW_H,FW_L;
	int bram_base;
......

[Defines]
  INF_VERSION                    = 0x00010006
  BASE_NAME                      = GwiEcFlash
  FILE_GUID                      = 05ECD32B-E737-47ee-A504-334A79064997
  MODULE_TYPE                    = UEFI_APPLICATION
  VERSION_STRING                 = 1.0
  ENTRY_POINT                    = ShellCEntryLib

符合UEFI驱动模型的驱动

所有符合UEFI驱动模型的驱动,都要遵循EFI_DRIVER_BINDING_PROTOCOL,比如一些GOP的driver

EFI_DRIVER_BINDING_PROTOCOL gSmi768DriverBinding = {
  Smi768ControllerDriverSupported,
  Smi768ControllerDriverStart,
  Smi768ControllerDriverStop,
  0x10,
  NULL,
  NULL
};

DXE驱动模块

DXE环境下运行的驱动,此类驱动不遵循UEFI驱动模型

Guess you like

Origin blog.csdn.net/u011397314/article/details/121497535