30.2 Create EDK II Package

The first step is to make sure there is an EDK II package available to which a new UEFI Driver can be added. If an EDK II package has already been created for UEFI Driver work, then this step may be skipped. Otherwise the following steps are required:

  • Create a new directory that is a peer to MdePkg (e.g. MyDriverPkg).

  • Create a subdirectory called Include (e.g. MyDriverPkg/Include).

  • Create a subdirectory of Include called Protocol (e.g. MyDriverPkg/Include/Protocol).

  • Create a subdirectory of Include called Guid (e.g. MyDriverPkg/Include/Guid).

  • Create a subdirectory of Include called Library (e.g. MyDriverPkg/Include/Library).

  • Add DEC file to the new package directory (e.g. MyDriverPkg/MyDriverPkg.dec).

  • Add DSC file to the new package directory (e.g. MyDriverPkg/MyDriverPkg.dsc).

The following example shows an example directory structure for an EDK II WORKSPACE after creating the new package called MyDriverPkg following the steps listed above. The Include subdirectory is a place holder in case new Protocols, GUIDs, or Library Classes are required to support new UEFI Driver implementations.

Example 255-EDK II Package Directory
BaseTools/ Conf/
MdePkg/
MdeModulePkg/
OptionRomPkg/ MyDriverPkg/
MyDriverPkg.dec
MyDriverPkf.dsc Include/
Protocol/ Guid/
Library/

The following example shows an example DEC file MyDriverPkg/MyDriverPkg.dec. Every new DEC file must have a unique GUID value and name.

Example 256-EDK II Package DEC File
[Defines]
  DEC_SPECIFICATION = 0x00010005
  PACKAGE_NAME      = MyDriverPkg
  PACKAGE_GUID      = E972EFA5-75CC-4ade-A719-60DD9AE5217B
  PACKAGE_VERSION   = 0.10

[Includes] Include

The example below shows an example DSC file MyDriverPkg/MyDriverPkg.dsc. Every new DSC must have a unique PLATFORM_GUID value, PLATFORM_NAME and OUTPUT_DIRCTORY path. This DSC file example also contains the library mapping required to build a UEFI conformant UEFI Driver. Many other library mappings are possible with the content from the EDK II project, but many of this mappings use services that are not defined by the UEFI Specification, so the use of alternate mapping may produce a UEFI Driver that runs correctly on some platforms but not others.

Example 257-EDK II Package DSC File
[Defines]
  PLATFORM_NAME           = MyDriverPkg
  PLATFORM_GUID           = 7C297DD4-65D9-4dfe-B609-94330E607888
  PLATFORM_VERSION        = 0.10
  DSC_SPECIFICATION       = 0x00010005
  OUTPUT_DIRECTORY        = Build/MyDriverPkg
  SUPPORTED_ARCHITECTURES = IA32|IPF|X64|EBC|ARM
  BUILD_TARGETS           = DEBUG|RELEASE
  SKUID_IDENTIFIER        = DEFAULT

[LibraryClasses]
  UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf
  UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
  UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf
  UefiLib|MdePkg/Library/UefiLib/UefiLib.inf
  UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf
  UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf
  MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
  DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf
  UefiUsbLib|MdePkg/Library/UefiUsbLib/UefiUsbLib.inf
  UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf
  BaseLib|MdePkg/Library/BaseLib/BaseLib.inf
  BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
  SynchronizationLib|MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf
  PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
  DebugLib|MdePkg/Library/UefiDebugLibStdErr/UefiDebugLibStdErr.inf
  DebugPrintErrorLevelLib|MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.inf
  PostCodeLib|MdePkg/Library/BasePostCodeLibPort80/BasePostCodeLibPort80.inf
  PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf